나는 Go tour를 통해 일하고 있으며 포인터와 인터페이스에 대해 혼란스러워합니다. 이 Go 코드는 왜 컴파일되지 않습니까?
package main
type Interface interface {}
type Struct struct {}
func main() {
var ps *Struct
var pi *Interface
pi = ps
_, _ = pi, ps
}
즉,이 경우 Struct
는 Interface
, 이유는 않을 것 *Struct
일 *Interface
?
내가 얻는 오류 메시지는 다음과 같습니다.
prog.go:10: cannot use ps (type *Struct) as type *Interface in assignment:
*Interface is pointer to interface, not interface
답변
인터페이스를 구현하는 구조체가 있으면 해당 구조체에 대한 포인터가 해당 인터페이스도 자동으로 구현합니다. 그렇기 때문에 *SomeInterface
함수 프로토 타입에 절대로 아무것도 추가 SomeInterface
되지 않으므로 변수 선언에 이러한 유형이 필요하지 않습니다 ( 이 관련 질문 참조 ).
인터페이스 값은 콘크리트 구조체의 값이 아니며 (크기가 가변적이므로 불가능할 수 있음) 일종의 포인터입니다 (구조체에 대한 포인터 및 유형에 대한 포인터) ). Russ Cox는 정확히 여기에 설명합니다 .
인터페이스 값은 인터페이스에 저장된 유형에 대한 정보를 가리키는 포인터와 관련 데이터를 가리키는 2 워드 쌍으로 표시됩니다.
그렇기 때문에 구조체 구현에 대한 포인터를 보유하는 올바른 유형이 Interface
아닙니다 .*Interface
Interface
그래서 당신은 단순히 사용해야합니다
var pi Interface
답변
이것은 아마도 당신이 의미 한 것입니다 :
package main
type Interface interface{}
type Struct struct{}
func main() {
var ps *Struct
var pi *Interface
pi = new(Interface)
*pi = ps
_, _ = pi, ps
}
답변
인터페이스에 구조체를 할당하는 매우 간단한 방법은 다음과 같습니다.
package main
type Interface interface{}
type Struct struct{}
func main() {
ps := new(Struct)
pi := Interface(ps)
_, _ = pi, ps
}
https://play.golang.org/p/BRTaTA5AG0S
답변
나는 인수로 interface{}
소비하는 동안 다음과 같은 방법을 사용 하지만 eventsI interface{}
아래에서 볼 수 있듯이 여전히 구조 포인터를 보낼 수 있습니다.
func Wait(seconds float64) *WaitEvent {
return WaitEventCreate(seconds)
}
main.go
var introScene = []interface{}{
storyboard.Wait(5),
storyboard.Wait(2),
}
var storyboardI = storyboard.Create(stack, introScene)
stack.Push(&storyboardI)
이제 storyboard.go
파일 내부 작성 기능
type Storyboard struct {
Stack *gui.StateStack
Events []interface{} //always keep as last args
}
func Create(stack *gui.StateStack, eventsI interface{}) Storyboard {
sb := Storyboard{
Stack: stack,
}
if eventsI != nil {
events := reflect.ValueOf(eventsI)
if events.Len() > 0 {
sb.Events = make([]interface{}, events.Len())
for i := 0; i < events.Len(); i++ {
sb.Events[i] = events.Index(i).Interface()
}
}
}
return sb
}
위에서 볼 수 있듯이 Storyboard.go는 소비하고 Events []interface{}
있지만 실제로 Im 전송은 Struct 포인터이며 제대로 작동합니다.
여기 또 다른 예