我对下面的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
}
-
worker=u
和work=&u
是有效的,因为在这种情况下User
实现所有Worker
方法,在这种情况下,只有Work
带有接收器值的方法。值方法可以在值和指针上调用。 -
worker=p
无效People
因为Work
方法与接收器的指针。因此,如果您将People
的任何值分配给指针Worker
那么 if 将不会Work
方法。这就是为什么它是无效的。 -
worker=&p
有效,因为People
实现了Work
方法。 -
用户和人员是实现相同接口
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()
}