Go语言中如何将nil接口转为结构体?解决F函数赋值无效问题
问题解决:修改func F以正确更新传入的切片指针
你当前的代码里,F函数中对arr的赋值只是修改了函数内部的局部变量(arr是传入指针的副本),并没有改变原始切片变量的指向。因为Go的参数传递是值传递,哪怕是interface{}类型,传入的也是原始值的副本,直接给arr赋值新的切片指针不会影响到main函数里的humans或cats变量。
修改后的完整代码
package main import ( "fmt" ) type Human struct { Name string } type Cat struct { Name string } func F(arr interface{}) { switch ptr := arr.(type) { case *[]*Human: // 解引用指针,将新切片赋值到原始变量指向的内存 *ptr = []*Human{{Name: "abc"}} case *[]*Cat: *ptr = []*Cat{{Name: "meow"}} } } func main() { var humans []*Human F(&humans) fmt.Println(humans) // 输出包含Name为"abc"的Human指针 var cats []*Cat F(&cats) fmt.Println(cats) // 输出包含Name为"meow"的Cat指针 }
关键修改说明
- 类型断言时直接获取断言后的指针变量
ptr,避免重复断言操作 - 通过
*ptr解引用指针,直接修改指针指向的切片内容——这会直接作用到main函数中传入的原始切片变量 - 无需再给
arr赋值,因为我们操作的是原始指针指向的内存区域,而非函数内部的arr副本
内容的提问来源于stack exchange,提问作者han
相关产品推荐
相关产品推荐

