我是Go的新手,並且非常好奇的結構。讓我們來定義一個struct T
Go中的結構初始化和方法聲明
type T struct {
size int
}
我已經看到了不同類型結構的初始化。有什麼區別?
new(T) // 1 T{size:1} // 2 &T{size:1} // 3
和兩種方法聲明:
func (r *T) area() int // 1 func (r T) area() int // 2
應該是什麼的正確方法?
我是Go的新手,並且非常好奇的結構。讓我們來定義一個struct T
Go中的結構初始化和方法聲明
type T struct {
size int
}
我已經看到了不同類型結構的初始化。有什麼區別?
new(T) // 1
T{size:1} // 2
&T{size:1} // 3
和兩種方法聲明:
func (r *T) area() int // 1
func (r T) area() int // 2
應該是什麼的正確方法?
新&牛逼{大小:1}返回* T
牛逼{大小:1}回牛逼
內置函數new採用T類型,在運行時爲該類型的變量分配存儲空間,並返回指向它的類型* T的值。變量初始化如初始值部分所述。
2.
任何其他命名類型T的方法,集包括與接收器類型T.所有方法對應的指針類型* T的方法集合是與接收器的所有方法* T或T(即它也包含T的方法集)。
VAR PT * T
變種T T [
FUNC(R * T)面積()詮釋
你可以使用pt.area()或T。面積()
func(r T)area()int
你可以使用t.area(),不能使用pt。區域()
通常我們使用FUNC(R * T)區域()詮釋
Nit。 new(T)返回一個指向T的零值的指針,而&T {1}產生一個非零值。 – Volker
這裏有不同的例子:
type Animal struct {
Legs int
Kingdom string
Carnivore bool
}
初始化以引用
返回指針到struct
var tiger = &Animal{4, "mammalia", true}
fmt.Println(tiger.Kingdom) // print "mammalia"
func changeKingdom(a *Animal) {
a.Kingdom = "alien" // modify original struct
}
changeKingdom(tiger)
fmt.Println(tiger.Kingdom) // print "alien"
構造New
Initializaiton
返回零-ED的指針由值值
var xAnimal = New(Animal)
fmt.Println(xAnimal.Kingdom) // print ""
fmt.Println(xAnimal.Legs) // print 0
fmt.Println(xAnimal.carnivore) // print false
changeKingdom(xAnimal)
fmt.Println(xAnimal.Kingdom) // print "alien"
初始化(複製)
返回原來的結構的單獨副本
var giraffe = Animal{4, "mammalia", false}
fmt.Println(giraffe.Kingdom) // print "mammalia"
func changeKingdom(a Animal) {
a.Kingdom = "extraterrestrial"
}
changeKingdom(giraffe)
fmt.Println(giraffe) // print "mammalia"
更多的時候你會在處理指針時使用結構比副本。
沒有一個是「正確的」,每個人都做了不同的事情。仔細看看http://golang.org/doc/effective_go.html – Volker