7.6.1 结构体类型

有时我们需要将不同类型的数据组合成一个有机的整体,如:一个学生有学号/姓名/性别/年龄/地址等属性。显然单独定义以上变量比较繁琐,数据不便于管理。

结构体是一种聚合的数据类型,它是由一系列具有相同类型或不同类型的数据构成的数据集合。每个数据称为结构体的成员。

7.6.2 结构体初始化

7.6.2.1 普通变量

  1. type Student struct {
  2. id int
  3. name string
  4. sex byte
  5. age int
  6. addr string
  7. }
  8. func main() {
  9. //1、顺序初始化,必须每个成员都初始化
  10. var s1 Student = Student{1, "mike", 'm', 18, "sz"}
  11. s2 := Student{2, "yoyo", 'f', 20, "sz"}
  12. //s3 := Student{2, "tom", 'm', 20} //err, too few values in struct initializer
  13. //2、指定初始化某个成员,没有初始化的成员为零值
  14. s4 := Student{id: 2, name: "lily"}
  15. }

7.6.2.2 指针变量

  1. type Student struct {
  2. id int
  3. name string
  4. sex byte
  5. age int
  6. addr string
  7. }
  8. func main() {
  9. var s5 *Student = &Student{3, "xiaoming", 'm', 16, "bj"}
  10. s6 := &Student{4, "rocco", 'm', 3, "sh"}
  11. }

7.6.3 结构体成员的使用

7.6.3.1 普通变量

  1. //===============结构体变量为普通变量
  2. //1、打印成员
  3. var s1 Student = Student{1, "mike", 'm', 18, "sz"}
  4. //结果:id = 1, name = mike, sex = m, age = 18, addr = sz
  5. fmt.Printf("id = %d, name = %s, sex = %c, age = %d, addr = %s\n", s1.id, s1.name, s1.sex, s1.age, s1.addr)
  6. //2、成员变量赋值
  7. var s2 Student
  8. s2.id = 2
  9. s2.name = "yoyo"
  10. s2.sex = 'f'
  11. s2.age = 16
  12. s2.addr = "guangzhou"
  13. fmt.Println(s2) //{2 yoyo 102 16 guangzhou}

7.6.3.2 指针变量

  1. //===============结构体变量为指针变量
  2. //3、先分配空间,再赋值
  3. s3 := new(Student)
  4. s3.id = 3
  5. s3.name = "xxx"
  6. fmt.Println(s3) //&{3 xxx 0 0 }
  7. //4、普通变量和指针变量类型打印
  8. var s4 Student = Student{4, "yyy", 'm', 18, "sz"}
  9. fmt.Printf("s4 = %v, &s4 = %v\n", s4, &s4) //s4 = {4 yyy 109 18 sz}, &s4 = &{4 yyy 109 18 sz}
  10. var p *Student = &s4
  11. //p.成员 和(*p).成员 操作是等价的
  12. p.id = 5
  13. (*p).name = "zzz"
  14. fmt.Println(p, *p, s4) //&{5 zzz 109 18 sz} {5 zzz 109 18 sz} {5 zzz 109 18 sz}

7.6.4 结构体比较

如果结构体的全部成员都是可以比较的,那么结构体也是可以比较的,那样的话两个结构体将可以使用 == 或 != 运算符进行比较,但不支持 > 或 < 。

  1. func main() {
  2. s1 := Student{1, "mike", 'm', 18, "sz"}
  3. s2 := Student{1, "mike", 'm', 18, "sz"}
  4. fmt.Println("s1 == s2", s1 == s2) //s1 == s2 true
  5. fmt.Println("s1 != s2", s1 != s2) //s1 != s2 false
  6. }

7.6.5 结构体作为函数参数

7.6.5.1 值传递

  1. func printStudentValue(tmp Student) {
  2. tmp.id = 250
  3. //printStudentValue tmp = {250 mike 109 18 sz}
  4. fmt.Println("printStudentValue tmp = ", tmp)
  5. }
  6. func main() {
  7. var s Student = Student{1, "mike", 'm', 18, "sz"}
  8. printStudentValue(s) //值传递,形参的修改不会影响到实参
  9. fmt.Println("main s = ", s) //main s = {1 mike 109 18 sz}
  10. }

7.6.5.2 引用传递

  1. func printStudentPointer(p *Student) {
  2. p.id = 250
  3. //printStudentPointer p = &{250 mike 109 18 sz}
  4. fmt.Println("printStudentPointer p = ", p)
  5. }
  6. func main() {
  7. var s Student = Student{1, "mike", 'm', 18, "sz"}
  8. printStudentPointer(&s) //引用(地址)传递,形参的修改会影响到实参
  9. fmt.Println("main s = ", s) //main s = {250 mike 109 18 sz}
  10. }

7.6.6 可见性

Go语言对关键字的增加非常吝啬,其中没有private、 protected、 public这样的关键字。
要使某个符号对其他包(package)可见(即可以访问),需要将该符号定义为以大写字母
开头。

作者:admin  创建时间:2018-06-18 05:42
 更新时间:2018-06-18 05:48
上一篇:
下一篇: