golang-方法和接口

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 }
View Code

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 }
View Code

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 }
View Code

 

原文地址:https://www.cnblogs.com/quguanwen/p/11754495.html