Golang學習筆記(六):struct
struct
struct,一組字段的集合,類似其他語言的class
放棄了大量包括繼承在內(nèi)的面向?qū)ο筇匦?,只保留了組合(composition)這個最基礎的特性
1.聲明及初始化
type person struct {
name string
age int
}
//初始化
func main() {
var P person
P.name = "tom"
P.age = 25
fmt.Println(P.name)
P1 := person{"Tom1", 25}
fmt.Println(P1.name)
P2 := person{age: 24, name: "Tom"}
fmt.Println(P2.name)
}
2.struct的匿名字段(繼承)
type Human struct {
name string
age int
weight int
}
tyep Student struct {
Human //匿名字段,默認Student包含了Human的所有字段
speciality string
}
mark := Student(Human{"mark", 25, 120}, "Computer Science")
mark.name
mark.age
能夠?qū)崿F(xiàn)字段繼承,當字段名重復的時候,優(yōu)先取外層的,可以通過指定struct名還決定取哪個
mark.Human = Human{"a", 55, 220}
mark.Human.age -= 1
struct不僅可以使用struct作為匿名字段,自定義類型、內(nèi)置類型都可以作為匿名字段,而且可以在相應字段上做函數(shù)操作
3.method
type Rect struct {
x, y float64
width, height float64
}
//method
Reciver 默認以值傳遞,而非引用傳遞,還可以是指針
指針作為Receiver會對實例對象的內(nèi)容發(fā)生操作,而普通類型作為Receiver僅僅是以副本作為操作對象,而不對原實例對象發(fā)生操作
func (r ReciverType) funcName(params) (results) {
}
如果一個method的receiver是*T,調(diào)用時,可以傳遞一個T類型的實例變量V,而不必用&V去調(diào)用這個method
func (r *Rect) Area() float64 {
return r.width * r.height
}
func (b *Box) SetColor(c Color) {
b.color = c
}
4.method繼承和重寫
采用組合的方式實現(xiàn)繼承
type Human struct {
name string
}
type Student struct {
Human
School string
}
func (h *Human) SayHi() {
fmt.Println(h.name)
}
//則Student和Employee的實例可以調(diào)用
func main() {
h := Human{name: "human"}
fmt.Print(h.name)
h.SayHi()
s := Student{Human{"student"}}
s.SayHi()
}
還可以進行方法重寫
funct (e *Student) SayHi() {
e.Human.SayHi()
fmt.Println(e.School)
}
相關(guān)文章
Golang實現(xiàn)Mongo數(shù)據(jù)庫增刪改查操作
本文主要介紹了Golang實現(xiàn)Mongo數(shù)據(jù)庫增刪改查操作,我們使用了 MongoDB的官方Go驅(qū)動程序,實現(xiàn)了插入、查詢、更新和刪除操作,感興趣的可以了解一下2024-01-01Golang使用singleflight解決并發(fā)重復請求
高并發(fā)的場景下,經(jīng)常會出現(xiàn)并發(fā)重復請求資源的情況,singleflight是golang內(nèi)置的一個包,這個包提供了對重復函數(shù)調(diào)用的抑制功能,所以下面我們就來看看如何使用它解決并發(fā)重復請求吧2023-08-08go如何優(yōu)雅關(guān)閉Graceful?Shutdown服務
這篇文章主要為大家介紹了go優(yōu)雅關(guān)閉Graceful?Shutdown服務詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-05-05