面相对象:

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