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

Go语言中哪些类型具有指针语义?

Go语言中具有指针语义的类型

在Go语言中,所有操作都是值传递,但部分类型的底层实现包含指向共享数据的指针,因此传递这类类型的副本时,修改副本的内容会影响原始值对应的底层数据,表现出类似指针的语义。具体包括以下类型:

  • 切片(Slice):切片的本质是包含指针、长度、容量的结构体,传递切片时复制的是这个结构体,但结构体中的指针指向同一个底层数组。因此修改切片的元素(而非重新分配切片)会直接作用于原始切片的底层数据。
    示例代码:

    func modifySlice(s []int) {
        s[0] = 100
    }
    
    func main() {
        nums := []int{1, 2, 3}
        modifySlice(nums)
        println(nums[0]) // 输出 100
    }
    
  • 映射(Map):映射值本身是指向哈希表底层结构的指针,传递映射时复制的是这个指针。在函数中修改映射的键值对,会直接影响原始映射的底层数据。
    示例代码:

    func modifyMap(m map[string]int) {
        m["score"] = 95
    }
    
    func main() {
        student := make(map[string]int)
        modifyMap(student)
        println(student["score"]) // 输出 95
    }
    
  • 通道(Channel):通道的底层实现是一个指针结构,传递通道时复制的是该指针。函数中对通道进行的发送、接收操作,都会作用于同一个通道实例。
    示例代码:

    func sendToChan(ch chan<- string) {
        ch <- "hello"
    }
    
    func main() {
        ch := make(chan string)
        go sendToChan(ch)
        println(<-ch) // 输出 hello
    }
    
  • 函数类型:函数值本质是指向函数代码段的指针,传递函数值时复制的是这个指针。调用传递的函数与直接调用原始函数效果一致,若函数捕获了外部变量,修改这些变量也会影响原始上下文。

  • 接口类型:当接口存储的是切片、映射这类引用类型时,接口值包含类型信息和指向底层数据的指针,传递接口值时复制的是接口结构体,但底层数据指针指向同一处,修改底层数据会影响原始值。若接口存储的是自定义类型的指针,同样会表现出指针语义。

需要注意:这些类型本身不是指针,只是底层实现带指针才表现出类似指针的效果。如果要修改类型自身的结构(比如重新分配切片、重新创建映射),仍需传递它们的指针。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 13:35:10