go語言的語言設計非常的簡潔,因為,go語言並沒有物件導向的概念,因此go語言中沒有物件導向的一些概念,例如(封裝、繼承、多型,虛函式、建構函式,this指標等)
儘管go語言中沒有封裝、繼承、多型,但同樣也可以實現相應的功能。
封裝:通過方法進行實現
繼承:通過匿名字段實現
多型:通過介面實現
方法也是一種函式型別,本質上,乙個方法則是乙個和特殊型別關聯的函式
//a為接收者,int為接收者的名字
func
(a int)
add(b int)int
func
main()
同時,可以通過方法為結構體變數賦值。
type person struct
func
(p person)
printinfo()
我們可以通過函式為結構體進行賦值操作。
type person struct
func
(p *person)
setinfo
(s string
,i int
)func
main()
方法類似於多了乙個引數,我們可以將接受方法看成乙個引數。
注意
type person struct
type student struct
上面的student類中,包含person的匿名字段,相當於繼承於person。
初始化方式:
結構體指標型別匿名字段
type person struct
type student struct
初始化操作
var s1 student
s1.person =
new(person)
s1.name =
"bai"
s1.age =
20s1.classname =
"xiaan"
go語言中使用介面實現多型的效果。
介面的定義:
type 介面名 inte***ce
例如:helloworld介面的定義
type hello inte***ce
helloworld介面的實現
//通過自定義型別實現介面
type student struct
func
(s *student)
helloworld()
//預設型別實現介面
type int int
func
(i *int)
helloworld()
helloworld介面的呼叫
//自定義型別呼叫介面
s :=
&student
var h hello
h = s
h.helloworld()
//預設型別呼叫介面
var i int
h = i
h.helloworld
()
常見多型的實現方式//多型:只有乙個函式,實現不同功能
func
test
(h hello)
func
main()
test
(s)]
介面的繼承type humaner inte***ce
type person inte***ce
//自定義資料型別
type student struct
//hello介面的實現
func
(s *student)
hello()
//helloworld介面的實現
func
(s *student)
helloworld
(str string
)//介面的呼叫
func
main()
//例項化乙個結構體
p = s
p.hello()
//呼叫繼承的hello介面
p.hellowoeld()
//呼叫自身的helloworld介面
}
介面的轉換
超級可以轉換為子集,子集不能轉換為超集。
var p person //超集
var h humaner //子集
p = h //錯誤
h = p //正確
空介面
空介面不包含任何方法,因此,所有的型別都可以實現空介面。
空介面可以儲存任何型別的值
var v1 inte***ce=1
//將int型別賦值給空介面
var v2 inte***ce
="abc"
//將string型別賦值給空介面
空介面也可以作為函式的引數,表示該函式可以接收任意型別。常見的fmt函式就是乙個空介面函式
型別查詢
由於空介面函式可以接收任意型別的引數,因此需要型別查詢。常見型別查詢的辦法為型別斷言
//定義乙個空介面切片
i :=
make([
]inte***ce,3
)i[0]
=1i[1
]="abc「
i[2] = student
//if -- else型別斷言
//for迴圈:index為下標,data為具體的值分別是i[0],i[1],i[2]
for index,data :=
range i
}//switch 型別斷言
for index,data :=
range i
}
Go 物件導向程式設計
值語義與引用語義的區別在於賦值。值型別不會改變變數值,引用型別會改變變數值。go 語言中大多數型別都是基於值語義,包括 基本型別 如byte int bool float32 float64和string 復合型別 如陣列 array 結構體 struct 和指標 pointer 等。go語言中的陣...
go語言物件導向
go語言可通過struct宣告新的型別 新建乙個型別person type person struct var p1 person p1.name liming p1.age 18新建乙個型別student,可以通過匿名欄位將person所有欄位隱式引入student type student st...
GO語言物件導向
當初開發go語言的時候就是因為c 的特性太過於繁雜,從而使得很多c 的開發者因為c 的特性而頭疼,go語言成功的精簡了c 的特性,使其很簡潔,很少的特性,卻可以完成很多的事情。go語言中並沒有像c j a語言中這類的class,它只含有像c語言中的結構體,用結構體和指標等特性,完成乙個類的作用,很巧...