[Oop] Go中的構造函數


Answers

有一些等價的構造函數,當零值不能做出合理的默認值或當某些參數是必要的結構初始化。

假設你有這樣的結構:

type Thing struct {
    Name  string
    Num   int
}

那麼,如果零值不合適,通常會用NewThing函數構造一個實例,返回一個指針:

func NewThing(someParameter string) *Thing {
    p := new(Thing)
    p.Name = someParameter
    p.Num = 33 // <- a very sensible default value
    return p
}

當你的結構很簡單的時候,你可以使用這個簡潔的結構:

func NewThing(someParameter string) *Thing {
    return &Thing{someParameter, 33}
}

如果你不想返回一個指針,那麼一個練習就是調用函數makeThing而不是NewThing

func makeThing(name string) Thing {
    return Thing{name, 33}
}

參考: 分配新的有效的去

Question

我有一個結構,我希望它有一些合理的默認值初始化。

通常情況下,這裡要做的事情是使用構造函數,但是由於go在傳統意義上並不是真正的OOP,所以它們不是真正的對象,也沒有構造函數。

我注意到init方法,但是在包級別。 是否還有其他類似的結構級別可以使用?

如果不是Go的這種類型的東西被接受的最佳做法?




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在其官方文件中不是OOP語言。 Golang結構的所有字段都有一個確定的值(不像c / c ++),所以構造函數沒有cpp那麼必要。 如果您需要分配一些特殊值的字段,請使用工廠功能。 Golang的社區建議新的模式名稱。