package main
import (
"fmt"
)
type Printer interface {
Print() string
}
type MyStruct struct {
Data []int
}
func (m MyStruct) Print() string {
if len(m.Data) == 0 {
return "Data is an empty slice"
}
return fmt.Sprintf("%v", m.Data)
}
接口类型断言问题及解决办法
- 可能遇到的问题:在进行接口类型断言时,如果实际类型不是
MyStruct
,会导致类型断言失败,引发运行时错误。例如:
func main() {
var p Printer = &MyStruct{Data: []int{1, 2, 3}}
if ms, ok := p.(*MyStruct); ok {
fmt.Println(ms.Print())
} else {
fmt.Println("Type assertion failed")
}
// 如果 p 实际指向的不是 *MyStruct 类型,ok 会为 false,此时若直接使用 ms 会导致运行时错误
}
- 解决办法:使用类型断言时采用带检测的方式,如上述代码中使用
if ms, ok := p.(*MyStruct); ok
这种方式,先判断类型断言是否成功,ok
为true
时才对ms
进行操作,避免运行时错误。另外,也可以使用switch
语句进行类型断言,这样可以同时处理多种类型:
func main() {
var p Printer = &MyStruct{Data: []int{1, 2, 3}}
switch v := p.(type) {
case *MyStruct:
fmt.Println(v.Print())
default:
fmt.Println("Unexpected type")
}
}