Go语言读书笔记:结构体Struct

结构体

结构体是由数据元素组成的结构,是一系列具有指定数据类型的数据宇段,它能够让您通过单个变量引用一系列相关的值。

通过使用结构体,可在单个变量中存储众多类型不同的数据宇段。

通过使用结构体,可提高模块化程度。

声明并创建结构体

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 语言约定,如果标识首字母是大写的,那么结构体及其数据字段将被导出(公开),否则不会导出(私有)。要导出结构体及其字段,结构体及其宇段名称都必须以大写字母开头。

指针引用和值引用

数据值存储在计算机内存中。指针包含值的内存地址, 这意味着使用指针可读写存储的值。创建结构体实例时,给数据字段分配内存并给它们指定默认值;然后返回指向内存的指针,将其赋给变量。 使用简短变量赋值时,将分配内存并指定默认值。