#### Go 面向对象之结构体最近有四天没更新公众号,有一些事情耽误了,生活就是这样,总会一些事情让人措不及防;   ***山浓水浅,坐看流年***

1. Go 也支持面向对象编程(OOP) 但是它和传统的面向对象编程还是有一些区别,并不是纯粹的面向对象编程;  2. Go 中没有类(class), Go 中struct 和其它编程语言中的类有同等地位,所以我们可以理解Go 是基于struct 来实现OOP;   3. Go 面向对象很简洁,没有传统OOP 的继承,方法重载,构造函数等等;  4. Go 面向对象仍有继承,封装,多态的特性,只是它的实现与传统的OOP语言不同; ##### 结构体与结构体变量(实例/对象)的关系图

---说明:  1. 将一类事物的特性提取出来(比如猫类),形成一个新的数据类型就是一个结构体;  2. 通过这个结构体,可以创建多个变量(实例/对象);  3. 事物可以是猫类,也可以是其它的类...;  案例:  
package mainimport "fmt"// 定义一个结构体,类似于类
// 将Cat 的各个字段/属性,放入到结构体中
type Cat struct {Name stringAge uintColor stringHobby string
}
func main(){// 声明一个Cat 变量,也就是实例var a1 Cata1.Name = "小花"a1.Age = 2a1.Color = "black"a1.Hobby = "老鼠"fmt.Println(a1)fmt.Printf("name=%s\n",a1.Name)fmt.Printf("age=%d\n",a1.Age)fmt.Printf("color=%s\n",a1.Color)fmt.Printf("hobby=%s\n",a1.Hobby)
}

  

---结构体与结构体变量(实例)的区别1. 结构体是自定义的数据类型,代表一类事物;  2. 结构体变量是具体的,实际的,代表一个具体的变量;  ---##### 结构体变量在内存中的布局  


##### 如何声明结构体基本语法:  type 结构体名称 struct {  field1 type  field2 type ...  }  例如:  typt Person struct {  Name string   Age int   Class string  }  ##### 字段属性字段是结构体的组成部分,一般是基本数据类型,数组,同时也可以是引用类型;  注意事项:  1. 字段声明语法同变量一样: 字段名 字段类型2. 在创建一个结构体变量后,如果没有给字段赋值,每个字段都对应一个默认值,引用类型默认值为nil;  3. 不同结构体变量的字段是独立的,互不影响: 结构体是值类型;  
package mainimport "fmt"// 如果结构体里的字段是引用类型的: slice map channel;
// 在使用前需要make分配内存才能使用;
type Person struct {Name stringAge intHobby [3]stringptr *stringslice []intParents map[string]string
}
type Cat struct {Name stringAge int
}
func main(){var a1 Personfmt.Println(a1) //{0 [] nil [] map[]}if a1.ptr == nil {fmt.Println("ptr is nil")}if a1.slice == nil {fmt.Println("slice is nil")}if a1.Parents == nil {fmt.Println("parents is nil")}// 结构体字段是引用类型的话,使用前需要makea1.slice = make([]int,10)a1.slice[0] = 1a1.slice[1] = 2a1.slice[2] = 3a1.Parents = make(map[string]string)a1.Parents["name"] = "aaaa"a1.Parents["friendly"] = "father"fmt.Println(a1) // { 0 [  ] <nil> [1 2 3 0 0 0 0 0 0 0] map[friendly:father name:aaaa]}// 不同结构体变量间互不影响var c1 Catvar c2 Catc1.Name = "c1"c2.Name = "c2"c1.Age = 1c2.Age = 2fmt.Println(c1,c2) //{c1 1} {c2 2}
}

  

---##### 创建结构变量和访问结构体字段
package mainimport "fmt"type Cat struct {Name stringAge int
}
func main(){// 方式1: 先声明,再赋值var c1 Catc1.Name = "c1"c1.Age = 1fmt.Println(c1) //{c1 1}// 方式2: 字面量方式var c2 Cat = Cat{"c2",2}fmt.Println(c2) //{c2 2}// 方式3: 类型推导方式c3 := Cat{"c3",3}fmt.Println(c3) //{c3 3}// 方式4: new 方式var c4 *Cat = new(Cat)c4.Name = "c4"c4.Age = 4fmt.Println(*c4)// 方式5: &{} 方式var c5 *Cat = &Cat{}c5.Name = "c5"c5.Age = 5fmt.Println(*c5)// 方式4,方式5 返回的都是结构体的指针类型
}

  

1. 第4,5 种方式返回的是***结构体指针***;  2. 结构体指针访问字段的标准方式应该是:(*结构体指针).字段名, 如:(*c4).Name = "c4";  3. Go 做了简化,支持***结构体指针.字段名***,如:c4.Name = "c4",Go 编译器底层自动处理了;  ---##### 结构体使用注意事项 1. 结构体中所有的字段在内存中是连续的;  2. 结构体是用户自定义的类型,在和其它类型转换时需要有完全相同的字段(名称,个数,类型);  3. 结构体进行type 定义,Go 认为是新的数据类型,可以和基本数据类型进行强转; 4. 结构体每个字段上可以写tag,tag 可以通过反射机制获取,常用的场景是序列化和反序列化;  
package mainimport ("encoding/json""fmt"
)type Person struct {Name stringAge intHobby string
}
type Student struct {Name stringAge intHobby string
}
type Cat struct {Name string `json:"name"`Age int `json:"age"`
}
func main(){var p1 Personp1.Name = "p1"p1.Age = 22p1.Hobby = "run"// 结构体变量的地址fmt.Printf("p1 address: %p\n",&p1)fmt.Printf("p1.Name address: %p\n",&p1.Name) // 0xc0000562d0fmt.Printf("p1.Age address: %p\n",&p1.Age) //   0xc0000562e0 , 一个string 是16 字节fmt.Printf("p1.Hobby address: %p\n",&p1.Hobby)//0xc0000562e8 , 一个int 在64 位系统中为8字节// 类型之间强转var s1 Students1 = Student(p1)fmt.Println(s1)fmt.Printf("s1 type is %T\n",s1) // Student// struct tagvar c1 Catc1.Name = "小花"c1.Age = 12jsonStr,err := json.Marshal(c1)if err != nil {fmt.Println(err)}// 输出的是结构体中tag 定义的名称fmt.Println(string(jsonStr)) // {"name":"小花","age":12}
}

  个人微信公众号上有最新内容,欢迎关注交流学习

转载于:https://www.cnblogs.com/Mail-maomao/p/11458935.html

Go 面向对象之结构体相关推荐

  1. 初识Golang的面向对象 为结构体(类)绑定方法

    前言 Go语言面向对象 Go语言仅支持封装 不支持继承和多态 继承和多态通过接口实现 成员函数的实现 创建类对象在Go语言中表现为创建一个结构体变量 可以定义一个工厂函数 专门负责初始化结构体(类)变 ...

  2. go var type 互转_Go语言学习笔记(第九章) 结构体

    Go语言基础之结构体 Go语言中没有"类"的概念,也不支持"类"的继承等面向对象的概念.Go 通过类型别名(alias types)和结构体的形式支持用户自定义 ...

  3. Go语言基础之结构体

    转载地址:https://www.liwenzhou.com/posts/Go/10_struct/ Go语言中没有"类"的概念,也不支持"类"的继承等面向对象 ...

  4. Go基础:指针、Map、结构体

    目录 Map 按照指定顺序遍历map 元素为map类型的切片 值为切片类型的map 结构体 类型定义和类型别名的区别 struct 取结构体的地址 结构体没有构造函数,可自己实现 结构体初始化 方式一 ...

  5. 10.Go语言基础之结构体

    Go语言中没有"类"的概念,也不支持"类"的继承等面向对象的概念.Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性. 类型别名和自定义类型 ...

  6. Go语言基础 结构体

    Go语言基础之结构体 Go语言中没有"类"的概念,也不支持"类"的继承等面向对象的概念.Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性. ...

  7. Go语言全栈开发:结构体

    文章目录 类型别名和自定义类型 结构体 练习题 Go语言中没有"类"的概念,也不支持"类"的继承等面向对象的概念.Go语言中通过结构体的内嵌再配合接口比面向对象 ...

  8. Golang通脉之结构体

    Go语言中的基础数据类型可以表示一些事物的基本属性,但是要表达一个事物的全部或部分属性时,这时候再用单一的基本数据类型明显就无法满足需求了,Go语言提供了一种自定义数据类型,可以封装多个基本数据类型, ...

  9. go语言初体验(流程控制、range遍历、函数、结构体、面向对象)

    一.流程控制 // main package mainimport ("fmt" )func main() {x := 2switch x {case 1:fmt.Print(&q ...

最新文章

  1. 数据中心冷冻站模块化建设模式探讨
  2. MOVW 和 rep
  3. 分享适合程序员使用17 张壁纸
  4. python 代码文件路径注意事项
  5. 用DeflateStream和GZipStream压缩数据
  6. 形象解释 undefined 和 null 之间的区别
  7. 1462 通往奥格瑞玛的道路
  8. SpringBoot轻量级博客/论坛(包含 SpringBoot、SSM、Dubbo多个版本实现代码) 初云博客
  9. .gen格式文件读取,完成兰伯特和墨卡托投影转换
  10. 计算机掌握录音机的使用方法,如何使用2种方法从计算机录制音频
  11. 免费高清图片网站(国外)
  12. Windows系统封装总结
  13. Linux2--修改root密码,文件操作
  14. 这款吊打Chrome、Edge的浏览器,时隔573天再度更新
  15. 用计算机电脑怎么做ppt软件,电脑做ppt的软件叫什么
  16. Scrum板与Kanban如何抉择?敏捷工具:czsva板与按照mgzaqbpe
  17. 代驾小程序源码开发这3大功能不可少
  18. 【python】什么是python?python有什么用?
  19. 在水木社区的一个回帖
  20. 2022.05.04 HTML学习第三天

热门文章

  1. 决策树之 C4.5 算法
  2. Java设计模式——单件模式
  3. 数据流DataInput(Output)Stream 和 字节数组流 ByteArrayInput(Output) Stream
  4. [转]opensuse vim 的语法高亮
  5. 三体系建设是什么意思_湖南信息系统建设和服务能力评估体系怎么做?是什么?...
  6. 哈夫曼编码译码 C语言,【求助】严蔚敏版数据结构 哈夫曼编码译码
  7. mysql列名可以用中文吗_用了这么久的MySQL,你知道它的存储引擎吗?
  8. iphone字体_iOS 13终于能换花式字体了?!发在朋友圈里真的超好看!
  9. 阿里云资深专家李国强:云原生的一些趋势和新方向
  10. 订单峰值激增 230%,Serverless 如何为世纪联华降本超 40%?|双11 云原生实践