1.方法
方法类似函数 ,多了一个接收者 ,接收者是指针指向结构体(也可以是值) ,方法与结构体绑定 (可以理解为模板定义方法) ,方法位于结构体内部
方法集可以理解就是多个方法
可以组合其他结构体方法 ,直接将其他结构体类型放入属性
2.创建方法
接收者指定好对应的结构体 ,可以直接引用结构体内的所有属性和方法

1 package main
2
3 import "fmt"
4
5 type Ven struct {
6 Name string
7 address string
8 }
9
10 func (v *Ven) Name_info() string {
11 return "公司名称" + v.Name
12 }
13
14 func (v *Ven) Address_info() string {
15 return fmt.Sprintf(",公司地址%v", v.address)
16 }
17
18 func (v *Ven) Info() string {
19 return v.Name_info() + v.Address_info()
20 }
21
22 func main() {
23 a1 := Ven{
24 Name: "亚马逊",
25 address: "美国",
26 }
27
28 fmt.Println(a1.Info())
29 }
3.使用方法与指针
希望方法修改实例内部 ,方法定义指针接收者
希望方法不修改实例 ,方法定义值接收者

1 package main
2
3 import "fmt"
4
5 type Ven struct {
6 Name string
7 address string
8 remarks string
9 }
10
11 func (v *Ven) Name_info() string {
12 return "公司名称" + v.Name
13 }
14
15 func (v *Ven) Edit_remarks(in string) {
16 v.remarks = in
17 }
18
19 func (v Ven) Edit_remarks1(in string) { //值引用无法做用实例
20 v.remarks = in
21 }
22
23 func main() {
24 a1 := Ven{
25 Name: "亚马逊",
26 address: "美国",
27 }
28
29 fmt.Println("备注",a1.remarks)
30 a1.Edit_remarks("亚马逊商城退出中国")
31 fmt.Println("备注",a1.remarks)
32 a1.Edit_remarks1("亚马逊进入中国") //值引用无法做用到a1实例
33 fmt.Println("备注",a1.remarks)
34
35 }
4.接口
接口指定了方法集中所有方法的规范 ,但不实现
接口指定方法的函数签名部分
接口可以实现代码重用和完全替换实现

1 package main
2
3 import "fmt"
4
5 type DB_inter interface {
6 Read() string
7 Write() string
8 }
9
10 type RW struct {
11 }
12
13 func (r *RW) Read() string {
14 return "读取数据"
15 }
16
17 func (r *RW) Write() string {
18 return "写入数据"
19 }
20
21 type Mysql struct {
22 Name string
23 RW //继承方法 ,实现了接口
24 }
25
26 type Postgre struct {
27 Name string
28 RW //继承方法 ,实现了接口
29 }
30
31 //接口函数
32 func R(obj DB_inter) string {
33 return obj.Read()
34 }
35
36 func W(obj DB_inter) string {
37 return obj.Write()
38 }
39
40 func main() {
41 mysql := Mysql{Name: "mysql数据库"}
42 pg := Postgre{Name: "pg数据库"}
43
44 fmt.Println(R(&mysql)) //此处必须使用指针
45 fmt.Println(R(&pg)) //此处必须使用指针
46
47 }
