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