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

Golang报错:无法获取结构体中无类型字符串常量的地址

问题描述

定义了一个包含指针字段的结构体:

type Req struct {
    Name      *string
    Address   *string
    Number    string
}

尝试直接按以下方式初始化结构体并赋值时出现报错:

req := Req{
   Name: &"Alice",
   Address: &"ABCDEF",
   Number: "123456"}

报错内容:

invalid operation: cannot take address of "Alice" (untyped string constant)
invalid operation: cannot take address of "ABCDEF" (untyped string constant)

需要明确两个问题:

  1. 报错的原因,以及为什么"Alice"和"ABCDEF"是无类型字符串常量
  2. 除了先赋值给变量再取指针之外,正确的实现方式有哪些
报错原因解析
  • 无类型字符串常量的本质:Go中像"Alice"这类直接书写的字符串字面量属于无类型常量,它们在编译阶段才会根据上下文确定具体类型并分配内存(或被编译器优化),本身没有固定的运行时内存地址。而取地址操作&要求操作对象必须拥有稳定的内存空间,无类型常量不满足这个条件,因此编译器禁止对其取地址。
  • 取地址操作的限制:&运算符仅能作用于可寻址的值,比如变量、数组元素、可寻址的结构体字段等。无类型常量不属于这类范畴,自然无法被取地址。
正确实现方式

除了先赋值给变量再取指针的方法,还有以下几种常用实现方式:

方法1:变量中转(最直观)

name := "Alice"
address := "ABCDEF"
req := Req{
    Name:    &name,
    Address: &address,
    Number:  "123456",
}

方法2:类型转换后取地址

将无类型常量转换为string类型的临时值,此时临时值会被分配内存空间,即可对其取地址:

req := Req{
    Name:    &string("Alice"),
    Address: &string("ABCDEF"),
    Number:  "123456",
}

方法3:自定义辅助函数简化操作

如果需要频繁创建字符串指针,可以封装一个辅助函数:

func strPtr(s string) *string {
    return &s
}

// 使用示例
req := Req{
    Name:    strPtr("Alice"),
    Address: strPtr("ABCDEF"),
    Number:  "123456",
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 00:28:12