在golang中,为什么接口变量可以获取结构变量的地址,但不能从基本类型变量获取?

在golang中,为什么接口变量可以获取结构变量的地址,但不能从基本类型变量获取?,go,Go,我正在通过“go1.10 darwin/amd64”的“gotour”工具学习golang 对于以下情况: package main import "fmt" type Myapi interface { fun1() int } type MyintA struct { val int } type MyintB int func (v *MyintA)fun1() int { return int(v.val) + 1 } func (v *MyintB)

我正在通过“go1.10 darwin/amd64”的“gotour”工具学习golang

对于以下情况:

package main

import "fmt"

type Myapi interface {
    fun1() int
}

type MyintA struct {
    val int
}

type MyintB int

func (v *MyintA)fun1() int {
    return int(v.val) + 1
}

func (v *MyintB)fun1() int {
    return int(*v) + 1
}

func main() {
    var a Myapi
    a = &MyintA{3}
    fmt.Println(a)
    a = &MyintB(2) // Need b:=MyintB(2); a=&b
    fmt.Println(a)
}
编译错误是:

$go跑,试试看

#命令行参数

./try.go:27:9:无法获取MyintB的地址(2)

在这种情况下,为什么接口变量可以直接从MyintA而不是MyintB获取地址?

它是:

对于类型为T的操作数x,地址操作&x生成一个类型为*T到x的指针。操作数必须是可寻址的,即变量、指针间接寻址或切片索引操作;或可寻址结构操作数的字段选择器;或可寻址数组的数组索引操作。作为可寻址性要求的一个例外,x也可以是一个(可能带括号的)复合文字。如果对x的求值会导致运行时恐慌,那么对&x的求值也会引起恐慌

表达式
MyintB(2)
是类型为
MyintB
的常量值。它不是地址操作中允许的变量或其他操作数之一。变量用
var

表达式
MyintA{3}
是一个。可寻址性要求的例外情况允许获取此操作数的地址

按照注释中的建议获取指向MyintB的指针:

b := MyintB(2)
a = &b

问题在于地址运算符,而不是对接口变量的赋值。

。。。。。。然而,“MyintB”可以有一个“方法”或实现一个接口,而“int”不能……感觉有点不直观
MyintB(2)
是一个类型为MyintB的值,但它不是一个变量。规范允许
int
类型有方法,但类型没有用任何方法声明。哦……好的!我检查了源代码“go/1.10/libexec/src/builtin/builtin.go”,在那里定义了int“type”。因为它没有在那里实现任何方法,所以我们不能直接从外部包为“int”添加任何新方法,这就是为什么我们必须创建一个像MyintB这样的新类型来添加方法(如果需要)。嗯……那么,现在看起来不太直观:)非常感谢你的帮助!变量和值之间存在差异。变量包含值,但不是每个值都是变量。变量是可变的和可寻址的(简化的!)。有些东西不是变量。您的MyintB是一个,从映射中读取的值,例如m[“foo”]是另一个示例。顺便说一句,您的示例与接口完全无关。