Указатели на интерфейс

Почти никогда не нужно использовать указатели на типы интерфейсов. Интерфейсы следует передавать по значению, и при этом передаваемые данные могут по-прежнему быть указателем.

Интерфейсы в основном представлены двумя полями на низком уровне:

  1. Указатель на определенный тип информации. Можно представлять его как "тип".
  2. Указатель данных. Если хранящиеся данные являются указателем, они хранятся непосредственно. Если хранимые данные являются значением, сохраняется указатель на это значение.

Если вы хотите, чтобы методы интерфейса изменяли базовые данные, вы должны использовать указатели-приемники (назначить указатель объекта переменной интерфейса).

type F interface {
  f()
}

type S1 struct{}

func (s S1) f() {}

type S2 struct{}

func (s *S2) f() {}

// f1.f() не может изменить базовые данные
// f2.f() может изменить базовые данные, указатель объекта назначается переменной интерфейса f2
var f1 F = S1{}
var f2 F = &S2{}

Никогда не используйте указатели на интерфейс, это бессмысленно. На языке Go интерфейс сам по себе является типом ссылки. Другими словами, сам тип интерфейса является указателем. Для моих нужд параметр для тестирования должен быть только myinterface, и мне нужно передавать только тип *mystruct (и могу передавать только тип *mystruct) при передаче значения.

type myinterface interface{
	print()
}

func test(value *myinterface){
	// что-то делаем ...
}

type mystruct struct {
	i int
}

// Реализуем интерфейс
func (this *mystruct) print(){
	fmt.Println(this.i)
	this.i=1
}

func main(){
	m := &mystruct{0}
test(m) // Неверно
test(*m) // Неверно
}