> 백엔드 개발 > Golang > Go `greeter` 인터페이스에 `tourGuide` 값을 할당할 수 없지만 `tourGuide`에 대한 포인터를 할당할 수 있는 이유는 무엇입니까?

Go `greeter` 인터페이스에 `tourGuide` 값을 할당할 수 없지만 `tourGuide`에 대한 포인터를 할당할 수 있는 이유는 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2024-11-20 01:38:03
원래의
224명이 탐색했습니다.

Why can't a Go `greeter` interface be assigned a `tourGuide` value, but can be assigned a pointer to a `tourGuide`?

인터페이스를 만족하는 Go 구조체 메서드 유형

다음 Go 코드 예를 보면:

package main

import "fmt"

type greeter interface {
    hello()
    goodbye()
}

type tourGuide struct {
    name string
}

func (t tourGuide) hello() {
    fmt.Println("Hello", t.name)
}

func (t *tourGuide) goodbye() {
    fmt.Println("Goodbye", t.name)
}

func main() {
    var t1 tourGuide = tourGuide{"James"}
    t1.hello()   // Hello James
    t1.goodbye() // Goodbye James (same as (&t1).goodbye())

    var t2 *tourGuide = &tourGuide{"Smith"}
    t2.hello()   // Hello Smith
    t2.goodbye() // Goodbye Smith (same as (*t2).hello())

    // illegal: t1 is not assignable to g1 (why?)
    // var g1 greeter = t1

    var g2 greeter = t2
    g2.hello()   // Hello Smith
    g2.goodbye() // Goodbye Smith
}
로그인 후 복사

위 코드에서 다음을 수행할 수 있습니다. TourGuide 유형(t1)의 변수 또는tourGuide에 대한 포인터를 사용하여 structtourGuide의 두 가지 메서드를 호출합니다. (t2). 그러나 인터페이스를 구현하면 상황이 달라집니다. Greetingr 인터페이스 유형의 변수는 포인터에서tourGuide로 할당할 수 있지만,tourGuide 값에서는 할당할 수 없습니다. 왜 그럴까요?

수신자 유형 및 값 의미

이유를 이해하려면 수신자 유형의 개념과 값 의미를 이해하는 것이 중요합니다. Go의 메소드에는 값 수신자 또는 포인터 수신자가 있을 수 있습니다. 값 수신자 메서드는 값 복사본에서 호출되는 반면 포인터 수신자 메서드는 원래 값에서 호출됩니다.

값이 복사되면 원래 값의 독립적인 새 복사본이 생성됩니다. 복사본을 수정해도 원래 값에는 영향을 미치지 않습니다. 이를 값 의미론이라고 합니다.

tourGuide 예에서 hello 메소드에는 값 수신자가 있고, 안녕 메소드에는 포인터 수신자가 있습니다. t1.hello()를 호출하면 t1의 복사본이 생성되고 해당 복사본에서 hello 메서드가 호출됩니다. t1.goodbye()를 호출하면 원래 t1 값에 대해 작별 메소드가 호출됩니다.

인터페이스 및 값 의미

Go의 인터페이스는 값 의미에 의해 구현됩니다. 즉, 값이 인터페이스에 할당되면 해당 값의 복사본이 생성됩니다. 포인터 수신자 메서드의 경우 이는 값의 복사본에 주소가 없으므로 해당 메서드를 호출할 수 없음을 의미합니다.

예를 들어, t1을 g1에 할당하면( 는 인터페이스 값) 다음 코드 줄에서:

// illegal: t1 is not assignable to g1 (why?)
// var g1 greeter = t1
로그인 후 복사

t1의 복사본이 생성되고 hello 및 안녕 메서드가 복사본에 구현됩니다. 그러나 복사본에는 주소가 없으므로 작별 인사 메서드를 호출할 수 없습니다.

반대로 다음 코드 줄에서 t2를 g2에 할당하는 경우:

var g2 greeter = t2
로그인 후 복사

t2의 복사본(tourGuide에 대한 포인터)이 생성되고 hello 및 안녕 메서드가 포인터 복사본에 구현됩니다. 이 경우 포인터의 복사본에는 주소가 있으므로 그에 대해 작별 인사 메소드를 호출할 수 있습니다.

결론

요약하면, Greetingr 인터페이스 유형의 변수를 할당할 수 있는 이유 TourGuide에 대한 포인터는 있지만 TourGuide 값에서는 그렇지 않은 이유는 인터페이스가 값 의미론에 의해 구현되기 때문입니다. 인터페이스에 값이 할당되면 해당 값의 복사본이 생성되고, 인터페이스의 메서드에 포인터 수신기가 있는 경우 복사본에 주소가 없기 때문에 복사본에서 호출할 수 없습니다.

위 내용은 Go `greeter` 인터페이스에 `tourGuide` 값을 할당할 수 없지만 `tourGuide`에 대한 포인터를 할당할 수 있는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿