Go中没有“指针切片”类型,但可创建元素为指针的切片[]*T,用于动态管理同类型值的地址,支持常规切片操作,需避免对临时值取址,并注意内存生命周期管理。
Go语言中没有“指针切片”这个独立类型,但你可以创建一个元素为指针的切片([]*T),用来动态管理一组指向同类型值的指针。它不是语法糖,而是一种常见且实用的模式,适用于需要延迟初始化、避免拷贝大结构体、或统一管理对象生命周期等场景。
[]*T 的本质这是一个普通切片,只是每个元素都是 *T 类型——即指向某个 T 类型值的地址。它和 []T 一样支持 append、len、cap、索引访问等操作,区别只在元素类型。
var ptrs []*string 或 ptrs := make([]*int, 0, 10)
s := "hello"; ptrs = append(ptrs, &s)(注意取地址的是变量,不是字面量)if len(ptrs) > 0 { fmt.Println(*ptrs[0]) }
Go不允许对字面量或函数返回的临时值取地址(编译报错)。例如 append(ptrs, &"hello") 或 &time.Now() 都非法。
正确做法是先赋值给局部变量再取址:
name := "Alice"; ptrs = append(ptrs, &name)[]*T 本身不持有被指向的数据,它只存地址。因此:
比如管理一组配置项指针,允许运行时增删改,又不想复制整个结构体:
type Config struct{ Port int; Host string }
cfg1 := &Config{Port: 8080, Host: "localhost"}
cfg2 := &Config{Port: 3000, Host: "dev.local"}
configs := []*Config{cfg1, cfg2}
configs = append(configs, &Config{Port: 443, Host: "prod.example.com"
}) // 动态添加
// 修改第一个配置的端口
if len(configs) > 0 {
configs[0].Port = 9000
}