如何在Go中执行文字* int64?
我有一个*int64
字段的结构types。
type SomeType struct { SomeField *int64 }
在我的代码中的某个时刻,我想声明一个字面意思(比如,当我知道所说的值应该是0,或者指向一个0时,你知道我的意思)
instance := SomeType{ SomeField: &0, }
…除非这不起作用
./main.go:xx: cannot use &0 (type *int) as type *int64 in field value
所以我试试这个
instance := SomeType{ SomeField: &int64(0), }
…但这也行不通
./main.go:xx: cannot take the address of int64(0)
我如何做到这一点? 我能想出的唯一解决scheme是使用占位符variables
var placeholder int64 placeholder = 0 instance := SomeType{ SomeField: &placeholder, }
注意:当它是* int而不是 编辑:不,它不。 为此事道歉。 *int64
时, &0
语法可以正常工作。
编辑:
另外,我的问题含糊不清。 我正在寻找一种方法来从字面上声明 *int64
。 这可以在构造函数中使用,或者指定字面的结构值,甚至可以作为其他函数的参数。 但是帮助函数或使用不同的types不是我正在寻找的解决scheme。
Go语言规范( 地址运算符 )不允许使用数字常量的地址(不是无 types常量或types常量)。
操作数必须是可寻址的 ,即variables,指针间接或片段索引操作。 或可寻址结构操作数的字段select器; 或可寻址arrays的数组索引操作。 作为寻址能力要求的一个例外,
x
[在&x
]的expression式中也可能是一个(可能是加括号的) 复合文字 。
为了推理,为什么这是不允许的,查看相关的问题: 查找常量的地址 。 一个类似的问题(同样不允许使用它的地址): 如何在Go中存储对操作结果的引用?
您的select(尝试所有在Go游乐场 ):
1)用new()
你可以简单地使用内build的new()
函数来分配一个新的零值int64
并获取它的地址:
instance := SomeType{ SomeField: new(int64), }
但是请注意,这只能用于分配和获取任何types的零值的指针。
2)用切片文字,索引和取地址
如果你想*SomeField
不是0
,那么你需要一些地址。
你仍然可以这样做,但这很丑陋:
instance2 := SomeType{ SomeField: &[]int64{2}[0], } fmt.Println(*instance2.SomeField) // Prints 2
这里发生的事情是一个[]int64
切片创build一个文字,有一个元素( 2
)。 并且被索引(第0个元素)并且取第0个元素的地址。 在后台, [1]int64
数组也将被分配并用作片的后备数组。 所以这里有很多样板。
3)用辅助variables
对于非零元素来说,最简单和推荐的是使用一个可以获取地址的辅助variables:
helper := int64(3) instance3 := SomeType{ SomeField: &helper, }
4)具有帮手function
或者如果你需要这么多次,你可以创build一个帮助函数,它分配并返回一个*int64
:
func create(x int64) *int64 { return &x }
并使用它:
instance4 := SomeType{ SomeField: create(4), }
5)具有单线匿名function
instance5 := SomeType{ SomeField: func() *int64 { i := int64(5); return &i }(), }
或者作为一个(更短)的select:
instance5 := SomeType{ SomeField: func(i int64) *int64 { return &i }(5), }
6)用一个助手结构文字
我们来看看可寻址性要求的例外情况:
作为寻址能力要求的一个例外,
x
(在&x
中的expression式)也可能是一个(可能是加括号的) 复合文字 。
这意味着采取一个复合文字的地址,例如一个结构文字是好的。 如果我们这样做,我们将分配结构体的值和一个指针。 但是如果是这样,另一个要求就会变成可用: “可寻址结构操作数的字段select器” 。 所以如果结构字面量包含一个int64
types的字段,我们也可以把这个字段的地址!
让我们看看这个选项在行动。 我们将使用这个包装器结构types:
type intwrapper struct { x int64 }
现在我们可以做到:
i6 := SomeType{ SomeField: &(&intwrapper{6}).x, }
请注意这一点
&(&intwrapper{6}).x
意思如下:
& ( (&intwrapper{6}).x )
但是我们可以省略“外部”括号作为地址运算符&
应用于select器expression式的结果。
另外请注意,在后台会发生以下情况(这也是一个有效的语法):
&(*(&intwrapper{6})).x
7)与助手匿名结构文字
原则与案例#6相同,但是我们也可以使用匿名结构字面值,所以不需要帮助器/包装器结构types定义:
i7 := SomeType{ SomeField: &(&struct{ x int64 }{7}).x, }
你可以使用math/big
而不是?
package main import "fmt" import "math/big" type AStruct struct{ ALong *big.Int } func main() { t := AStruct{ALong : big.NewInt(10)} fmt.Printf("t: %v",t) }