有时,零值不够好,需要一个初始化构造函数,例如,以下示例取自 `os` 包。
func NewFile(fd int, name string) *File {
if fd < 0 {
return nil
}
f := new(File)
f.fd = fd
f.name = name
f.dirinfo = nil
f.nepipe = 0
return f
}
这里有很多样板代码。我们可以使用 *复合字面量* 来简化它,复合字面量是一种每次求值时都会创建一个新实例的表达式。
func NewFile(fd int, name string) *File {
if fd < 0 {
return nil
}
f := File{fd, name, nil, 0}
return &f
}
请注意,与 C 语言不同,返回局部变量的地址是完全可以的;与该变量相关的存储空间在函数返回后仍然存在。事实上,对复合字面量的地址取址会在每次求值时分配一个新的实例,因此我们可以将最后两行合并起来。
return &File{fd, name, nil, 0}