Golang中结构体前的"&"符号是什么
Golang中结构体前的"&"符号是什么
programs:=&struct{field1 int}{15}
在这个语句中,& 是什么意思?如果我在其他数据结构中这样写,会得到错误。
example:=&string{}
这是错误的。
& 符号表示获取某物的地址,结果是一个指针。例如:
package main
import "fmt"
func main() {
s := "Hello"
f(&s)
fmt.Println(s)
}
func f(p *string) {
*p += ", world!"
}
结构体字面量的写法是 structType{field1: field1Value, field2, field2Value}。例如:
// myStruct 是一个已定义的类型,因为我们给它起了名字:
type myStruct struct {
a int
b int
}
func main() {
s := myStruct{a: 0, b: 1}
// 做一些事情
}
匿名结构体没有名字(这就是它们被称为“匿名”的原因),所以代替 structName 的位置,你需要像在 &struct{field1 int}{15} 中那样重复类型。也许你已经知道这一点,但我想解释一下 struct{...}{...} 这种双重语法,以防万一。
字符串不是结构体,就像数字不是结构体或字符串一样,所以你不能使用花括号来定义它们,而应该使用双引号或反引号:
a := "My string"
b := `"My" string`
更多关于Golang中结构体前的"&"符号是什么的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Golang中,结构体前的&符号是取地址操作符,用于获取结构体实例的内存地址,返回一个指向该结构体的指针。
在你的代码中:
programs := &struct{ field1 int }{15}
这行代码做了三件事:
- 定义了一个匿名结构体类型
struct{ field1 int } - 创建了该结构体的实例并初始化
field1为15 - 使用
&获取该实例的地址,返回一个指向该结构体的指针
所以 programs 的类型是 *struct{ field1 int }(指向匿名结构体的指针)。
关于你的第二个问题,&string{} 确实是错误的,因为:
example := &string{} // 编译错误
string 是基本类型,不是结构体。对于基本类型,你需要先创建变量,再取地址:
// 正确的方式
str := ""
example := &str
// 或者使用new函数
example := new(string)
*example = "hello"
对于其他数据结构,& 的使用取决于具体类型:
// 对于数组
arr := &[3]int{1, 2, 3} // 正确,数组是值类型
// 对于切片(引用类型,通常不需要取地址)
slice := []int{1, 2, 3}
// &slice 在特定场景下有用,但通常直接使用slice即可
// 对于map
m := &map[string]int{} // 可以编译,但通常不这样用
// 更常见的做法是:
m := make(map[string]int)
结构体复合字面量前加 & 是一种常见用法,相当于:
// 这两种写法等价
p1 := &Person{Name: "Alice", Age: 25}
// 等价于
tmp := Person{Name: "Alice", Age: 25}
p2 := &tmp
这种语法糖让你可以直接创建结构体指针,而不需要中间变量。

