一、什么是结构体?有什么作用?
1、 结构体是自定义的数据类型,代表一类事物.
2、结构体变量(实例)是具体的,实际的,代表一个具体变量
其实go中的结构体作用有点像Java中的类。
type cat struct{
Name string
age int
Price float64
}
3、内存分析图:
二、声明结构体
1、 基本语法
type 结构体名称 struct {
field1 type
field2 type
}
2、 举例说明:
type Student struct {
Name string
Age int
Score float32
}
三、结构体字段/属性
1、基本介绍
从概念或叫法上看: 结构体字段 = 属性 = field (即授课中,统一叫字段)
案例演示:
type Student struct {
Name string
Age int
Score float32
}
2、 注意事项和细节说明
1)字段声明语法同变量,示例:字段名 字段类型
2)字段的类型可以为:基本类型、数组或引用类型
3) 在创建一个结构体变量后,如果没有给字段赋值,都对应一个零值(默认值),规则如下:
布尔类型是 false ,
数值是 0 ,
字符串是 "",
引入类型 nil
数组类型的默认值和它的元素类型相关,比如 score [3]int 则为[0, 0, 0]
指针,slice,和map的零值都是 nil ,即还没有分配空间。
代码示例:
type cats struct{
Name string
age int
Price float64
loves []string
}
var c cats
fmt.Println("c=",c)
fmt.Println("c.voves=",c.loves)
4)不同结构体变量的字段是独立,互不影响,一个结构体变量字段的更改,不影响另外一个
// 不同结构体变量的字段是独立,互不影响,一个结构体变量字段的更改,不影响另外一个
c = cats{
name : "白猫",
age : 2,
price : 1000,
}
fmt.Println("c=",c)
c1 := cats{
name : "黑猫",
age : 2,
price : 1000,
}
fmt.Println("c1=",c1)
c1.name = "花猫"
fmt.Println("c1=",c1)
四、创建结构体变量和访问结构体字段的方式
参考go语言使用之结构体使用细节——结构体、组合结构体、OOP中继承的使用
五、结构体(struct类型)的内存分配机制
参考(一)中内存分析图
六、结构体的使用细节和注意事项
1、结构体的所有字段在内存中是连续的
2、结构体是用户单独定义的类型,和其它类型进行转换时需要有完全相同的字段(名字、个数和类型)
type A struct{
name string
}
type B struct{
name string
}
func StructDemo1(){
var a A
var b B
fmt.Println("a=",a)
fmt.Println("b=",b)
b = B(a)
fmt.Println("b=",b)
}
3、 结构体进行type重新定义(相当于取别名),Golang认为是新的数据类型,但是相互间可以强转。
/*结构体类型转换*/
type A struct{
name string
}
type B struct{
name string
}
type C A
func StructDemo1(){
//结构体是用户单独定义的类型,和其它类型进行转换时需要有完全相同的字段(名字、个数和类型)
var a A
var b B
fmt.Println("a=",a)
fmt.Println("b=",b)
b = B(a)
fmt.Println("b=",b)
// 结构体进行type重新定义(相当于取别名),Golang认为是新的数据类型,但是相互间可以强转
// var c C
// c = a
}
4、 struct的每个字段上,可以写上一个tag, 该tag可以通过反射机制获取,常见的使用场景就是序列化和反序列化。
type Students struct {
Name string `json:"myName"` // 给strut的字段,指定一个tag标签
Age int `json:"myAge"`
}
func StructDemo2(){
//演示struct的每个字段上,可以写上一个tag,
//该tag可以通过反射机制获取,常见的使用场景就是序列化和反序列化
stu1 := Students{"二狗子", 20}
stu1Str, err := json.Marshal(stu1) // 将stu1序列化成一个字符串
if err == nil {
fmt.Println("stu1Str=", string(stu1Str))
}else {
fmt.Println("序列化错误=", err)
}
}