我有一个结构,我想用一些合理的默认值初始化它。

通常,这里要做的事情是使用构造函数,但由于go不是传统意义上的真正面向对象,所以它们不是真正的对象,而且它没有构造函数。

我注意到了init方法,但那是在包级别。是否有其他类似的东西可以在结构层使用?

如果不是,那么在围棋中这类事情的公认最佳实践是什么?


当前回答

在官方文件中,Golang并不是面向对象语言。 Golang struct的所有字段都有一个确定的值(不像c/c++),所以构造函数不像cpp那么需要。 如果需要为某些字段分配一些特殊值,请使用工厂函数。 Golang的社区建议新…模式名称。

其他回答

另一种方法是;

package person

type Person struct {
    Name string
    Old  int
}

func New(name string, old int) *Person {
    // set only specific field value with field key
    return &Person{
        Name: name,
    }
}

Go中没有默认的构造函数,但是你可以为任何类型声明方法。您可以习惯声明一个名为“Init”的方法。不确定这是否与最佳实践有关,但它有助于保持名称简短而不失去清晰度。

package main

import "fmt"

type Thing struct {
    Name string
    Num int
}

func (t *Thing) Init(name string, num int) {
    t.Name = name
    t.Num = num
}

func main() {
    t := new(Thing)
    t.Init("Hello", 5)
    fmt.Printf("%s: %d\n", t.Name, t.Num)
}

结果是:

Hello: 5

在官方文件中,Golang并不是面向对象语言。 Golang struct的所有字段都有一个确定的值(不像c/c++),所以构造函数不像cpp那么需要。 如果需要为某些字段分配一些特殊值,请使用工厂函数。 Golang的社区建议新…模式名称。

Go有对象。对象可以有构造函数(尽管不是自动构造函数)。最后,Go是一种面向对象语言(数据类型有附加的方法,但不可否认,关于什么是面向对象有无数的定义)。

然而,公认的最佳实践是为类型编写零个或多个构造函数。

因为@dystroy在我完成这个答案之前发布了他的答案,让我添加一个他的示例构造函数的替代版本,我可能会写成:

func NewThing(someParameter string) *Thing {
    return &Thing{someParameter, 33} // <- 33: a very sensible default value
}

我想向您展示这个版本的原因是,通常可以使用“内联”字面量来代替“构造函数”调用。

a := NewThing("foo")
b := &Thing{"foo", 33}

现在*a == *b。

我喜欢这篇博文中的解释:

函数New是用于为应用程序开发人员创建核心类型或不同类型的包的Go约定。看看New是如何在log中定义和实现的。去,bufio。Go和cypto.go:

log.go

// New creates a new Logger. The out variable sets the
// destination to which log data will be written.
// The prefix appears at the beginning of each generated log line.
// The flag argument defines the logging properties.
func New(out io.Writer, prefix string, flag int) * Logger {
    return &Logger{out: out, prefix: prefix, flag: flag}
}

bufio.go

// NewReader returns a new Reader whose buffer has the default size.
func NewReader(rd io.Reader) * Reader {
    return NewReaderSize(rd, defaultBufSize)
}

crypto.go

// New returns a new hash.Hash calculating the given hash function. New panics
// if the hash function is not linked into the binary.
func (h Hash) New() hash.Hash {
    if h > 0 && h < maxHash {
        f := hashes[h]
        if f != nil {
            return f()
        }
    }
    panic("crypto: requested hash function is unavailable")
}

由于每个包都充当一个名称空间,因此每个包都可以有自己的New版本。在bufio。go可以创建多种类型,因此没有独立的New函数。在这里你会发现NewReader和NewWriter这样的功能。