go - 接口(interface)函数/"cast"在golang中实际上做了什么?

标签 go

我对 golang 比较陌生,我正在研究的项目有这种模式重复了好几次:

package foo

type Foo interface {
    Bar() int
}

type foo struct {
}

func (f *foo) Bar() int {
    return 42
}

func New() Foo {
    // why?
    return Foo(&foo{})
}

如果我用 return &foo{} 替换最后一个函数中的 returns 语句,一切都会像我预期的那样正常工作......如果我理解正确的话,它就是鸭子类型。那么使用 Foo(...) 函数有什么意义呢?当您将内置类型(例如 int)包装在可能具有方法的类型中时,将类型用作函数似乎可以工作。我很好奇作者在这里的意图。如果它包含在语言规范中,我无法找到它。

最佳答案

表达式 Foo(x) 是 conversion 。这里不需要转换,因为 *fooassignableFoo。代码应该写成:

func New() Foo {
  return &foo{}
}

关于go - 接口(interface)函数/"cast"在golang中实际上做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41883830/

相关文章:

struct - 您可以将结构字段名传递给 golang 中的函数吗?

docker - 在 Linux 上使用 confluent-kafka-go 构建 Go 应用程序

go - 如何在没有指数的情况下从 json 的 map[string]interface{} 格式化 int 数字?

go - 无法导入 gorilla/mux(github.com/gorilla/mux@v1.7.4 : is explicitly required in go. mod,但在 vendor/modules.txt 中未标记为显式)

Golang 函数包含匿名作用域

go - 如何在链表的给定索引处插入节点

docker - golang 通过复制 vendor 文件夹构建

go - 来自多个测试用例的类似 sqlmock 期望导致 false 失败

go - 使用 golang 播放音频文件

go - 接口(interface)内反射阵列