目录
在Golang中,接口和结构体之间的转换涉及到类型断言和类型断言的操作符。 如果我们有一个接口变量,并且我们知道它的内部具体类型,我们可以使用类型断言来将其转换为该具体类型的结构体。 在Golang中,任何类型T的非空值都满足接口类型T,所以可以直接将结构体类型值赋值给接口类型变量。 如果我们不确定接口变量的内部类型是否为我们想要的类型,我们可以使用ok-idiom来安全地执行类型断言。
接口转结构体
package main
import (
"fmt"
)
type MyInterface interface {
Show()
}
type MyStruct struct {
name string
}
func (m MyStruct) Show() {
fmt.Println(m.name)
}
func main() {
var a MyInterface
a = MyStruct{name: "John"}
b := a.(MyStruct)
b.Show()
}
结构体转接口
package main
import (
"fmt"
)
type MyInterface interface {
Show()
}
type MyStruct struct {
name string
}
func (m MyStruct) Show() {
fmt.Println(m.name)
}
func main() {
var a MyInterface
a = MyStruct{name: "John"}
a.Show()
}
使用ok-idiom进行安全的类型断言
package main
import (
"fmt"
)
type MyInterface interface {
Show()
}
type MyStruct struct {
name string
}
func (m MyStruct) Show() {
fmt.Println(m.name)
}
func main() {
var a MyInterface
a = MyStruct{name: "John"}
if b, ok := a.(MyStruct); ok {
b.Show()
} else {
fmt.Println("Not MyStruct type")
}
}