Golang中接口和结构体之间转换的方法


在Golang中,接口和结构体之间的转换涉及到类型断言类型断言的操作符

接口转结构体

如果我们有一个接口变量,并且我们知道它的内部具体类型,我们可以使用类型断言来将其转换为该具体类型的结构体

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

结构体转接口

在Golang中,任何类型T的非空值都满足接口类型T,所以可以直接将结构体类型值赋值给接口类型变量

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进行安全的类型断言

如果我们不确定接口变量的内部类型是否为我们想要的类型,我们可以使用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")
    }
}
posted @ 2024-10-15 11:06  guanyubo  阅读(81)  评论(0编辑  收藏  举报