5.3 Go语言中构造函数与复合声明

构造函数

单纯使用new进行初始化无法满足初始化需求,必须需要初始化的构造函数,例如以下这个例子:

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}

虽然使用了new进行了初始化,但是后续的一些属性初始化较为复杂,所以使用复合声明,大幅度简化代码复杂程度。

func NewFile(fd int, name string) *File {    if fd < 0 {        return nil    }    f := File{fd, name, nil, 0}    return &f}

局部变量返回的是变量地址,这个变量在函数返回后仍然有效。

复合声明

当然上述例子中,也可以使用复合声明方式直接进行返回。

return &File{fd, name, nil, 0}

上述例子中,复合声明的参数必须要按照顺序,而且必须都存在。也可以这样按照任意顺序,并且省略为0值的声明。

return &File{fd: fd, name: name}

new(File)和&File{}是一样的,但是不推荐使用new方式声明。复合声明还可以用于数组、Slices和Maps的初始化。

package mainimport "fmt"func main() {    arrayDemo := []int{1, 2, 3, 4}    fmt.Printf("arrayDemo = %v
", arrayDemo)    mapDemo := map[string]string{"one": "one", "two": "two"}    fmt.Printf("mapDemo = %v
", mapDemo)    fmt.Printf("mapDemo[one] = %v
", mapDemo["one"])    ar := [...]string{1: "no error", 2: "invalid argument"}    fmt.Printf("ar = %v
", ar)}

输出内容

arrayDemo = [1 2 3 4]mapDemo = map[one:one two:two]mapDemo[one] = onear = [ no error invalid argument]
发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章