面相对象:
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) // 显示把接收者传递过去
}