//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入门笔记—结构体相关推荐

  1. golang学习笔记(结构体+json)

    结构体 结构体等价关系,只有==和!=关系,没有> < 关系,只有字段和属性完全相同,才等价,并且属于同一类型结构体,不同结构体不能比较,每一个不同的指针结构体的地址均不同 type Us ...

  2. C++ 基础入门 之 结构体/结构体定义和使用/结构体数组/结构体指针/ 结构体嵌套结构体/结构体做函数参数/结构体中 const 使用场景/结构体案例

    C++ 基础入门 之 结构体/结构体定义和使用/结构体数组/结构体指针/ 结构体嵌套结构体/结构体做函数参数/结构体中 const 使用场景/结构体案例 目录 一.简单介绍 二.结构体定义和使用 三. ...

  3. Golang笔记——结构体

    结构体 看一个问题 使用现有技术解决 单独的定义变量解决 代码演示: 使用数组解决 现有技术解决的缺点分析 使用变量或者数组来解决养猫的问题,不利于数据的管理和维护.因为名字,年龄,颜色都是 属于一只 ...

  4. Go语言学习笔记——结构体中使用tag标记

    文章目录 golang结构体中使用tag标记 简介 语法结构 快速入门 常见应用 应用json编码 应用xml编码 应用form表单绑定 gin框架form和数据绑定 golang结构体中使用tag标 ...

  5. Golang 入门笔记(二)下

    目录 文章目录 目录 修改字符串 连接字符串 格式化 格式表 BASE64编码 常量 枚举--一组常量值 类型别名与类型定义 非本地类型不能定义方法 在结构体成员嵌入时使用别名 紧接上文 修改字符串 ...

  6. 【C语言笔记结构体】

    我们都知道C语言中变量的类型决定了变量存储占用的空间.当我们要使用一个变量保存年龄时可以将其声明为int类型,当我们要使用一个变量保存某一科目的考试成绩时可以将其声明为float. 那么,当我们要做一 ...

  7. c语言学习笔记【结构体02】结构体指针变量与结构体变量的函数参数,C语言学习笔记结构体02结构体指针变量与结构体变量的函数参数.docx...

    C 语言学习笔记[结构体02]结构体指针变量与结构体变量 的函数参数 C 语言学习笔记之结构体指针变量一提指针,那可 是 C 语言的核心了,有多少学子曾拜倒在指针的脚下.单纯的说指针,其实并不难,但是 ...

  8. SV学习笔记—结构体及枚举类型及字符串

    目录 1.结构体 1.1 压缩结构体 1.2 非压缩结构体 1.3联合结构体 2.枚举类型 3.字符串 1.结构体 Verilog的最大缺陷之一是没有数据结构,SV中可以使用struct语句创建结构, ...

  9. c++ 结构体地址 转换成ulong_零基础入门之结构体字节对齐

    一.字节对齐的规则: 1.一般设置的对齐方式为1,2,4字节对齐方式.结构的首地址必须是结构内最宽类型的整数倍地址;另外,结构体的每一个成员起始地址必须是自身类型大小的整数倍(需要特别注意的是wind ...

最新文章

  1. 2022-2028年全球与中国青苔清洗剂市场研究及前瞻分析报告
  2. 总结MYSQL的优化
  3. 大战设计模式【16】—— 桥接模式
  4. 服务端配置实现AJAX跨域请求
  5. 最小的JavaFX演示文稿(在JavaFX中)
  6. python怎么计算图像梯度_opencv python图像梯度实例详解
  7. 安全验证框架使用笔记001---Shiro简介
  8. 用U3D寻找看电视的感觉!!
  9. ubuntu14在kDE界面下的关于eclipse提示框黑色背景的修改!
  10. ArcMap|地理探测器(geoDetector)前在ArcGIS中的处理
  11. OpenCV图像处理--EasyPR中文开源车牌识别系统
  12. IIS DNS服务器搭建
  13. 2017百度之星资格赛:1004. 度度熊的午饭时光(01背包+记录路径)
  14. matlab2018A配置cuda,使用教程 | matlab 2018a + cuda 10.1 + vs 2017
  15. RQNOJ 34 紧急援救
  16. 《财富》2022全球500强榜单,沃尔玛九连冠,沙特阿美最赚钱,中国公司上榜最多 | 美通社头条...
  17. 人在旅途——》张家界之旅:20190420
  18. 因子模型:套利定价理论APT
  19. 系统解剖学 | 神经系统 | 核上瘫和核下瘫
  20. oracle授权查询

热门文章

  1. excel按季度分类汇总_Excel 分类汇总按年、月和周且用数据透视表与公式实现,并把汇总结果提取出来...
  2. 关于实现Halcon算法加速的基础知识(多核并行/GPU)
  3. 王牌仔的小星愿数字藏品获奖名单公布
  4. 1094.谷歌的招聘
  5. PreSonus Studio One 5.5 Professional WiN+MAC 专业音乐制作宿主软件
  6. POJ 1851 Map 笔记
  7. 【iOS】拍照/相册单选、相册多选、图片浏览、图片裁剪
  8. 用Python定制一本个性化日历,快来领取你的新年礼物啦~
  9. Mindspore模型训练Modelzoo SEResNext50_32*4d GPU初始化错误
  10. 提高篇 第五部分 动态规划 第3章 数位动态规划