关于接口分配的困惑

  • 本文关键字:分配 接口 于接口 go
  • 更新时间 :
  • 英文 :


我对下面的Go代码感到非常困惑。谁能告诉我为什么

  1. worker=uwork=&u有效?
  2. worker=p有效?
  3. worker=&p无效?
  4. 用户和人有什么区别?
package main
import (
"fmt"
)
type Worker interface {
Work()
}
type User struct {
name string
}
func (u User) Work() {
}
type People struct {
name string
}
func (p *People) Work() {
}
func main() {
var worker Worker
u := User{name:"xxx"}
worker = u  // valid
worker = &u  // valid
p := People{name:"xxx"}
worker = p  // invalid
worker = &p  // valid
}
  1. worker=uwork=&u是有效的,因为在这种情况下User实现所有Worker方法,在这种情况下,只有Work带有接收器值的方法。值方法可以在值和指针上调用。

  2. worker=p无效People因为Work方法与接收器的指针。因此,如果您将People的任何值分配给指针Worker那么 if 将不会Work方法。这就是为什么它是无效的。

  3. worker=&p有效,因为People实现了Work方法。

  4. 用户和人员是实现相同接口Worker的两个不同结构。这可确保两者都有一个名为Work的方法,但实现可能不同。

package main
import (
"fmt"
)
type Worker interface {
Work()
}
type User struct {
name string
}
func (u User) Work() {
fmt.Printf("Name : %sn", u.name)
}
type People struct {
name string
}
func (p *People) Work() {
fmt.Printf("Name : %sn", p.name)
}
func main() {
var worker Worker
u := User{name: "uuu"}
worker = u  // valid
worker = &u // valid
worker.Work()
p := People{name: "pppp"}
// worker = p  // invalid
worker = &p // valid
worker.Work()
}

最新更新