type A struct {
B int, C *int
}
如何初始化一个指针成员为非零值内联,而无需创建临时对象?
a := A{
B: 42,
C: ?,
}
type A struct {
B int, C *int
}
如何初始化一个指针成员为非零值内联,而无需创建临时对象?
a := A{
B: 42,
C: ?,
}
对于您给出的具体示例,您可以在不引入其他语句的情况下进行限定。
如果你想C
指向一个初始化的整数变量,你将需要一个额外的语句来定义该变量,因为你不能取整数字面的地址(即&42
将是一个错误)。
如果您只是想将初始化为C
作为指向新零值的指针,那么您很幸运,并且可以将其设置为new(int)
。
如果您正在处理的是具有初始化语法的不同类型,那么您也会遇到问题。例如,如果C
是指向结构的指针,则可以将其初始化为&TheStruct{...}
。
如果这些都不合适,而且您确实只有在初始化*int
变量后代码清晰后,辅助函数才可能符合您的要求。例如:
func makeIntPointer(v int) *int {
return &v
}
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://golang.org/doc/effective_go.html#composite_literals – Brenden
不要担心“创造临时工” - 围棋是收集这样一个结构将是暂时的垃圾(即获得垃圾回收)如果可能的话,也将坚持如果有东西引用它。 GC为您照顾。 – MatrixFrog
@MatrixFrog我不关心GC,但代码的可读性。 –
很有意思,也不是超级可读的,但是一个很好的技巧:'p:=&([] int {42} [0])'初始化'p'是一个指向42的指针。更不可读的'p:= func (i int)* int {return&i}()'也适用(但你可以像James Henstridge建议的那样将其排除) – val