Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 将接口{}强制转换为类型_Go - Fatal编程技术网

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根本不支持投。仅限类型转换。如果您阅读编译错误,它会告诉您为什么它不起作用,并且应该提供足够的信息来找到有效的解决方案。我不知道您描述的行为在任何严格类型语言中都能起作用。你是吗?