非零基础自学Golang

第9章 结构体

在Go语言官网的常见问题解答一栏中,有这样一个问题:“Is Go an object-oriented language?(Go语言是否是一种面向对象语言?)”比较有意思的是,

Go官方给出的回答是:“Yes and no.(既是也不是。)”

不同于Python和C++等编程语言,虽然Go有着面向对象语言的编程风格,但Go并不是典型的面向对象的语言。Go语言中不支持类,但它提供了结构体,Go语言中的结构体和接口实现了面向对象编程的特性。

此外,Go中的方法比C++或Java等编程语言中的方法更通用,可以为任何类型的数据定义这些方法。

9.1 理解结构体

通过使用结构体,我们可以自定义一系列由相同类型或不同类型的数据构成的数据集合,用来实现较复杂的数据结构。

Go语言的结构体是一种对现实生活中实体的抽象,结构体由一系列成员变量构成,这些成员变量对应着实体不同的属性。

例如,对于某个图书馆中的所有书籍,我们可以抽象出书这个结构体,经过总结归纳,该图书馆中的书都拥有以下属性:书名、作者、数量、ID号。

那么,我们可以定义以下结构体:

结构体名:book

  • 成员1:书名
  • 成员2:作者
  • 成员3:数量
  • 成员4:ID号

9.2 定义结构体

GO语言中通过关键字type定义自定义类型,结构体定义需要使用type和struct关键字,具体定义格式如下:

type 结构体名 struct {成员变量1 类型1成员变量2 类型2成员变量3 类型3...
}

和C 真像啊

注意:

  • 结构体名:同一个包内结构体名不能重复。
  • 成员名:同一个结构体内,成员名不能重复。
  • 类型1、类型2……:表示结构体成员变量的类型。
  • 同类型的成员名可以写在同一行。
  • 当结构体、方法名或变量名的首字母为大写时(可被导出)【“公有”】,就可以在当前包外进行访问。

对于book结构体,其定义如下:

type Book struct {title stringauthor stringnum intid int
}

对于同变量类型的结构体成员,可以将它们写在同一行:

type Book struct {title,author stringnum,id int
}

9.3 实例化结构体

一个结构体在定义完成后才能进行使用。结构体实例化时,会真正地分配内存。因此,必须在定义结构体并实例化后才能使用结构体的字段。

Go语言实例化结构体主要有以下三种方式:

  • 标准实例化。
  • new函数实例化。
  • 取地址实例化。
9.3.1 标准实例化

结构体本身是一种自定义数据类型,和其他基本数据类型的声明格式类似,可以通过var关键字进行实例化。

标准实例化格式如下:

var 结构体实例 结构体类型

下方的程序实例化了book1,对book1的各个成员进行了初始化赋值。

[ 动手写 9.3.1]

package mainimport "fmt"type Book struct {title  stringauthor stringnum    intid     int
}func main() {var book1 Bookfmt.Println(book1)
}

运行结果

在这里插入图片描述

由于string和int类型变量的初始值为""和0,因此程序执行结果如上。

9.3.2 new函数实例化

new函数可对结构体进行实例化,实例化完成后会返回结构体的指针类型。

[ 动手写 9.3.2]

package mainimport "fmt"type Book struct {title  stringauthor stringnum    intid     int
}func main() {book1 := new(Book)fmt.Println(book1)
}

运行结果

在这里插入图片描述

9.3.3 取地址实例化

取地址实例化与使用new函数进行实例化类似,返回的是结构体指针类型。

取地址实例化格式如下:

结构体实例 := &结构体类型{}

[ 动手写 9.3.3]

package mainimport "fmt"type Book struct {title  stringauthor stringnum    intid     int
}func main() {book1 := &Book{}fmt.Println(book1)
}

运行结果

在这里插入图片描述

9.3.4 访问成员

结构体实例化完成后,可通过“.”来访问结构体的成员变量,对成员变量进行赋值或修改。

[ 动手写 9.3.4]

package mainimport "fmt"type Book struct {title  stringauthor stringnum    intid     int
}func main() {book1 := &Book{}book1.title = "Go语言"book1.author = "Tom"book1.num = 20book1.id = 152368fmt.Println("title: ", book1.title)fmt.Println("author: ", book1.author)fmt.Println("num: ", book1.num)fmt.Println("id: ", book1.id)}

运行结果

在这里插入图片描述

不论使用哪种方式对结构体进行实例化,都可通过“.”的方式来对结构体的成员变量进行访问。