2013-10-22 44 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