GO语言编程基础-复合类型结构体

Posted liankexing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GO语言编程基础-复合类型结构体相关的知识,希望对你有一定的参考价值。

    大家好,我们是链客区块链技术问答社区,今天讲一讲Go语言的基础编程。

    链客,有问必答!!!

 

 

1 结构体类型

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

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

2 结构体初始化

2.1 普通变量

type Student struct {

    id   int

    name string

    sex  byte

    age  int

    addr string

}

func main() {

    //1、顺序初始化,必须每个成员都初始化

    var s1 Student = Student{1, "mike", ‘m‘, 18, "sz"}

    s2 := Student{2, "yoyo", ‘f‘, 20, "sz"}

    //s3 := Student{2, "tom", ‘m‘, 20} //err, too few values in struct initializer

    //2、指定初始化某个成员,没有初始化的成员为零值

    s4 := Student{id: 2, name: "lily"}

}

2.2 指针变量

type Student struct {

    id   int

    name string

    sex  byte

    age  int

    addr string

}

func main() {

    var s5 *Student = &Student{3, "xiaoming", ‘m‘, 16, "bj"}

    s6 := &Student{4, "rocco", ‘m‘, 3, "sh"}

}

3 结构体成员的使用

3.1 普通变量

 //===============结构体变量为普通变量

    //1、打印成员

    var s1 Student = Student{1, "mike", ‘m‘, 18, "sz"}

    //结果:id = 1, name = mike, sex = m, age = 18, addr = sz

    fmt.Printf("id = %d, name = %s, sex = %c, age = %d, addr = %s ", s1.id, s1.name, s1.sex, s1.age, s1.addr)

    //2、成员变量赋值

    var s2 Student

    s2.id = 2

    s2.name = "yoyo"

    s2.sex = ‘f‘

    s2.age = 16

    s2.addr = "guangzhou"

    fmt.Println(s2) //{2 yoyo 102 16 guangzhou}

3.2 指针变量

//===============结构体变量为指针变量

    //3、先分配空间,再赋值

    s3 := new(Student)

    s3.id = 3

    s3.name = "xxx"

    fmt.Println(s3) //&{3 xxx 0 0 }

    //4、普通变量和指针变量类型打印

    var s4 Student = Student{4, "yyy", ‘m‘, 18, "sz"}

    fmt.Printf("s4 = %v, &s4 = %v ", s4, &s4) //s4 = {4 yyy 109 18 sz}, &s4 = &{4 yyy 109 18 sz}

    var p *Student = &s4

    //p.成员 和(*p).成员 操作是等价的

    p.id = 5

    (*p).name = "zzz"

    fmt.Println(p, *p, s4) //&{5 zzz 109 18 sz} {5 zzz 109 18 sz} {5 zzz 109 18 sz}

4 结构体比较

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

func main() {

    s1 := Student{1, "mike", ‘m‘, 18, "sz"}

    s2 := Student{1, "mike", ‘m‘, 18, "sz"}

    fmt.Println("s1 == s2", s1 == s2) //s1 == s2 true

    fmt.Println("s1 != s2", s1 != s2) //s1 != s2 false

}

5 结构体作为函数参数

5.1 值传递

func printStudentValue(tmp Student) {

    tmp.id = 250

    //printStudentValue tmp =  {250 mike 109 18 sz}

    fmt.Println("printStudentValue tmp = ", tmp)

}

func main() {var s Student = Student{1, "mike", ‘m‘, 18, "sz"}

    printStudentValue(s)        //值传递,形参的修改不会影响到实参

    fmt.Println("main s = ", s) //main s =  {1 mike 109 18 sz}

}

5.2 引用传递

func printStudentPointer(p *Student) {

    p.id = 250

    //printStudentPointer p =  &{250 mike 109 18 sz}

    fmt.Println("printStudentPointer p = ", p)

}

func main() {

    var s Student = Student{1, "mike", ‘m‘, 18, "sz"}

    printStudentPointer(&s)     //引用(地址)传递,形参的修改会影响到实参

    fmt.Println("main s = ", s) //main s =  {250 mike 109 18 sz}

}

6 可见性

Go语言对关键字的增加非常吝啬,其中没有private、 protected、 public这样的关键字。

要使某个符号对其他包(package)可见(即可以访问),需要将该符号定义为以大写字母 
开头。

目录结构: 

test.go示例代码如下:

//test.gopackage test

//student01只能在本文件件引用,因为首字母小写type student01 struct {

    Id   int

    Name string

}

//Student02可以在任意文件引用,因为首字母大写type Student02 struct {

    Id   int

    name string

}

main.go示例代码如下:

// main.gopackage main

import (

    "fmt"

    "test" //导入test包

)

func main() {

    //s1 := test.student01{1, "mike"} //err, cannot refer to unexported name test.student01

    //err, implicit assignment of unexported field ‘name‘ in test.Student02 literal

    //s2 := test.Student02{2, "yoyo"}

    //fmt.Println(s2)

    var s3 test.Student02 //声明变量

    s3.Id = 1             //ok

    //s3.name = "mike"  //err, s3.name undefined (cannot refer to unexported field or method name)

    fmt.Println(s3)

}

 

 

 


以上是关于GO语言编程基础-复合类型结构体的主要内容,如果未能解决你的问题,请参考以下文章

go语言学习笔记 — 基础 — 复合数据类型 — 结构体:结构体方法(行为)

go语言学习笔记 — 基础 — 复合数据类型 — 结构体:如何在包中引用另外一个包的结构体?

go语言学习笔记 — 基础 — 复合数据类型 — 结构体:使用匿名结构体分离json数据

go语言学习笔记 — 基础 — 复合数据类型 — 结构体:类型内嵌与结构体内嵌(扩展和复用)

go语言学习笔记 — 基础 — 复合数据类型 — 结构体:实例化结构体 — 为结构体分配内存并初始化

go语言学习笔记 — 基础 — 复合数据类型 — 结构体(10.1):隐藏结构体与跨包引用结构体