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 }