说我有这样的东西:
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,它将无法编译。
答案 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
由于v
是interface
类型,因此无法检索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
}