Golang中结构体前的"&"符号是什么

Golang中结构体前的"&"符号是什么

programs:=&struct{field1 int}{15}

在这个语句中,& 是什么意思?如果我在其他数据结构中这样写,会得到错误。

example:=&string{}

这是错误的。

2 回复

& 符号表示获取某物的地址,结果是一个指针。例如:

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}

这行代码做了三件事:

  1. 定义了一个匿名结构体类型 struct{ field1 int }
  2. 创建了该结构体的实例并初始化 field115
  3. 使用 & 获取该实例的地址,返回一个指向该结构体的指针

所以 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

这种语法糖让你可以直接创建结构体指针,而不需要中间变量。

回到顶部