go语言学习笔记六 结构体

1.结构体 自定义的数据类型 值类型

package main

import "fmt"

// 定义一个cat结构体 type 结构体名称 struct { }
// 结构体名称和字段首字母大写可以被其他包使用,小写为私有
// 结构体的字段类型为:指针,slice,和map的零值为 nil 即没有分配空间
// 实例化使用的时候需要使用make创建
type Cat struct {
	Name  string  // 字段的名称 类型
	Age   int
	Color string
	Hobby string
	par *int // 指针
	m1 map[string] int  // map
	s1 [] int  // 切片
}

func main() {
	// 创建cat1,cat2两个结构体的实例,修改cat1的值不会影响cat2的值
	var cat1 Cat
	var cat2 Cat
	cat1.Name = "小白"
	cat1.Age = 10
	cat1.Color = "白色"
	cat1.Hobby = "吃"
	cat3 := cat1  // 值拷贝修改其中一个变量的值不会影响另外1个
	cat4 := &cat1 // 地址引用 修改其中1个值另外的一个也会被修改
	fmt.Printf("1.cat1地址:%p;cat2地址:%pN;cat3地址:%p;cat4:%p\n", &cat1, &cat2, &cat3, &cat4)
	fmt.Println("2.cat1 name:", cat1.Name, "age:", cat1.Age, "color:", cat1.Color, "hobby:", cat1.Hobby)
	fmt.Println("3.cat2 name:", cat2.Name, "age:", cat2.Age, "color:", cat2.Color, "hobby:", cat2.Hobby)
	fmt.Println("4.cat3 name:", cat3.Name, "age:", cat3.Age, "color:", cat3.Color, "hobby:", cat3.Hobby)
	fmt.Println("5.cat4 name:", cat4.Name, "age:", cat4.Age, "color:", cat4.Color, "hobby:", cat4.Hobby)
	cat3.Name = "黑猫"
	fmt.Printf("修改cat3的name\n")
	fmt.Println("6.cat1 name:", cat1.Name, "age:", cat1.Age, "color:", cat1.Color, "hobby:", cat1.Hobby)
	fmt.Println("7.cat3 name:", cat3.Name, "age:", cat3.Age, "color:", cat3.Color, "hobby:", cat3.Hobby)
	fmt.Println("8.cat4 name:", cat4.Name, "age:", cat4.Age, "color:", cat4.Color, "hobby:", cat4.Hobby)
	cat4.Name = "花猫"
	fmt.Printf("修改cat4的name\n")
	fmt.Println("9.cat1 name:", cat1.Name, "age:", cat1.Age, "color:", cat1.Color, "hobby:", cat1.Hobby)
	fmt.Println("10.cat3 name:", cat3.Name, "age:", cat3.Age, "color:", cat3.Color, "hobby:", cat3.Hobby)
	fmt.Println("11.cat4 name:", cat4.Name, "age:", cat4.Age, "color:", cat4.Color, "hobby:", cat4.Hobby)
	fmt.Printf("\n")
	// 字段为map 需要先使用make创建
	fmt.Println("12.cat1.m1地址:", &cat1.m1, "cat1.m1值:", cat1.m1)
	cat1.m1 = make(map[string]int)
	cat1.m1["key1"] = 1
	fmt.Println("13.cat1.m1值:", cat1.m1)
	// 字段为切片 需要使用make创建
	fmt.Println( "14.cat1.s1值:", cat1.s1)
	cat1.s1 = make([]int, 5, 10)
	fmt.Println( "15.cat1.s1值:", cat1.s1)
	cat1.s1[0] = 100
	fmt.Println( "16.cat1.s1值:", cat1.s1)
	// 字段为指针 使用new创建
	cat1.par = new(int)
	fmt.Println("17.cat1.par地址:", &cat1.par, "cat1.par值:", *cat1.par)
	*cat1.par = 99
	fmt.Println("18.cat1.par地址:", &cat1.par, "cat1.par值:", *cat1.par)
}

输出

1.cat1地址:0xc00005a180;cat2地址:0xc00005a1e0N;cat3地址:0xc00005a240;cat4:0xc00000e028
2.cat1 name: 小白 age: 10 color: 白色 hobby:3.cat2 name:  age: 0 color:  hobby: 
4.cat3 name: 小白 age: 10 color: 白色 hobby:5.cat4 name: 小白 age: 10 color: 白色 hobby: 吃
修改cat3的name
6.cat1 name: 小白 age: 10 color: 白色 hobby:7.cat3 name: 黑猫 age: 10 color: 白色 hobby:8.cat4 name: 小白 age: 10 color: 白色 hobby: 吃
修改cat4的name
9.cat1 name: 花猫 age: 10 color: 白色 hobby:10.cat3 name: 黑猫 age: 10 color: 白色 hobby:11.cat4 name: 花猫 age: 10 color: 白色 hobby:12.cat1.m1地址: &map[] cat1.m1值: map[]
13.cat1.m1值: map[key1:1]
14.cat1.s1值: []
15.cat1.s1值: [0 0 0 0 0]
16.cat1.s1值: [100 0 0 0 0]
17.cat1.par地址: 0xc00005a1b8 cat1.par值: 0
18.cat1.par地址: 0xc00005a1b8 cat1.par值: 99

2.结构体的四种创建总结

package main

import "fmt"

// 定义一个cat结构体 type 结构体名称 struct { }
// 结构体名称和字段首字母大写可以被其他包使用,小写为私有
// 结构体的字段类型为:指针,slice,和map的零值为 nil 即没有分配空间
// 实例化使用的时候需要使用make创建
type Cat struct {
	Name  string  // 字段的名称 类型
	Age   int
	Color string
	Hobby string
	par *int // 指针
	m1 map[string] int  // map
	s1 [] int  // 切片
}

func main() {
	// 创建结构体的4种方式
	// 方式1
	var cat1 Cat
	cat1.Name = "小白"
	cat1.Age = 10
	cat1.Color = "白色"
	cat1.Hobby = "吃"
	// 方式2
	cat2 := Cat{}
	// 等价于 cat2 := Cat{Name:"小黑"}
	cat2.Name = "小黑"
	// 方式3 cat3 是一个指针
	var cat3 *Cat = new(Cat)
	// 标准赋值写法
	(*cat3).Name = "小黄" // 等价于 cat3.Name = "小黄"
	// 方式4
	var cat4 *Cat = &Cat{}
	(*cat4).Name = "小绿"// 等价于 cat4.Name = "小绿"
	fmt.Printf("cat1地址%p\ncat2地址%p\ncat3地址%p\ncat4地址%p\n", &cat1, &cat2, &cat3, &cat4)
	fmt.Println("\n1.cat1 name:", cat1.Name)
	fmt.Println("2.cat2 name:", cat2.Name)
	fmt.Println("3.cat3 name:", cat3.Name)
	fmt.Println("4.cat4 name:", cat4.Name)
}

输出

cat1地址0xc000052180
cat2地址0xc0000521e0
cat3地址0xc00000e028
cat4地址0xc00000e030

1.cat1 name: 小白
2.cat2 name: 小黑
3.cat3 name: 小黄
4.cat4 name: 小绿

猜你喜欢

转载自blog.csdn.net/qq_38165374/article/details/105279993