인터페이스에 대한 포인터

거의 절대로 인터페이스 타입에 대한 포인터가 필요하지 않습니다. 인터페이스는 값을 통해 전달해야하며, 이렇게 함으로써 전달되는 기본 데이터는 여전히 포인터일 수 있습니다.

인터페이스는 원래 두 개의 필드로 나타낼 수 있습니다:

  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) // 잘못된 사용
}