2015-08-14 83 views
-1

我是Go的新手,並且非常好奇的結構。讓我們來定義一個struct TGo中的結構初始化和方法聲明

type T struct { 
    size int 
} 
  1. 我已經看到了不同類型結構的初始化。有什麼區別?

    new(T)  // 1 
    T{size:1} // 2 
    &T{size:1} // 3 
    
  2. 和兩種方法聲明:

    func (r *T) area() int // 1 
    func (r T) area() int // 2 
    

    應該是什麼的正確方法?

+2

沒有一個是「正確的」,每個人都做了不同的事情。仔細看看http://golang.org/doc/effective_go.html – Volker

回答

1
  1. 分配

新&牛逼{大小: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)區域()詮釋

+1

Nit。 new(T)返回一個指向T的零值的指針,而&T {1}產生一個非零值。 – Volker

1

這裏有不同的例子:

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" 

更多的時候你會在處理指針時使用結構比副本。

+0

var newAnimal Animal會做什麼? – Datsik

+0

'var a Animal'是一個聲明一個變量來保存'Animal'類型的值 – PieOhPah