## 一、定义
![](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()
}
~~~
结果为:
二哈
- 一、数组
- 二、切片
- 三、copy
- 四、MAP
- 五、结构体
- 六、结构体参数
- 七、面向”对象“
- 1、匿名字段
- 2、方法
- 3、包和封装
- 4、接口
- 5、异常处理
- 八、Json
- 九、文件操作
- 1、写文件
- 2、读取文件内容
- 3、拷贝文件
- 十、反射
- 1、查看类型,字段和方法
- 2、查看匿名字段
- 3、修改基本类型的值
- 4、修改结构体的值
- 5、调用方法
- 十一、并发编程
- 1、并行和并发
- 2、协程
- 3、runtime包
- 5、channel的使用
- 6、close
- 7、定时器
- 8、select
- 9、协程同步锁
- 十二、socket编程
- 十三、Http编程
- 十四、并发爬虫和数据处理
- 1、简易爬虫实例
- 2、并发爬取图片
- 3、读文件中的数据
- 4、数据清洗
- 其他
- 1、推荐文章