Go 如何在结构类型内联中初始化指针成员?

Go 如何在结构类型内联中初始化指针成员?,go,Go,使用类型: type A struct { B int, C *int } 如何初始化指向非零值内联的指针成员,而不创建临时值 a := A{ B: 42, C: ?, } 对于您给出的特定示例,在不引入其他语句的情况下,您所能做的有限 如果希望C指向初始化的整数变量,则需要一条附加语句来定义该变量,因为无法获取整数文本的地址(即&42将是一个错误) 如果您只想初始化C作为指向新零值的指针,那么您很幸运,可以将其设置为new(int) 如果您处理的是另一种具有初始化器语

使用类型:

type A struct {
   B int, C *int
}
如何初始化指向非零值内联的指针成员,而不创建临时值

a := A{
    B: 42,
    C: ?,
}

对于您给出的特定示例,在不引入其他语句的情况下,您所能做的有限

如果希望
C
指向初始化的整数变量,则需要一条附加语句来定义该变量,因为无法获取整数文本的地址(即
&42
将是一个错误)

如果您只想初始化
C
作为指向新零值的指针,那么您很幸运,可以将其设置为
new(int)

如果您处理的是另一种具有初始化器语法的类型,那么您也会很幸运。例如,如果
C
是指向结构的指针,则可以将其初始化为
&结构{…}

如果这些都不合适,并且您实际上只是在初始化
*int
变量的代码清晰之后,助手函数可能适合您的要求。例如:

func makeIntPointer(v int) *int {
    return &v
}

不要担心“创建临时对象”--Go是垃圾收集的,因此如果可能的话,结构将是临时的(即get garbage collected),或者如果有东西引用它,它将继续存在。GC会帮你解决这个问题。@MatrixFrog我不关心GC,而是关心代码的可读性。这是一个精心设计的,不是超级可读的,但很好的技巧:
p:=&([]int{42}[0])
初始化
p
成为指向42的指针。可读性更差的
p:=func(i int)*int{return&i}()
也可以像詹姆斯·亨斯特里奇(James Henstridge)所建议的那样工作(但你可以将其分解)。
package main

import "fmt"

type A struct {
    B int 
    C *int
}

func newint(i int) *int{
    return &i
}

func main() {
    c := newint(5)
    a := &A{
            B: 42,
            C: c,
         }

    fmt.Printf(" %v" , *a.C)
    fmt.Printf(" %#v" , a.C)
}