将界面{}转换为类型

时间:2018-12-03 04:44:43

标签: go

说我有这样的东西:

type Foo struct{
   Bar string
}

func Exported (v interface{}){
 // cast v to Foo
}

是否可以在导出的函数中将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,它将无法编译。

3 个答案:

答案 0 :(得分:3)

问题出在变量名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 由于vinterface类型,因此无法检索Foo结构的值。

要解决此问题,请在类型转换中使用另一个名称,例如

b, ok := v.(Foo)

您将可以使用Bar来获得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)
}

答案 1 :(得分:2)

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)
}

答案 2 :(得分:1)

我犯了这个错误:

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

}