有时,零值不够好,需要一个初始化构造函数,例如,以下示例取自 `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}