/*
type TYPENAME struct {
name type
...
}
*/html
type person struct { name, city string //這裏上下類型的位置最好對上,可使用go fmt完成代碼格式化 age int8 } //1.定義 var p1 person p1.name = "" ... //2.定義並賦值 p2 := person{ name: " " //name:能夠略去,此時必須初始化全部字段且與定義順序一致 city: "" age:20 } //3. var p3 = new(person) //p3:=&person{} (*p3).name = "" p3.city="" //能夠直接調用指針結構體中的字段
匿名類python
var user struct { name string age int } user.name = "Joko" user.age = 80 fmt.Printf("p1:%#v\n", user)
方法就是類內函數,也不知道go是怎麼神奇的將零散的方法整合成一個大結構
接收者是一個我沒據說過的概念,學習以後感受做用相似與this指針函數
//構造函數,習慣上命名爲NewStructName func NewPerson(name string,age int) *Person { return &Person{ name:name, age:age, } }
//(p Person)就是接收者啦,慣例取類第一個字母小寫爲名,這裏是值接收者 func (p Person) Dream() { fmt.Printf("%s is dreaming\n",p.name) } //指針接收者在修改內部數據上更有優點(本身聲明的this) func (p *Person) SetAge(age int) { p.age = age }
Go的官方迴應Go是否爲面對對象語言時表示yes and no,
yes :Go 具有不少面對對象的特性
no:但Go又不像C++或Java那麼強硬的封裝學習
type Address struct { city string } type Person2 struct { name string age int Address //Address類以匿名類形式進行組合 } p2 := Person2{ name: "JOKO", age: 10, Address: Address{"hk"}, } fmt.Printf("%#v\n",p2) fmt.Println(p2.city) //直接訪問匿名結構體字段,前提是不存在字段衝突 //若是不使用匿名類調用方式:p2.Address.city
type Animal struct { name string } func (a *Animal) move() { fmt.Printf("%s move",a.name) } type Dog struct { feet int *Animal } func (d *Dog) wang() { fmt.Printf("%s www",d.name) } d.wang() d.move()
繼承與多態,可是沒有任何明確的說繼承這個字眼this
接口其餘都無論,就認方法,實現方法就是實現了接口。指針
type sayer interface { say() }
func (p Person) say() { fmt.Println("Hi") } //實現接口 func sayHi(arg sayer) { arg.say() }
type Sayer interface { say() } //實現多個接口 type Runer interface { run() } //接口嵌套 type animal interface { Sayer Runer }
空接口 interface{}
神奇的一個東西:任何類型都實現空接口,因此空接口能夠存儲任意類型值
這是Go的泛型?code
type xxx interface { }
var x interface{} //直接聲明空接口變量x x = "Hello" //x 能夠實現任意變量 fmt.Println(x) x = 123 fmt.Println(x) x = false fmt.Println(x) var m = make(map[string]interface{},16) m["name"] = "Pallava" m["age"] = 18 m["hobby"] = []string{"sing","jump","rap"} fmt.Println(m)
//斷言:判斷空接口存的值的類型 ret,ok:= x.(bool) if !ok { fmt.Println("not bool") } else { fmt.Println("is bool",ret) }
很明顯,Go的語言出乎意料的精煉高效,像開發python同樣愉快的開發C++般功能的項目。
但願Go愈來愈強大(後浪!)
那麼朋友,人生苦短,Let's GO!htm