结构体
结构体是由数据元素组成的结构,是一系列具有指定数据类型的数据宇段,它能够让您通过单个变量引用一系列相关的值。
通过使用结构体,可在单个变量中存储众多类型不同的数据宇段。
通过使用结构体,可提高模块化程度。
声明并创建结构体
type Movie struct {
Name string
Rating float32
}
func main(){
m: = Movie{
Name: "Forrest Gump"
Rating: 10,
}
}
-
关键字type指定一种新类型。
-
将新类型的名称指定为Movie
-
类型右边是数据类型struct,为结构体
-
在大括号里面,使用名称和类型指定数据字段。如果没有对字段赋值,可将结构体视为模板。
-
在main函数中,使用简短变量赋值声明并初始化了变量m,给数据字段指定的值为相应的数据类型。
要访问结构体的数据字段,用点表示法。
创建结构体
声明结构体后,可以用多种方式创建。
var
var m Movie
用点表示法对其赋值
m.Name = "The Shawshank Redemption"
m.Rating = 9.99
结构体的值是动态可变的,但是结构体的字段数据类型不能改变。
new
m := new(Movie)
简短变量赋值
c := Movie{Name: "Citizen Kane", Rating : 10}
也可以省略字段名,直接按顺序赋值
c := Movie{"Citizen Kane",10}
嵌套结构体
在一个结构体里包含另一个结构体
type Superhero struct{
Name string
Age int
Address Address
}
type Address struct{
Number int
Street string
City string
}
结构体数据字段的默认值
创建结构体时,如果没有给数据字段指定值,则默认值为零值,如false,””,0, 0.0, nil。
Go 语言没有提供自定义默认值的内置方法,但可使用构造函数来实现。
type Alarm struct{
Time string
Sound string
}
func NewAlarm(time string) Alarm{
a := Alarm{
Time: time,
Sound: "Bird",
}
return a
}
这只是种技巧,而并非 Go 言规范的组成部分。
比较结构体
对于类型相同的结构体,要判断是否相等, 可使用 ==
和 !=
,如果相等则返回 true。
类型不同的结构体不能比较,否则将导致编译错误。所以,比较结构体之前必须判断它们的类型是否相同。检查结构体的类型使用Go语言包中的 reflect。
import "reflect"
reflect.TypeOf(a)
结构体作用域
根据 Go 语言约定,如果标识首字母是大写的,那么结构体及其数据字段将被导出(公开),否则不会导出(私有)。要导出结构体及其字段,结构体及其宇段名称都必须以大写字母开头。
指针引用和值引用
数据值存储在计算机内存中。指针包含值的内存地址, 这意味着使用指针可读写存储的值。创建结构体实例时,给数据字段分配内存并给它们指定默认值;然后返回指向内存的指针,将其赋给变量。 使用简短变量赋值时,将分配内存并指定默认值。