我断言指向 struct 的指针的类型是在golang中实现接口,下面的代码示例中有一些我不理解的地方:

package main

import (
    "fmt"
)

type MyStruct struct {
    Name string
}

func (m *MyStruct) MyFunc() {
    m.Name = "bar"
}

type MyInterface interface {
    MyFunc()
}

func main() {
    x := &MyStruct{
        Name: "foo",
    }
    var y interface{}
    y = x
    _, ok := y.(MyInterface)
    if !ok {
        fmt.Println("Not MyInterface")
    } else {
        fmt.Println("It is MyInterface")
    }
}

因为y是一个指向MyStruct的指针,所以我本以为是_, ok := y.(*MyInterface).为什么我不能断言它是指针?

推荐答案

类型断言用于查找接口中包含的对象的类型.因此,y.(MyInterface)起作用,因为接口y中包含的对象是*MyStruct,它实现了MyInterface.然而,*MyInterface不是一个接口,它是一个指向接口的指针,所以您断言的是y是否是*MyInterface,而不是y是否实现了MyInterface.只有在以下情况下,才能成功:

var x MyInterface
var y interface{}
y=&x
_, ok := y.(*MyInterface)

Go相关问答推荐

gorm插入不支持的数据

Go Net/http路由

错误&对象已被Golang在K8s操作符上修改

我怎样才能改进这个嵌套逻辑以使其正常工作并提高性能

Golang:访问any类型泛型上的字段

在 GoLang 中对自定义 struct 体数组进行排序

在VSCode中如何使用特定的文件名提供编译命令

Go 中的 YAML 自定义标签

Kubo,来自 IpfsNode.Bootstrap 的无效内存地址或零指针取消引用

Yocto 无法交叉编译 GoLang Wails 应用程序

在 Go 中公开公共 JWK

Go 中的 HTTP 请求验证中间件

从动态输入中提取字符串,其中部分字符串可能不存在

有没有办法将 yaml node 添加到 golang 中现有的 yaml 文档中?

在我的情况下,如何以正确的方式测试方法?

Golang 有类似 C++ 的 decltype 的东西吗?

Golang 'defer' 导致发送(接收)API 响应延迟

Go Flag 用法 描述 包含 Word 值

如何使用 httputil.ReverseProxy 设置 X-Forwarded-For

如何使用 fyne 避免 GUI 应用程序中的循环依赖?