Go 将接口{}强制转换为类型
假设我有这样的东西:Go 将接口{}强制转换为类型,go,Go,假设我有这样的东西: type Foo struct{ Bar string } func Exported (v interface{}){ // cast v to Foo } 在导出的func中是否有将v强制转换为Foo的方法 我尝试了如下类型断言: func Exported (v interface{}){ v, ok := v.(Foo) if !ok { log.Fatal("oh fuk") } // but v.Bar is not a
type Foo struct{
Bar string
}
func Exported (v interface{}){
// cast v to Foo
}
在导出的func中是否有将v强制转换为Foo的方法
我尝试了如下类型断言:
func Exported (v interface{}){
v, ok := v.(Foo)
if !ok {
log.Fatal("oh fuk")
}
// but v.Bar is not available here tho ??
}
问题是,如果我尝试在断言之后访问v.Bar,它将无法编译。我犯了这个错误:
func main() {
f := Foo{"test"}
Exported(f)
}
type Foo struct{
Bar string
}
func Exported (v interface{}){
t, ok := v.(Foo)
if !ok {
log.Fatal("boom")
}
fmt.Println(t.Bar)
}
func Exported (v interface{}){
v, ok := v.(Foo)
if !ok {
log.Fatal("oh fuk")
}
// but v.Bar is not available here tho ??
}
您需要使用不同的变量名:
func Exported (x interface{}){
v, ok := x.(Foo)
if !ok {
log.Fatal("oh fuk")
}
// now v.Bar compiles without any further work
}
问题在于变量名
v
。请参考下面的代码
func Exported (v interface{}){
v, ok := v.(Foo)
if !ok {
log.Fatal("oh fuk")
}
// but v.Bar is not available here tho ??
}
这里,接口名是v
,在类型转换之后,它被分配给变量v
由于v
是interface
类型,因此无法检索Foo
struct的值
要解决这个问题,请在类型转换中使用另一个名称,如
b, ok := v.(Foo)
使用b.Bar
工作示例如下:
package main
import (
"log"
"fmt"
)
func main() {
foo := Foo{Bar: "Test@123"}
Exported(foo)
}
type Foo struct{
Bar string
}
func Exported (v interface{}){
// cast v to Foo
b, ok := v.(Foo)
if !ok {
log.Fatal("oh fuk")
}
fmt.Println(b.Bar)
}
看我的答案,有一种方法可以避免你不得不做更多的工作-你必须继续投v-to-Foo,即使在断言之后,我的方式你不必。你很幸运我很酷,你明白了,感谢所有投票tyGo根本不支持投。仅限类型转换。如果您阅读编译错误,它会告诉您为什么它不起作用,并且应该提供足够的信息来找到有效的解决方案。我不知道您描述的行为在任何严格类型语言中都能起作用。你是吗?