文章目录
1. 定义结构体类型2. 声明结构体变量3. 赋值3.1 用结构体赋值3.2 每个成员分别赋值 4. 结构体使用4.1 结构体作参数4.2 结构体指针做参数4.3 二者区别4.4 本质原因 5. 结构体嵌套5.1 一个结构体作为另一个结构体的成员1)定义2)赋值和引用3)完整示例 5.2 直接引入另一个结构体的所有成员1)定义2)赋值和引用3)完整示例 6. 结构体打印6.1 仅打印值6.2 打印成员名和值1. 定义结构体类型
语法type 结构体名称 struct {成员1 类型成员2 类型...}
示例
type XiShu struct {ID intName stringAge intPosition string}
2. 声明结构体变量
代码package mainimport "fmt"type XiShu struct {ID intName stringAge int}func main() {var xiShu XiShufmt.Printf("结构体为:%+v",xiShu)}
结果
结构体为:{ID:0 Name: Age:0}
示例可见:声明结构体变量之后,结构体不为空,结构体每个成员都为默认值(字串默认值为空,int 默认值为 0)。
3. 赋值
3.1 用结构体赋值
语法结构体名 = 结构体类型{成员1: 值1, 成员2: 值2,... }
代码
package mainimport "fmt"type XiShu struct {ID intName stringAge int}func main() {xiShu := XiShu{ID: 1,Name: "刘备",Age: 28,}fmt.Printf("结构体为:%+v",xiShu)}
结果
结构体为:{ID:1 Name:刘备 Age:28}
3.2 每个成员分别赋值
语法结构体名.成员1 = 值结构体名.成员2 = 值
示例
package mainimport "fmt"type XiShu struct {ID intName stringAge int}func main() {var xiShu XiShuxiShu.Name = "刘备"xiShu.Age = 28fmt.Printf("结构体为:%+v",xiShu)}
结果显示
结构体为:{ID:0 Name:刘备 Age:28}
4. 结构体使用
4.1 结构体作参数
代码package mainimport "fmt"type XiShu struct {ID intName stringAge intPosition string}//checkAge 定义函数,以结构体做参数。func checkAge(info XiShu)(result string) {if info.Age >= 18 {result = info.Name+"是一个成年人"return result}else {info.Name = "小"+info.Nameresult = info.Name+"还没有长大"return result}}func main () {liuBei := XiShu{ID: 0,Name: "刘备",Age: 28,Position: "主公",}result := checkAge(liuBei)fmt.Println(result)}
结果输出
刘备是一个成年人
4.2 结构体指针做参数
代码结构体指针可以直接使用,不需要多余操作。
package mainimport "fmt"type XiShu struct {ID intName stringAge intPosition string}//info 是一个结构体的指针func checkAge(info *XiShu)(result string) {if info.Age >= 18 {result = info.Name+"是一个成年人"return result}else {info.Name = "小"+info.Nameresult = info.Name+"还没有长大"return result}}func main () {liuBei := XiShu{ID: 0,Name: "刘备",Age: 28,Position: "主公",}//将结构体liuBei的指针传入函数result := checkAge(&liuBei)fmt.Println(result)}
4.3 二者区别
结构体做参数,变化不会影响函数外package mainimport "fmt"type XiShu struct {ID intName stringAge intPosition string}func IncreaseAge(info XiShu)(age int) {info.Age += 1fmt.Printf("函数中构体:\t%+v\n",info)age = info.Agereturn age}func main () {liuBei := XiShu{ID: 0,Name: "刘备",Age: 28,Position: "主公",}fmt.Printf("原结构体:\t%+v\n",liuBei)IncreaseAge(liuBei)fmt.Printf("当前结构体:\t%+v\n",liuBei)}
结果
原结构体:{ID:0 Name:刘备 Age:28 Position:主公}函数中构体:{ID:0 Name:刘备 Age:29 Position:主公}当前结构体:{ID:0 Name:刘备 Age:28 Position:主公}
结构体指针做参数,变化影响全局如上可见,结构体值变化不会影响函数外。
package mainimport "fmt"type XiShu struct {ID intName stringAge intPosition string}func IncreaseAge(info *XiShu)(age int) {info.Age += 1fmt.Printf("函数中构体:\t%+v\n",info)age = info.Agereturn age}func main () {liuBei := XiShu{ID: 0,Name: "刘备",Age: 28,Position: "主公",}fmt.Printf("原结构体:\t%+v\n",liuBei)IncreaseAge(&liuBei)fmt.Printf("当前结构体:\t%+v\n",liuBei)}
结果:
原结构体:{ID:0 Name:刘备 Age:28 Position:主公}函数中构体:&{ID:0 Name:刘备 Age:29 Position:主公}当前结构体:{ID:0 Name:刘备 Age:29 Position:主公}
如上可见,结构体数据彻底放生变化
4.4 本质原因
说明:函数中的形参和函数外的实参内存地址是不同的。
参数传递时,函数中的形参复制了函数外实参的值,函数结束后形参地址将被释放,这些不会对实参造成影响。
示例
我们将实参的地址作为第二个参数传入函数,然后和第一个形参的地址做比较。
ackage mainimport ("fmt")type XiShu struct {ID intName stringAge intPosition string}func IncreaseAge(info XiShu,xiShu *XiShu) {fmt.Printf("比较形参和实参地址:")if &info == xiShu {fmt.Println("相同")}else {fmt.Println("不同")}}func main () {//liuBei := new(XiShu)liuBei := XiShu{ID: 0,Name: "刘备",Age: 28,Position: "主公",}IncreaseAge(liuBei,&liuBei)}
结果:
比较形参和实参地址:不同
5. 结构体嵌套
5.1 一个结构体作为另一个结构体的成员
1)定义
语法type StructName02 struct {……MemberName StructName01}
语法示例
type XiShu struct {ID intName stringAge intPosition stringEquipment Equipment}type Equipment struct {Arms stringHorse string}
2)赋值和引用
语法StructName02.MemberName.StructName01Menber
示例(用结构体赋值)
用结构体赋值只能使用
StructName02.MemberName.StructName01Menber
的方法
liuBei := XiShu{ID: 0,Name: "刘备",Age: 28,Position: "主公",Equipment: Equipment{Arms: "双股剑",Horse: "的卢",},}
示例(单个成员赋值)
单个赋值语法中两种方法都可以
liuBei.Equipment.Arms = "双股剑"
3)完整示例
代码package mainimport "fmt"type XiShu struct {ID intName stringAge intPosition stringEquipment Equipment}type Equipment struct {Arms stringHorse string}func main () {//可以用结构体赋值liuBei := XiShu{ID: 0,Name: "刘备",Age: 28,Position: "主公",Equipment: Equipment{Arms: "双股剑",//Horse: "的卢", //为了展示直接对成员赋值,此处先注释掉},}//也可以直接对成员赋值liuBei.Equipment.Horse = "的卢"fmt.Printf("%+v",liuBei)}
结果
{ID:0 Name:刘备 Age:28 Position:主公 Equipment:{Arms:双股剑 Horse:的卢}}
5.2 直接引入另一个结构体的所有成员
1)定义
语法type StructName02 struct {……StructName01}
语法示例
type XiShu struct {ID intName stringAge intPosition stringEquipment}type Equipment struct {Arms stringHorse string}
2)赋值和引用
语法StructName02.StructName01Menber
或
StructName02.MemberName.StructName01Menber
示例(用结构体赋值)
用结构体赋值
只能用StructName02.MemberName.StructName01Menber
的结构,而不能使用StructName02.StructName01Menber
的结构
liuBei := XiShu{ID: 0,Name: "刘备",Age: 28,Position: "主公",Equipment: Equipment{Arms: "双股剑",Horse: "的卢",},}
如上,不能
写成:
liuBei := XiShu{ID: 0,Name: "刘备",Age: 28,Position: "主公",Arms: "双股剑", //不能这么写Horse: "的卢", //不能这么写},}
示例(单个成员赋值)
StructName02.MemberName.StructName01Menber
的结构和StructName02.StructName01Menber
的结构都可以。
liuBei.Arms = "双股剑"
或
liuBei.Equipment.Arms = "双股剑"
3)完整示例
代码package mainimport "fmt"type XiShu struct {ID intName stringAge intPosition stringEquipment}type Equipment struct {Arms stringHorse string}func main () {//用结构体赋值liuBei := XiShu{ID: 0,Name: "刘备",Age: 28,Position: "主公",//Equipment: Equipment{ //为了展示单个成员赋值效果,此处可以注释掉//Arms: "双股剑",//Horse: "的卢",//},}//直接引用`Equipment`的成员liuBei.Arms = "双股剑"//通过Equipment引用其成员liuBei.Equipment.Horse = "的卢"fmt.Printf("%+v",liuBei)}
结果
{ID:0 Name:刘备 Age:28 Position:主公 Equipment:{Arms:双股剑 Horse:的卢}}
注意,虽然
Equipment
的成员可以直接引用,但是打印出的结果依然在Equipment
下。
6. 结构体打印
6.1 仅打印值
语法示例fmt.Println(StructName)
完整示例
代码:
package mainimport "fmt"type XiShu struct {ID intName stringAge intPosition string}func main () {liuBei := XiShu{ID: 0,Name: "刘备",Age: 28,Position: "主公",}fmt.Println(liuBei)}
结果输出
{0 刘备 28 主公}
6.2 打印成员名和值
语法示例fmt.Printf("%+v",StructName)
完整示例
代码:
package mainimport "fmt"type XiShu struct {ID intName stringAge intPosition string}func main () {liuBei := XiShu{ID: 0,Name: "刘备",Age: 28,Position: "主公",}fmt.Printf("%+v",liuBei)}
结果输出
{ID:0 Name:刘备 Age:28 Position:主公}
GO语言基础-04-数据类型-07-结构体[struct](定义结构体 声明结构体变量 结构体赋值 结构体做参数 结构体指针 结构体嵌套 结构体打印)
如果觉得《GO语言基础-04-数据类型-07-结构体[struct](定义结构体 声明结构体变量 结构体赋值》对你有帮助,请点赞、收藏,并留下你的观点哦!