我对以下Go代码感到非常困惑。谁能告诉我为什么
worker=u
和work=&u
有效吗? worker=p
有效吗? worker=&p
无效? 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
}
答案 0 :(得分:1)
worker=u
和work=&u
是有效的,因为User
实现Worker
的所有方法,在这种情况下,只有Work
方法具有接收者的值。值方法可以在值和指针上调用。
worker=p
无效,因为People
实现了带有接收者指针的Work
方法。因此,如果您将People
的任何值分配给Worker
指针,则将不会使用Work
方法。这就是为什么它无效的原因。
worker=&p
有效,因为People
实现了Work
方法。
User和People是实现相同接口Worker
的两个不同结构。这样可以确保两者都有一个名为Work
的方法,但是实现可能有所不同。
package main
import (
"fmt"
)
type Worker interface {
Work()
}
type User struct {
name string
}
func (u User) Work() {
fmt.Printf("Name : %s\n", u.name)
}
type People struct {
name string
}
func (p *People) Work() {
fmt.Printf("Name : %s\n", 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()
}