如何在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器” 。 所以如果结构字面量包含一个int64types的字段,我们也可以把这个字段的地址!

让我们看看这个选项在行动。 我们将使用这个包装器结构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) }