小熊工作做不完了,週末又要加班了, 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
語言中的 對象
有一個直觀的體驗。
- 學會如何給結構體綁定方法
- 瞭解綁定方法時是否加
*
號(指針)的區別 - 學會聲明時賦值、結構體數組、匿名結構體的知識
我們在 java
裏學習過 interface
(接口),通過接口定義一系列的函數(標準),實現接口的對象需要實現所有的方法,那 go
語言中是否有這種語法呢?我們下次再見!