golang入门笔记—结构体
//type后面跟的是类型
type myInt int //自定义类型,%T输出为main.myInt
type yourInt=int//类型别名,只是在代码编写过程中起作用
var n myInt
n=100//结构体的定义
//type 类型名 struct{//字段名 字段类型
//字段名 字段类型
//……
//}
//结构体占用一块连续的内存空间
type person struct{name string
age int
hobby []string
gender string
}
var p person {//var p=new(person)
p.name="周林"
p.age=9000
p.gender="男"
p.hobby= []string{"篮球","足球","双色球"},
}
p2:=person{"小王子",
"男",
}//var p2=perseon{}
//匿名结构体(多用于一些临时场景)
var s struct{name string
age int
}
s.x="嘿嘿嘿"
s.y=100//构造函数初始化结构体
type person struct{name string,
age int
}//如果结构体占内存比较大,可以让函数返回结构体地址来节省内存
//约定俗成构造函数以new开头命名
func newPerson(name string,age int)person{return person{name:name,
age:age,
}
}func main(){p1:=newPerson("元帅",18)
p2:=newPerson("周林",9000)
fmt.Println(p1,p2)
}package dog
import "fmt"
//标识符:变量名 函数名 类型名 方法名
//Go语言中如果标识符首字母是大写的,就表示对外部可见(暴露的,公有的)//方法和接收者
//func (接收者变量 接收者类型)方法名(参数列表)(返回参数)
//只能给自己定义的类型添加方法
//不能给别的包里面的类型添加方法,只能给自己包里的类型添加方法
type dog struct{name string
}
func newDog(name string)dog{return dog{name:name,
}
}
func (d dog)wang(){fmt.Printf("%s汪汪汪\n",d.name)
}
//方法是作用于特定类型的函数,只能被dog调用
//接受者表示的是调用方法的具体类型变量,多用类型名首字母小写表示
func main(){d1:=newDog("zhoulin")
d1.wang()
}type myInt int
func(m myInt)hello(){fmt.Println("我是一个int")
}
func main(){m:=myInt(100) //var m myInt=100
m.hello()
}//匿名字段
type person struct{stringint
}func main(){var a = struct{x inty int}(10,20)p1:=person{"周林",90000,}fmt.Println(p1.string) //打印周林
}//嵌套结构体
type address struct{province stringcity string
}
type person struct{name stringage intaddr address
}
type company struct{name stringaddr address
}
func main(){p1:=person{name:"周林",age:9000,addr:address{province:"山东",city:"威海",},}fmt.Println(p1.addr.city)//周林居住的城市
}//匿名嵌套结构体
type person struct{name stringage intaddress
}
func main(){p1:=person{name:"周林",age:9000,address:address{province:"山东",city:"威海",},}fmt.Println(p1)fmt.Println(p1.name,p1.address.city)fmt.Println(p1,city)//先在自己结构体找到这个字段,找不到再去匿名结构体中查找//此外,嵌套结构体外层可以使用内层的方法
}//结构体与JSON
//1.序列化:把Go语言中的结构体变量-->json格式的字符串
//2.反序列化:json格式的字符串-->Go语言中能够识别的结构体变量
//json文件是前端能够识别和使用的数据
import "encoding/json"
type person struct {Name string `json:"name"` //json模式下用name解析Age int `json:"age"`
} //变量首字母必须大写,不然json拿不到
func main() {p1 := person{Name: "周林",Age: 9000,}//序列化b, err := json.Marshal(p1) //将结构体转换为jsonif err != nil {fmt.Printf("marshal failed,err:%v", err)return}fmt.Println(string(b))//反序列化str := `{"name":"理想","age":18}`var p2 personjson.Unmarshal([]byte(str), &p2) //传指针是为了能在函数内部修改p2的值fmt.Printf("%v\n", p2)
}
//结构体的继承
//Animal 动物
type Animal struct {name string
}func (a *Animal) move() {fmt.Printf("%s会动!\n", a.name)
}//Dog 狗
type Dog struct {Feet int8*Animal //通过嵌套匿名结构体实现继承
}func (d *Dog) wang() {fmt.Printf("%s会汪汪汪~\n", d.name)
}func main() {d1 := &Dog{Feet: 4,Animal: &Animal{ //注意嵌套的是结构体指针name: "乐乐",},}d1.wang() //乐乐会汪汪汪~d1.move() //乐乐会动!
}
//例题:简单的学生管理系统
package mainimport ("fmt"
)type student struct {id int64name string
}var allstudent map[int64]*studentfunc newstudent(id int64, name string) student {return student{id: id,name: name,}
}func showstudent() {for key, value := range allstudent {fmt.Printf("学号:%d 姓名:%s\n", key, value.name)}
}func addstudent() {var id int64var name stringfmt.Printf("请输入要添加的学号:")fmt.Scanln(&id)fmt.Printf("请输入要添加的姓名:")fmt.Scanln(&name)newstu := newstudent(id, name)allstudent[id] = &newstu
}func deletestudent() {var id int64fmt.Printf("请输入要删除的学号:")fmt.Scanln(&id)delete(allstudent, id)}func main() {var choice intallstudent = make(map[int64]*student, 50)for {fmt.Println("欢迎光临学生管理系统!")fmt.Println(`1.查看所有学生信息2.添加学生信息3.删除学生信息4.退出`)fmt.Printf("请选择要进行的服务:")fmt.Scanln(&choice)switch choice {case 1:showstudent()case 2:addstudent()case 3:deletestudent()case 4:returndefault:fmt.Println("输入有误!")}}
}//简单的学生管理系统2.0
package mainimport ("fmt"
)type student struct {id int64name string
}type studentMgr struct {allstudent map[int64]*student
}func newstudent(id int64, name string) student {return student{id: id,name: name,}
}func (s studentMgr) showstudent() {for key, value := range s.allstudent {fmt.Printf("学号:%d 姓名:%s\n", key, value.name)}
}func (s studentMgr) addstudent() {var id int64var name stringfmt.Printf("请输入要添加的学号:")fmt.Scanln(&id)fmt.Printf("请输入要添加的姓名:")fmt.Scanln(&name)newstu := newstudent(id, name)s.allstudent[id] = &newstu
}func (s studentMgr) deletestudent() {var id int64fmt.Printf("请输入要删除的学号:")fmt.Scanln(&id)_, ok := s.allstudent[id]if !ok {fmt.Println("查无此人!")} else {delete(s.allstudent, id)}
}func (s studentMgr) alterstudent() {var id int64var name stringfmt.Printf("请输入要修改学生学号:")fmt.Scanln(&id)stu, ok := s.allstudent[id]if !ok {fmt.Println("查无此人!")} else {fmt.Printf("请输入要修改后的姓名:")fmt.Scanln(&name)stu.name = names.allstudent[id] = stu}
}func showmenu() {fmt.Println("欢迎光临学生管理系统!")fmt.Println(`1.查看所有学生信息2.添加学生信息3.修改学生信息4.删除学生信息5.退出`)fmt.Printf("请选择要进行的服务:")
}func main() {var choice intsmr := studentMgr{allstudent: make(map[int64]*student, 50),}for {showmenu()fmt.Scanln(&choice)switch choice {case 1:smr.showstudent()case 2:smr.addstudent()case 3:smr.alterstudent()case 4:smr.deletestudent()case 5:returndefault:fmt.Println("输入有误!")}}}
//面试题
package mainimport ("fmt"
)type student struct {name stringage int
}func main() {m := make(map[string]*student)stus := []student{{name: "小王子", age: 18},{name: "娜扎", age: 23},{name: "大王八", age: 9000},}for _, stu := range stus {m[stu.name] = &stufor index2, value2 := range m {fmt.Printf("index:%v value:%v\n", index2, value2)}}for k, v := range m {fmt.Println(k, "=>", v.name)}
}
执行结果
图片来源链接
golang入门笔记—结构体相关推荐
- golang学习笔记(结构体+json)
结构体 结构体等价关系,只有==和!=关系,没有> < 关系,只有字段和属性完全相同,才等价,并且属于同一类型结构体,不同结构体不能比较,每一个不同的指针结构体的地址均不同 type Us ...
- C++ 基础入门 之 结构体/结构体定义和使用/结构体数组/结构体指针/ 结构体嵌套结构体/结构体做函数参数/结构体中 const 使用场景/结构体案例
C++ 基础入门 之 结构体/结构体定义和使用/结构体数组/结构体指针/ 结构体嵌套结构体/结构体做函数参数/结构体中 const 使用场景/结构体案例 目录 一.简单介绍 二.结构体定义和使用 三. ...
- Golang笔记——结构体
结构体 看一个问题 使用现有技术解决 单独的定义变量解决 代码演示: 使用数组解决 现有技术解决的缺点分析 使用变量或者数组来解决养猫的问题,不利于数据的管理和维护.因为名字,年龄,颜色都是 属于一只 ...
- Go语言学习笔记——结构体中使用tag标记
文章目录 golang结构体中使用tag标记 简介 语法结构 快速入门 常见应用 应用json编码 应用xml编码 应用form表单绑定 gin框架form和数据绑定 golang结构体中使用tag标 ...
- Golang 入门笔记(二)下
目录 文章目录 目录 修改字符串 连接字符串 格式化 格式表 BASE64编码 常量 枚举--一组常量值 类型别名与类型定义 非本地类型不能定义方法 在结构体成员嵌入时使用别名 紧接上文 修改字符串 ...
- 【C语言笔记结构体】
我们都知道C语言中变量的类型决定了变量存储占用的空间.当我们要使用一个变量保存年龄时可以将其声明为int类型,当我们要使用一个变量保存某一科目的考试成绩时可以将其声明为float. 那么,当我们要做一 ...
- c语言学习笔记【结构体02】结构体指针变量与结构体变量的函数参数,C语言学习笔记结构体02结构体指针变量与结构体变量的函数参数.docx...
C 语言学习笔记[结构体02]结构体指针变量与结构体变量 的函数参数 C 语言学习笔记之结构体指针变量一提指针,那可 是 C 语言的核心了,有多少学子曾拜倒在指针的脚下.单纯的说指针,其实并不难,但是 ...
- SV学习笔记—结构体及枚举类型及字符串
目录 1.结构体 1.1 压缩结构体 1.2 非压缩结构体 1.3联合结构体 2.枚举类型 3.字符串 1.结构体 Verilog的最大缺陷之一是没有数据结构,SV中可以使用struct语句创建结构, ...
- c++ 结构体地址 转换成ulong_零基础入门之结构体字节对齐
一.字节对齐的规则: 1.一般设置的对齐方式为1,2,4字节对齐方式.结构的首地址必须是结构内最宽类型的整数倍地址;另外,结构体的每一个成员起始地址必须是自身类型大小的整数倍(需要特别注意的是wind ...
最新文章
- 2022-2028年全球与中国青苔清洗剂市场研究及前瞻分析报告
- 总结MYSQL的优化
- 大战设计模式【16】—— 桥接模式
- 服务端配置实现AJAX跨域请求
- 最小的JavaFX演示文稿(在JavaFX中)
- python怎么计算图像梯度_opencv python图像梯度实例详解
- 安全验证框架使用笔记001---Shiro简介
- 用U3D寻找看电视的感觉!!
- ubuntu14在kDE界面下的关于eclipse提示框黑色背景的修改!
- ArcMap|地理探测器(geoDetector)前在ArcGIS中的处理
- OpenCV图像处理--EasyPR中文开源车牌识别系统
- IIS DNS服务器搭建
- 2017百度之星资格赛:1004. 度度熊的午饭时光(01背包+记录路径)
- matlab2018A配置cuda,使用教程 | matlab 2018a + cuda 10.1 + vs 2017
- RQNOJ 34 紧急援救
- 《财富》2022全球500强榜单,沃尔玛九连冠,沙特阿美最赚钱,中国公司上榜最多 | 美通社头条...
- 人在旅途——》张家界之旅:20190420
- 因子模型:套利定价理论APT
- 系统解剖学 | 神经系统 | 核上瘫和核下瘫
- oracle授权查询
热门文章
- excel按季度分类汇总_Excel 分类汇总按年、月和周且用数据透视表与公式实现,并把汇总结果提取出来...
- 关于实现Halcon算法加速的基础知识(多核并行/GPU)
- 王牌仔的小星愿数字藏品获奖名单公布
- 1094.谷歌的招聘
- PreSonus Studio One 5.5 Professional WiN+MAC 专业音乐制作宿主软件
- POJ 1851 Map 笔记
- 【iOS】拍照/相册单选、相册多选、图片浏览、图片裁剪
- 用Python定制一本个性化日历,快来领取你的新年礼物啦~
- Mindspore模型训练Modelzoo SEResNext50_32*4d GPU初始化错误
- 提高篇 第五部分 动态规划 第3章 数位动态规划