인터페이스에 대한 포인터
거의 절대로 인터페이스 타입에 대한 포인터가 필요하지 않습니다. 인터페이스는 값을 통해 전달해야하며, 이렇게 함으로써 전달되는 기본 데이터는 여전히 포인터일 수 있습니다.
인터페이스는 원래 두 개의 필드로 나타낼 수 있습니다:
- 특정 타입 정보에 대한 포인터. 이것은 "타입"으로 생각할 수 있습니다.
- 데이터 포인터. 저장된 데이터가 포인터이면 직접 저장됩니다. 저장된 데이터가 값이면 해당 값의 포인터가 저장됩니다.
인터페이스 메서드를 사용하여 기본 데이터를 수정하려면 포인터 리시버를 사용해야 합니다 (객체 포인터를 인터페이스 변수에 할당).
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) // 잘못된 사용
}