GO语言结构体方法跟结构体指针方法的区别 - Go语言中文社区

GO语言结构体方法跟结构体指针方法的区别


首先,我定了三个接口、一个结构和三个方法:

type DeptModeA interface {
    Name() string
    SetName(name string)
}

type DeptModeB interface {
    Relocate(building string, floor uint8)
}

type Dept struct {
    name     string
    building string
    floor    uint8
    Key      string
}

func (self Dept) Name() string {
    return self.name
}

func (self Dept) SetName(name string) {
    self.name = name
}

func (self *Dept) Relocate(building string, floor uint8) {
    self.building = building
    self.floor = floor
}

而后我写了一些测试代码:

dept1 :=
    Dept{
        name:     "MySohu",
        building: "Internet",
        floor:    7}
switch v := interface{}(dept1).(type) {
case DeptModeFull:
    fmt.Printf("The dept1 is a DeptModeFull.n")
case DeptModeB:
    fmt.Printf("The dept1 is a DeptModeB.n")
case DeptModeA:
    fmt.Printf("The dept1 is a DeptModeA.n")
default:
    fmt.Printf("The type of dept1 is %vn", v)
}
deptPtr1 := &dept1
if _, ok := interface{}(deptPtr1).(DeptModeFull); ok {
    fmt.Printf("The deptPtr1 is a DeptModeFull.n")
}
if _, ok := interface{}(deptPtr1).(DeptModeA); ok {
    fmt.Printf("The deptPtr1 is a DeptModeA.n")
}
if _, ok := interface{}(deptPtr1).(DeptModeB); ok {
    fmt.Printf("The deptPtr1 is a DeptModeB.n")
}

打印出的内容:

The dept1 is a DeptModeA.

The deptPtr1 is a DeptModeFull.

The deptPtr1 is a DeptModeA.

The deptPtr1 is a DeptModeB.

 

假设T是struct,那么Go里面遵循下面几个原则:

  • T的方法集仅拥有 T Receiver (方法中的接受者)方法。
  • *T 方法集则包含全部方法 (T + *T)。

所以你上面的例子dept1应该是拥有方法:Name和SetName

而&dept1拥有方法:Name、SetName和Relocate

这个就是Go里面在设计方法的时候需要注意Receiver的类型

转载于:https://my.oschina.net/u/1186749/blog/827341

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_34247155/article/details/92084363
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-01 19:41:49
  • 阅读 ( 913 )
  • 分类:Go

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢