[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}
}

參考: 使用Effective Go進行分配

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的社區建議New ..模式名稱。