>  기사  >  백엔드 개발  >  Go 인터페이스가 Setter 메서드를 직접 지원할 수 없는 이유는 무엇이며, 이 문제를 어떻게 해결할 수 있나요?

Go 인터페이스가 Setter 메서드를 직접 지원할 수 없는 이유는 무엇이며, 이 문제를 어떻게 해결할 수 있나요?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-25 00:50:14249검색

Why Can't Go Interfaces Directly Support Setter Methods, and How Can This Be Worked Around?

Go의 다형성: 인터페이스 메서드 및 포인터 수신기 자세히 살펴보기

Go에서 다형성은 기본적으로 지원되지 않지만 지원될 수 있습니다. 인터페이스를 사용하여 달성됩니다. 이는 다음과 같은 일반적인 질문을 야기합니다. 왜 인터페이스에 setter 메소드가 허용되지 않습니까?

제공된 코드에서 알 수 있듯이 setter 메소드가 값 수신자로 정의되면 함수 내에서 변경된 사항이 종료 시 손실됩니다. . 수신기를 포인터 수신기로 수정하면 영구적인 변경이 가능하지만 컴파일 오류가 발생합니다.

이 문제를 해결하기 위해 Go에서는 해결 방법을 제공합니다. 수정된 코드는 setter 메서드의 수신자를 포인터로 수정합니다. 이를 통해 함수는 기본 데이터 구조를 수정하고 변경 사항을 유지할 수 있습니다. 수정된 코드는 인터페이스를 사용하여 인터페이스를 통해 포인터 수신기 메서드에 액세스할 수 있도록 합니다.

package main

import "fmt"

type MyInterfacer interface {
    Get() int
    Set(i int)
}

type MyStruct struct {
    data int
}

func (this *MyStruct) Get() int {
    return this.data
}

func (this *MyStruct) Set(i int) {
    this.data = i
}

func main() {
    s := &MyStruct{123}
    fmt.Println(s.Get())

    s.Set(456)
    fmt.Println(s.Get())

    var mi MyInterfacer = s
    mi.Set(789)
    fmt.Println(mi.Get())
}

이는 엄밀한 다형성은 아니지만 인터페이스와 포인터 수신기를 사용하여 유사한 결과를 효과적으로 달성합니다. 코드를 사용하면 인터페이스를 통해 속성을 설정하고 데이터와 작업을 깔끔하게 캡슐화할 수 있습니다.

위 내용은 Go 인터페이스가 Setter 메서드를 직접 지원할 수 없는 이유는 무엇이며, 이 문제를 어떻게 해결할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.