Golang的高级数据类型-结构体(struct)实战篇
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
前面我们介绍了数组,切片,map同名都是用来保存相同的数据类型的,那如果我们想要一种数据类型保存不同类型的数据咋办呢?Go语言在结构体中可以为不同项定义不同的数据类型。
一.定义结构体
package main import ( "fmt" ) /* 我们定义一个变量后不使用运行会报错,但定义结构体类型后可以不使用,在执行时并不会报错,因为你不对结构体进行初始化操作它并不占用内存空间. */ type Teacher struct { Name string Age uint8 } /* 温馨提示: Go语言中结构体的字段首字母如果小写的话不能跨包访问,如果首字母大写则可以跨包访问. 如下所示,我们可以自定义一个全局类型的Student结构体类型 */ type Student struct { Name string Age uint8 Gender rune } func main() { //初始化一个结构体 var s1 Student s1.Name = "尹正杰" s1.Age = 18 fmt.Println("s1 = ", s1) //我们也可以在声明变量的时候定义结构体类型,只不过我们实在main函数声明的,因此是一个局部变量 var s2 struct { Name string Score int } s2.Name = "Jason Yin" s2.Score = 750 fmt.Println("s2 = ", s2) //我们可以直接进行初始化赋值 s3 := Student{Name: "Yinzhengjie", Age: 27, Gender: '男'} s4 := Student{"尹正杰", 27, '男'} //可以省略字段名称但顺序一定不能错 fmt.Println("s3 = ", s3) fmt.Println("s4 = ", s4) }
二.结构体的基本使用
1>.结构体的访问方式
package main import ( "fmt" ) /* 温馨提示: (1)结构体中的字段一旦定义就不会发生改变; (2)结构体没有增加或者删除字段的操作; (3)在main函数中调用其它文件的成员,在编译运行的时候,必须手动指定编译的文件; */ type Person struct { Name string Age uint8 } func main() { //对自定义的结构体进行初始化赋值 s := Person{"尹正杰", 18} fmt.Println(s) //我们可以单独访问结构体的元素 fmt.Printf("姓名:%s,年龄:%d\n", s.Name, s.Age) }
2>.结构体和切片结合使用
package main import ( "fmt" ) type Operation struct { Name string Age uint8 } func main() { //使用自动推导类型直接进行初始化赋值 op := Operation{"尹正杰", 18} fmt.Println("op的数据为:", op) //定义一个结构体切片 var s1 []Operation //对结构体切片进行初始化 s1 = make([]Operation, 3) fmt.Print("s1结构体初始化值为:") fmt.Println(s1) //对结构体切片第二个元素进行赋值 s1[1] = op //我们可以对结构体切片的元素对应的属性进行修改操作 s1[1].Name = "Jason Yin" fmt.Print("s1结构体被修改后的值为:") fmt.Println(s1) }
3>.结构体和字典(map)结合使用
package main import ( "fmt" ) type Server struct { brand string //品牌 CpuCore uint8 //核心数 MemorySpace int //内存空间,单位为GB DiskSpace int //磁盘空间,单位为GB } func main() { //使用自动推导类型直接进行初始化赋值 s1 := Server{"戴尔", 32, 128, 122880} //定义一个字典 m1 := make(map[string]Server) //结构体对象作为map的value m1["亦庄机房"] = s1 fmt.Println(m1["亦庄机房"].brand) fmt.Println(m1) /* 如果map的value是结构体类型,那么不能直接通过map修改结构体中的数据,这个时候结构体的内容是只读的. 如果非要修改map的value是结构体类型,需要先对结构体进行修改,然后再重新赋值 */ //m1["亦庄机房"].brand = "浪潮" //这种写法是错误的 s1.brand = "浪潮" //先修改s1结构体的brand字段 m1["亦庄机房"] = s1 //再对同一个key进行赋值,完成更新操作 fmt.Println(m1["亦庄机房"].brand) fmt.Println(m1) }
三.结构体对象作为函数参数传递
package main import "fmt" type Car struct { Name string color string tyre int8 } func Demo(c Car) { c.color = "红色" fmt.Println("in Demo ...", c) } func main() { d1 := Car{"特斯拉", "蓝色", 4} fmt.Println("in main ...", d1) /* 结构体对象作为函数参数,是值传递 */ Demo(d1) fmt.Println("in main ...", d1) }