下面的代码,注释的地方为什么不能执行呢?

下面的代码,注释的地方为什么不能执行呢?

package main

type Base struct {
}

func (this Base) Method1() {
    println(1)
}

func (this *Base) Method2() {
    println(2)
}

type Sub Base

func main() {
    a := Sub{}
    b := Base(a)

    b.Method1()
    Base(a).Method1()

    // b := Base(a),b.Method2 可以执行,而 Base(a).Method2 却不可以执行,Why?
    b.Method2()
    // Base(a).Method2()
}

共 2 个回复


stevewang

因为Base(a).Method2()里,Base(a)是个临时对象,而Method2的receiver是指针类型,对于临时对象不能取地址。
Base(a).Method1()可以编译是因为Method1的receiver不是指针。
b.Method2()可以编译是因为b不是临时对象。

同理,以下代码编译错误:

type T struct{}
func (*T) f() {}
(T{}).f()
# 0

stevenldj

原来是因为临时变量不能取指针,谢谢指点!

# 1