go - 是否需要使用类型断言来访问接口(interface)返回的类型的值?

标签 go type-conversion go-interface

当我有一个返回接口(interface)类型的函数时,返回的值无法按我的预期工作。也就是说,它严格按照定义的接口(interface)运行,并且要访问接口(interface)中未定义的方法和值,我必须进行类型断言。为什么?

考虑以下示例代码:

package main

import (
    "fmt"
)

type Frobnicator interface {
    Frobnicate()
}

type Foo struct {
    Value  string
}

func (f *Foo) Frobnicate() {
    fmt.Printf("The value is %s\n", f.Value)
}

func fooFactory () Frobnicator {
    return &Foo{"chicken"}
}

func main() {
    foo := fooFactory( )
    foo.Frobnicate()
    // foo.Value undefined (type Frobnicator has no field or method Value)
    // fmt.Printf("foo value = %s\n", foo.Value)
    bar := foo.(*Foo)
    fmt.Printf("bar value = %s\n", bar.Value)
}

是否有更好、更简单、更惯用的方式来获取 foo.Value?或者类型断言真的是最好的方法吗?

最佳答案

不知道在这里回答什么。也许对接口(interface)类型存在误解。接口(interface)类型绝对是普通类型。您可以使用接口(interface)值执行接口(interface)所说的操作:调用接口(interface)方法。对于结构类型,您可以访问结构类型定义的字段并调用接口(interface)方法。所以一切都简单明了:类型允许它允许的东西,无论是接口(interface)还是结构。

现在接口(interface)类型的值可能包含一些结构值(比如说)。到目前为止,这仍然是隐藏的。类型断言揭示了结构体值(并且不再有接口(interface))。您可以在接口(interface)中隐藏其他结构值(假设它实现了正确的方法),这可能没有 Value 字段。这清楚地表明,如果没有类型断言,您就无法访问 Value 字段,因为它可能不存在。

关于go - 是否需要使用类型断言来访问接口(interface)返回的类型的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27131831/

相关文章:

go - 使用 Golang 客户端在 Kubernetes 中创建 Secret 的问题

go - time.sleep 在 fork 后卡住程序(Go)

c++ - 无法将字符串类型转换为 bool C++

java - 如何使用java将制表符分隔的 ".txt"文件转换为Excel ".xls"格式?

go - 类型转换接口(interface) slice

Golang 类型断言/转换为中间结构

go - 如何从 .kube/config 中设置的当前上下文获取命名空间

c# - 在 C# 中将 double 转换为 float 给出错误的值

go - 如何从 Go 中的结构中的接口(interface)实例获取属性

performance - 如何有效地在文件中插入 byte slice ?