Подтвердить что ты не робот

"метод требует приемника указателя" на языке программирования Go

Я только что увидел презентацию языка программирования Go и подумал, что попытаюсь написать несколько строк. Все работало нормально, пока я не попытался использовать интерфейс в этой ситуации. Как это решить?

package main

import "fmt"

type entity float32

func (e *entity) inc() {
    *e++
}

type incer interface {
    inc()
}

func doSomething(i incer) {
    i.inc()
}

func main() {
    fmt.Println("Hello, 世界")

    var e entity = 3
    e.inc()
    doSomething(e)
    fmt.Println(e)
}

Я получаю ошибку компилятора:

prog.go:24: cannot use e (type entity) as type incer in function argument:
entity does not implement incer (inc method requires pointer receiver)

Я хочу использовать указатель так, чтобы inc() повлиял на enity вне функции. Каков синтаксис, который я должен использовать?

/Ricky

4b9b3361

Ответ 1

Я думаю, здесь есть некоторая путаница. inc - это метод типа *entity, а не тип entity (в то время как вы можете вызывать методы по значениям непосредственно на указателях, вы обычно не можете вызвать методы указателей непосредственно на значения). Что вы можете смутить, так это то, что вы могли бы назвать e.inc() вместо того, чтобы делать (&e).inc(). Это малоизвестный специальный случай, описанный в нижней части раздела Calls в спецификации языка, в котором говорится, что если x адресуется, а метод &x содержит m, тогда x.m() является сокращением для (&x).m(). Это относится к этому случаю, потому что e - переменная, поэтому она адресуема; но другие выражения могут быть не адресуемыми. Я бы рекомендовал, чтобы вы не использовали этот ярлык, однако, поскольку это вызывает путаницу; это заставляет вас думать, что e соответствует интерфейсу inter, пока он этого не делает.

Ответ 2

Измените его на: doSomething (& e). Функция func (e * entity) inc() удовлетворяет интерфейсу incer только для * типа сущности. Нет типа inc() для типа объекта и того, что вы передаете doSomething().