go - 关于接口分配的困惑
问题描述
我对以下 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
作为implementsWork
方法是有效的。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()
}
推荐阅读
- sass - sass @each 奇怪的行为
- android - 在 Android 中模拟类似 Instagram 的动作效果
- java - 从随机字符串中获取日期模式
- .net - 将任意数据与 COM 线程上下文相关联
- firebase - 收到 Xamarin 表单推送通知但未显示/出现
- python - 使用 MongoDB 的嵌套文档创建 Pandas 表
- c++ - 为什么我会在此遇到“标准输出无响应”错误?
- r - SVM 插入符号错误:“无法计算标准偏差......缺少 TRUE/FALSE 需要的值”
- python-3.x - 如何使用 python selenium 选择 jira 中的第一个条目
- xml - 如果事先不知道 Java 对象,如何将 XML 转换为 Java 对象?