go 結構體的思考

小熊工作做不完了,週末又要加班了, c++ 項目好不容易在不同的指令集編譯出來,結果一跑就掛,連日誌都沒有,難受!

go 語言中的結構體

c++ 的結構體類似,如下定義一個結構體類型。

type Body struct {
	name string
	age  int
}

像這樣就可以使用

var body Body
body.name = "coding3min"
body.age = 12
fmt.Println(body)

輸出

{coding3min 12}

go 中的類

結構體在 go 中是最常用的一種語法,有沒有想過爲什麼?

這是因爲我們學過一些面向對象的語言,其中有一個叫類的概念,但是 go 裏面沒有。

go 用一種特殊的方式,把結構體本身看作一個類。

一個成熟的類,具備成員變量和成員函數,結構體本身就有成員變量,再給他綁定上成員函數,是不是就可以了!

type people struct {
	name string
}

func (p people) toString() {
	fmt.Println(p.name)
	fmt.Printf("p的地址 %p \n", &p)
}

上面給 people 結構體綁定了一個函數, 調用下看看

p1 := people{"coding3min"}
p1.toString()

按照 toString() 方法的內容,先輸出 name 再輸出 p的地址

coding3min
p的地址 0xc0001021f0  #這裏的地址一會有用

再綁定一個函數,你想想和上面的函數有什麼區別,注意 60% 的人第一眼都沒看出來

func (p *people) sayHello() {
	fmt.Printf("Hello! %v \n", p.name)
	fmt.Printf("*p的地址 %p \n", p)
}

可以注意到,和 toString() 函數不同的是, sayHello() 用了指針的方式進行綁定。

輸出,可以注意到這裏的地址和上面的不同。

Hello! coding3min
*p的地址 0xc00008e1e0

這兩種綁定方式,都是相當於給結構體綁定了函數,這個結構體等價於對象,唯一的不同點就是如果使用 * 綁定函數,那麼這種對象就是單例的,引用的是同一個結構體。

p1 := people{"coding3min"}
p1.sayHello()
p2 := &people{"tom"}
p2.sayHello()

輸出,可以看到地址一致。

*p的地址 0xc00008e220
p2的地址 0xc00008e220

一些拓展的結構體知識

聲明時賦值

body2 := Body{
	"tom", 13,
}

結構體數組

bodys := []Body{
	Body{"jack", 12}, Body{"lynn", 18},
}

匿名結構體,一般用來存測試用例

class1 := struct {
	bodys []Body
}{
	[]Body{Body{"jerry", 24}},
}

小結

通過這篇文章,你應該對 go 語言中的 對象 有一個直觀的體驗。

  1. 學會如何給結構體綁定方法
  2. 瞭解綁定方法時是否加 * 號(指針)的區別
  3. 學會聲明時賦值、結構體數組、匿名結構體的知識

我們在 java 裏學習過 interface (接口),通過接口定義一系列的函數(標準),實現接口的對象需要實現所有的方法,那 go 語言中是否有這種語法呢?我們下次再見!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章