Wskaźniki do interfejsu

Prawie nigdy nie potrzebujesz wskaźników do typów interfejsów. Powinieneś przekazywać interfejsy poprzez wartość, a w ten sposób przekazywane jest wciąż wskaźnik do danych podstawowych.

Interfejsy są zasadniczo reprezentowane na poziomie podstawowym za pomocą dwóch pól:

  1. Wskaźnik do konkretnych informacji o typie. Możesz to sobie wyobrazić jako "typ".
  2. Wskaźnik danych. Jeśli przechowywane dane są typem wskaźnika, są przechowywane bezpośrednio. Jeśli przechowywane dane są wartością, przechowywany jest wskaźnik do tej wartości.

Jeśli chcesz, aby metody interfejsu modyfikowały dane podstawowe, musisz używać odbiorników wskaźników (przypisać wskaźnik obiektu do zmiennej interfejsu).

type F interface {
  f()
}

type S1 struct{}

func (s S1) f() {}

type S2 struct{}

func (s *S2) f() {}

// f1.f() nie może modyfikować danych podstawowych
// f2.f() może modyfikować dane podstawowe, wskaźnik obiektu jest przypisany do zmiennej interfejsu f2
var f1 F = S1{}
var f2 F = &S2{}

Nigdy nie używaj wskaźników do interfejsu, jest to bezsensowne. W języku Go, sam interfejs jest typem referencyjnym. Innymi słowy, sam typ interfejsu jest wskaźnikiem. W ramach moich potrzeb, parametr do testowania musi być tylko myinterface, a muszę przekazać tylko typ *mystruct (i można przekazać tylko typ *mystruct) podczas przekazywania wartości.

type myinterface interface{
	drukuj()
}

func test(value *myinterface){
	//coś robić ...
}

type mystruct struct {
	i int
}

// Implementuj interfejs
func (this *mystruct) drukuj(){
	fmt.Println(this.i)
	this.i=1
}

func main(){
	m := &mystruct{0}
test(m) // Niepoprawne
test(*m) // Niepoprawne
}