知識點預(yù)覽
1.Golang中的結(jié)構(gòu)體的區(qū)別
2.結(jié)構(gòu)體的聲明
3.結(jié)構(gòu)體方法的使用
4.結(jié)構(gòu)體方法與函數(shù)的區(qū)別
1.golang中嚴(yán)格意義上是沒有oop的思想,只是通過結(jié)構(gòu)體的方式來實現(xiàn)了面向?qū)ο?2.golang中沒有類,通過結(jié)構(gòu)體可以實現(xiàn)同等的地位
3.golang中去除了傳統(tǒng)的oop語法,繼承,重載,構(gòu)造,析構(gòu),隱藏this的特性
4.golang仍然有面向?qū)ο笕筇匦?,只是實現(xiàn)和面向?qū)ο蠓椒ㄓ兴煌瑳]有extends關(guān)鍵字
5.golang中的結(jié)構(gòu)體是非常靈活的,耦合度低
//結(jié)構(gòu)體聲明與定義
type 結(jié)構(gòu)體名 struct {
結(jié)構(gòu)體屬性1 type
結(jié)構(gòu)體屬性2 type
結(jié)構(gòu)體屬性3 type
}
//定義方式1:
var 變量名 結(jié)構(gòu)體名 //把一個變量的類型聲明成之前定義的結(jié)構(gòu)體
變量名.字段1 //賦值
變量名.字段2 //
//定義方式2聲明和定義同時進行
var 變量名 結(jié)構(gòu)體 = 結(jié)構(gòu)體{} //定義同時賦值
//定義方式3
var 變量名 *結(jié)構(gòu)體= new(結(jié)構(gòu)體) //返回的是一個指針
(*變量名).字段1 = 值1 //賦值方式1
變量名.字段1 = 值1 //底層自動加上了*在這個賦值的過程中
//定義方式4
var 變量名 *結(jié)構(gòu)體= &結(jié)構(gòu)體{} //返回的是一個指針
(*變量名).字段1 = 值1 //賦值方式1
變量名.字段1 = 值1 //底層自動加上了*在這個賦值的過程中
//結(jié)構(gòu)體的傳值方式是值傳遞,結(jié)構(gòu)體屬性可以是:基本數(shù)據(jù)類型,數(shù)組,map,切片等
//定義一個結(jié)構(gòu)體
type Person struct {
Name string
}
//定義一個結(jié)構(gòu)體方法
func (p Person) test() { //其中p可以隨便相當(dāng)于形式參數(shù)
fmt.Println(p.Name)
}
func main() {
var p1 Person
p1.Name = "張三"
p1.test()
}
細節(jié):在結(jié)構(gòu)體中指針形式(*a1).xx() 等價 a1.xx();(&a1).name
等價 a1.name 因為結(jié)構(gòu)體底層自動轉(zhuǎn)化了
//函數(shù)
func 函數(shù)名(形參 type){
函數(shù)體
}
函數(shù)名() //調(diào)用時候形參定義了什么類型傳遞時候也是對應(yīng)類型,否則無效
//結(jié)構(gòu)體方法
func(形參 結(jié)構(gòu)體) 方法名(形參){
}
&變量.方法 //這里比較容易混淆的,結(jié)構(gòu)體方法以方法中的類型即(形參)為主
如果不是指針則不會改變,是go語言底層自動轉(zhuǎn)換導(dǎo)致的