🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 一、定义 ![](https://img.kancloud.cn/8f/6a/8f6ab308759b925d81de7677046121e9_604x320.png) ## 二、实例 #### 为类型添加方法 * 基础类型作为接受者 ~~~ package main import "fmt" type myint int func Add(a,b myint) myint { return a+b } func (a myint)Add2(b myint) myint { return a+b } func main() { var aa myint = 10 var bb myint = 10 // 面向过程调用 fmt.Println("Add(a+b)",Add(aa,bb)) //面向对象调用 fmt.Println("Add(a+b)",aa.Add2(bb)) } ~~~ * 结构体作为接收者 ~~~ package main import "fmt" // 结构体 type User struct { Id int Name string Age int } //给User添加方法 func (u User) userInfos(){ fmt.Println(u.Id,u.Name,u.Age) } func main() { user := User{Id: 1,Name: "aaa",Age: 20} user.userInfos() } ~~~ ## 三、值语义和引用语义 ~~~ package main import "fmt" // 结构体 type User struct { Id int Name string Age int } // 引用语义 func (u *User) func001(){ (*u).Id = 1 u.Name = "aaa" //这里的 u 会被转化成 (*u) u.Age = 18 //这里的 u 会被转化成 (*u) } // 值语义 func (u User) func002(){ u.Id = 2 u.Name = "bbb" u.Age = 20 } func main() { // 指针作为接收者的效果 u1 := User{1,"a1",180} fmt.Println("函数调用前",u1) (&u1).func001() fmt.Println("函数调用后",u1) // 值作为接收者 u2 := User{2,"b1",250} fmt.Println("函数调用前",u2) u2.func002() fmt.Println("函数调用后",u2) } ~~~ 结果为: 函数调用前 {1 a1 180} 函数调用后 {1 aaa 18} 函数调用前 {2 b1 250} 函数调用后 {2 b1 250} ## 四、方法的继承 ~~~ package main import "fmt" // 结构体 type User struct { Id int Name string Age int } // 为User 定义方法 func (u *User) func001(){ fmt.Printf("%d,%s,%d\n",u.Id,u.Name,u.Age) } //继承上面的方法 type Addrs struct { User addr string sex string } func main() { u1 := User{1,"aaa",20} u1.func001() u2 := Addrs{User{2,"bbb",18},"sh","nan"} u2.func001() } ~~~ ## 五、方法重写 ~~~ package main import "fmt" // 结构体 type User struct { Id int Name string Age int } // 为User 定义方法 func (u *User) func001(){ fmt.Printf("我是被重写的方法:%d,%s,%d\n",u.Id,u.Name,u.Age) } //继承上面的方法 type Addrs struct { User addr string sex string } //方法重写 func (a *Addrs) func001(){ fmt.Printf("我是重写:%d,%s,%d\n",a.Id,a.Name,a.Age) } func main() { u1 := User{1,"aaa",20} u1.func001() u2 := Addrs{User{2,"bbb",18},"sh","nan"} u2.func001() // 显式调用 u2.User.func001() } ~~~ 运行结果: ~~~ package main import "fmt" // 结构体 type User struct { Id int Name string Age int } // 为User 定义方法 func (u *User) func001(){ fmt.Printf("我是被重写的方法:%d,%s,%d\n",u.Id,u.Name,u.Age) } //继承上面的方法 type Addrs struct { User addr string sex string } //方法重写 func (a *Addrs) func001(){ fmt.Printf("我是重写:%d,%s,%d\n",a.Id,a.Name,a.Age) } func main() { u1 := User{1,"aaa",20} u1.func001() u2 := Addrs{User{2,"bbb",18},"sh","nan"} u2.func001() // 显式调用 u2.User.func001() } ~~~ ## 六、方法值和方法表达式 ~~~ package main import "fmt" // 结构体 type User struct { Id int Name string Age int } // 为User 定义方法 func (u *User) func001(){ // %p是地址 %v是值 fmt.Printf("%p,%v\n",u,u) } func main() { u1 := User{1,"aaa",20} u1.func001() // go语义方法值特性 fun1 := u1.func001 fun1() // Go方法表达式特性 u2 := (*User).func001 u2(&u1) } ~~~ ## 七、创建get和set方法并进行调用 ~~~ package main import "fmt" // 结构体 type User struct { Id int Name string Age int } func (u *User) setname() { u.Name = "aa" } func (u User) getname() string { return u.Name } func (u User) bite() { fmt.Printf("%s",u.Name) } func fun001(){ //创建对象 d := User{1,"二哈",2} d.bite() } func main() { fun001() } ~~~ 结果为: 二哈