Golang中如何读取any类型及any[]数组对象?代码报错求助
问题解决:Go类型断言失败的原因与修复
问题根源
你在代码中把Location的指针赋值给了DataRow(row1.DataRow = &Location{"YourHome", "GoHome"}),但后续类型断言时却使用了值类型Location,两者类型不匹配,导致运行时panic。
修复方案(二选一即可)
方案1:断言为指针类型
既然存的是指针,断言时就要对应*Location类型,Go允许直接通过指针访问结构体字段(自动解引用):
package main import "fmt" type Location struct { Name string Home string } type MyRow struct { Type int DataRow any } type MyTransaction struct { TID int Rows []MyRow } type SoftTran map[int]MyTransaction var MapTran SoftTran func main() { MapTran = make(SoftTran) var TT1 MyTransaction var row1 MyRow row1.Type = 100 row1.DataRow = &Location{"YourHome", "GoHome"} TT1.Rows = append(TT1.Rows, row1) for _, row := range TT1.Rows { switch row.Type { case 100: // 断言为指针类型 val := row.DataRow.(*Location) fmt.Printf("%s %s\n", val.Home, val.Name) default: } } }
方案2:存储值类型而非指针
如果不需要指针,直接把Location值赋值给DataRow,保持断言和存储类型一致:
package main import "fmt" type Location struct { Name string Home string } type MyRow struct { Type int DataRow any } type MyTransaction struct { TID int Rows []MyRow } type SoftTran map[int]MyTransaction var MapTran SoftTran func main() { MapTran = make(SoftTran) var TT1 MyTransaction var row1 MyRow row1.Type = 100 // 直接赋值值类型 row1.DataRow = Location{"YourHome", "GoHome"} TT1.Rows = append(TT1.Rows, row1) for _, row := range TT1.Rows { switch row.Type { case 100: val := row.DataRow.(Location) fmt.Printf("%s %s\n", val.Home, val.Name) default: } } }
额外建议
为了避免类似类型不匹配的panic,推荐使用带ok的类型断言,这样可以优雅处理类型不匹配的情况,避免程序崩溃:
val, ok := row.DataRow.(*Location) if !ok { fmt.Println("类型断言失败") return } fmt.Printf("%s %s\n", val.Home, val.Name)
内容的提问来源于stack exchange,提问作者AeJ
相关产品推荐
相关产品推荐

