type
给类型起别名 相当于 C的typedef
package mainimport "fmt"func main() {// 给类型起别名// type 类型名 类型type INT intvar a INTfmt.Println(a)}
定义结构体
package mainimport "fmt"type Person struct {name stringage int}func main() {var p Personp.name="JackMa"p.age=56fmt.Printf("%+v",p)}
{name:JackMa age:56}
封装
package mainimport "fmt"type Person struct {name stringage int}// 当前this是对象的拷贝func (this Person)print() {fmt.Printf("%#v\n",this)}// 如果需要修改值则需要指针func (this *Person)setValue(name string) {this.name=name}func main() {var p Personp.name="JackMa"p.age=56fmt.Printf("%+v\n",p)p.print()p.setValue("aaaa")p.print()}
{name:JackMa age:56}main.Person{name:"JackMa", age:56}main.Person{name:"aaaa", age:56}
继承
package mainimport ("fmt""reflect")type Animal struct {}func (this *Animal)Eat() {fmt.Printf("Obj:%v Eat\n",reflect.TypeOf(this))}func (this *Animal)Drink() {fmt.Printf("Obj:%v Drink\n",reflect.TypeOf(this))}type Dog struct {// 自动继承 Animal的所有方法Animal}// 重写父类方法func (this *Dog)Eat() {fmt.Printf("Obj:%v Eat\n",reflect.TypeOf(this))}func main() {// 创建一个子类对象dog :=Dog{Animal{}}// 子类方法dog.Eat()// 父类方法dog.Drink()}
Obj:*main.Dog EatObj:*main.Animal Drink
多态
- 接口本质上就是一个指针
- 如果一个类包含接口的所有方法则默认实现该接口
- 使用接口实现多态(父对象指针指向子对象)
package mainimport ("fmt""reflect")// 定义一个接口type Pen interface {Write()GetColor() string}// 一个类实现 interface 中所有方法则自动实现这个接口type Pencil struct {color string}func (this *Pencil) GetColor() string {return this.color}func (this *Pencil) Write() {fmt.Printf("Obj:%v Write\n", reflect.TypeOf(this))}// 一个类实现 interface 中所有方法则自动实现这个接口type Chalk struct {color string}func (this *Chalk) GetColor() string {return this.color}func (this *Chalk) Write() {fmt.Printf("Obj:%v Write\n", reflect.TypeOf(this))}func write(pen Pen) {pen.Write()}func main() {/*// 父类接口 本质上是一个指针var pen Penpen= &Pencil{"red"}write(pen)write(&Chalk{"white"})*/pencil:=Pencil{"red"}chalk:=Chalk{"white"}write(&pencil)write(&chalk)}
Obj:*main.Pencil WriteObj:*main.Chalk Write
