This is a creation in Article, where the information may have evolved or changed.
First, I set up three interfaces, a structure, and three methods:
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}
Then I wrote some test code:
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 := &dept1if _, 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")}
What to print:
The dept1 is a DeptModeA.
The deptPtr1 is a DeptModeFull.
The deptPtr1 is a DeptModeA.
The deptPtr1 is a DeptModeB.
Assuming that T is a struct, then go follows several principles:
- The method set of T has only the method of T Receiver (the receiver in the method).
- The *t method set contains all methods (T + *t).
So your example above dept1 should be the owning method: Name and SetName
And &dept1 has methods: Name, SetName, and relocate
This is the type of receiver you need to be aware of when designing a method in go.