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

3

使用类型:

type A struct {
   B int, C *int
}

如何在内联函数中将指针成员初始化为非零值,而不创建临时对象?

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

不用担心“创建临时变量”——Go语言是垃圾回收的,因此如果可能,结构体将是临时的(即被垃圾回收),或者如果有东西引用它,它将保留下来。垃圾回收器会为您处理这些问题。 - Tyler
@MatrixFrog 我不关心垃圾回收,但我关心代码的可读性。 - Alex B
1
虽然有些牵强附会且不太易读,但这是一个很好的技巧:p := &([]int{42}[0])p 初始化为指向 42 的指针。更难以阅读的 p := func(i int) *int {return &i}() 也可以使用(但你可以像 James Henstridge 建议的那样将其分解)。 - val
2个回答

15

对于您提供的具体示例,如果不引入其他语句,您的操作受到限制。

如果您希望让C指向一个初始化的整数变量,您需要添加一条额外的语句来定义该变量,因为您无法获取整数文字的地址(即&42会产生错误)。

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

如果您要处理的是具有初始化器语法的不同类型,则同样很幸运。例如,如果C是指向结构体的指针,可以将其初始化为&TheStruct{...}

如果以上方法都不适用,并且您真正只想要清晰初始化*int变量的代码,那么一个辅助函数可能符合您的要求。例如:

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

2
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)
}

http://play.golang.org/p/s0HIMHoMRo


正是我会做的事情。http://golang.org/doc/effective_go.html#composite_literals - Brenden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接