go 方法
来源:原创
时间:2019-03-07
作者:脚本小站
分类:GoLang
面相对象:
package main import "fmt" type long int // 方法,面向对象编程 func (tmp long) Add(other long) long{ return tmp + other } func main(){ var a long = 2 b := a.Add(3) fmt.Println(b) }
结构体添加方法:
package main import "fmt" type Person struct{ name string sex byte age int } func (tmp Person) PrintInfo(){ fmt.Println(tmp) } func main(){ p := Person{"hhh",'m',18} p.PrintInfo() }
通过方法设置结构体属性:
package main import "fmt" type Person struct{ name string sex byte age int } func (tmp Person) PrintInfo(){ // 类型Person不一样方法PrintInfo是可以重复出现的 fmt.Println(tmp) } func (p *Person) SetInfo(n string, s byte, a int){ p.name = n p.sex = s p.age = a } func main(){ p := Person{"hhh",'m',18} p.PrintInfo() var p2 Person (&p2).SetInfo("aaa",'m',11) // 初始化值,类似__construct p2.PrintInfo() //调用方法 }
指针类型方法集和普通类型方法集:
package main import "fmt" type Person struct { name string sex byte age int } // 普通方法 func (p Person) SetInfoValue() { fmt.Println("SetInfoValue") } // 指针方法 func (p *Person) SetInfoPointer() { fmt.Println("SetInfoPointer") } func main() { // 指针结构体可以调用普通方法和指针方法 p := &Person{"haha", 'm', 18} p.SetInfoPointer() p.SetInfoValue() (*p).SetInfoPointer() (*p).SetInfoValue() // 普通结构体也可以调用指针方法和普通方法 p1 := Person{"huhu", 'f', 19} p1.SetInfoPointer() p1.SetInfoValue() (&p1).SetInfoPointer() (&p1).SetInfoValue() }
方法的继承:
package main import "fmt" // Person的结构体 type Person struct { name string sex byte age int } // Person的方法 func (p *Person) PersonInfo() { fmt.Println(p.name, p.age, p.sex) } // Student的结构体 type Student struct { Person id int addr string } func main() { s := Student{Person{"hhhh", 'm', 18}, 1, "bbbbbb"} s.PersonInfo() }
方法的重写:
package main import "fmt" // Person的结构体 type Person struct { name string sex byte age int } // Person的方法 func (p *Person) PersonInfo() { fmt.Println(p.name, p.age, p.sex) } // Student的结构体 type Student struct { Person id int addr string } // Person的方法 func (p *Student) PersonInfo() { fmt.Println(p.name, p.age, p.sex, p.id, p.addr) } func main() { s := Student{Person{"hhhh", 'm', 18}, 1, "bbbbbb"} s.PersonInfo() //person和student都有PersonInfo方法,就近原则调用student的方法 // 如果一定要调用person中的PersonInfo方法就需要显示调用 s.Person.PersonInfo() }
方法值:
package main import "fmt" type Person struct { name string sex byte age int } func (p Person) SetInfoValue() { fmt.Printf("SetInfoValue %p %v\n", &p, p) } func (p *Person) SetInfoPointer() { fmt.Printf("SetInfoPointer %p %v\n", &p, p) } func main() { p := Person{"hhh", 'm', 12} p.SetInfoPointer() pFunc := p.SetInfoPointer pFunc() //等价于p.SetInfoPointer() }
方法表达式:
package main import "fmt" type Person struct { name string sex byte age int } func (p Person) SetInfoValue() { fmt.Printf("SetInfoValue %p %v\n", &p, p) } func (p *Person) SetInfoPointer() { fmt.Printf("SetInfoPointer %p %v\n", &p, p) } func main() { p := Person{"hhh", 'm', 12} f := (*Person).SetInfoPointer f(&p) // 显示把接收者传递过去 p.SetInfoPointer() f2 := (Person).SetInfoValue f2(p) // 显示把接收者传递过去 }