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
}

然後我寫了一些測試代碼:ui

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 %v\n", 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裏面遵循下面幾個原則:code

  • T的方法集僅擁有 T Receiver (方法中的接受者)方法。
  • *T 方法集則包含所有方法 (T + *T)。

因此你上面的例子dept1應該是擁有方法:Name和SetName接口

而&dept1擁有方法:Name、SetName和Relocatestring

這個就是Go裏面在設計方法的時候須要注意Receiver的類型it

相關文章
相關標籤/搜索