2013-10-22 41 views
1

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

type A struct { 
    B int, C *int 
} 

如何初始化一个指针成员为非零值内联,而无需创建临时对象?

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

不要担心“创造临时工” - 围棋是收集这样一个结构将是暂时的垃圾(即获得垃圾回收)如果可能的话,也将坚持如果有东西引用它。 GC为您照顾。 – MatrixFrog

+0

@MatrixFrog我不关心GC,但代码的可读性。 –

+0

很有意思,也不是超级可读的,但是一个很好的技巧:'p:=&([] int {42} [0])'初始化'p'是一个指向42的指针。更不可读的'p:= func (i int)* int {return&i}()'也适用(但你可以像James Henstridge建议的那样将其排除) – val

回答

9

对于您给出的具体示例,您可以在不引入其他语句的情况下进行限定。

如果你想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

+0

准确地说我会做什么。 http://golang.org/doc/effective_go.html#composite_literals – Brenden