6、初始化结构体
1)、使用 new
使用 new 函数给一个新的结构体变量分配内存,它返回指向已分配内存的指针:
var t *T = new(T),如果需要可以把这条语句放在不同的行
(比如定义是包范围的,但是分配却没有必要在开始就做)。
var t *T t = new(T)
写这条语句的惯用方法是:t := new(T),变量 t 是一个指向 T的指针,
此时结构体字段的值是它们所属类型的零值。
声明 var t T 也会给 t 分配内存,并零值化内存,但是这个时候 t 是类型T。
在这两种方式中,t 通常被称做类型 T 的一个实例(instance)或对象(Object)。
2)、初始化一个结构体实例(一个结构体字面量:struct-literal)的更简短和惯用的方式如下: ms := &struct1{10, 15.5, "Chris"} // 此时ms的类型是 *struct1
3)、常规初始化 var ms struct1 ms := struct1{10, 15.5, "Chris"} 7、结构体指针
你可以定义指向结构体的指针类似于其他指针变量,格式如下:
var struct_pointer *Books
以上定义的指针变量可以存储结构体变量的地址。查看结构体变量地址,
可以将 & 符号放置于结构体变量前:
struct_pointer = &Book1
使用结构体指针访问结构体成员,使用 "." 操作符:struct_pointer.title
8、使用工厂方法创建结构体实例
结构体工厂
Go 语言不支持面向对象编程语言中那样的构造子方法,
但是可以很容易的在 Go 中实现 “构造子工厂“ 方法。
为了方便通常会为类型定义一个工厂,按惯例,工厂的名字以 new 或 New 开头。
假设定义了如下的 File 结构体类型:
type File struct { fd int // 文件描述符 name string // 文件名 }
下面是这个结构体类型对应的工厂方法,
它返回一个指向结构体实例的指针:
func NewFile(fd int, name string) *File { if fd < 0 { return nil } return &File(fd, name) }