You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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指针
}

关键修改说明

  1. 类型断言时直接获取断言后的指针变量ptr,避免重复断言操作
  2. 通过*ptr解引用指针,直接修改指针指向的切片内容——这会直接作用到main函数中传入的原始切片变量
  3. 无需再给arr赋值,因为我们操作的是原始指针指向的内存区域,而非函数内部的arr副本

内容的提问来源于stack exchange,提问作者han

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 19:27:29