>백엔드 개발 >Golang >Go에서 인터페이스 포인터의 메서드를 올바르게 호출하는 방법은 무엇입니까?

Go에서 인터페이스 포인터의 메서드를 올바르게 호출하는 방법은 무엇입니까?

DDD
DDD원래의
2024-12-14 19:31:11204검색

How to Correctly Call Methods on Interface Pointers in Go?

Go에서 인터페이스 포인터에 대한 메서드 호출

Go에서는 인터페이스에 대해 프로그래밍할 때 다음을 수행할 수 있어야 하는 상황에 직면할 수 있습니다. 인터페이스 값에 대한 포인터에 대한 메서드를 호출합니다. 이는 인터페이스 자체에서 직접 노출되지 않는 기본 메서드에 액세스하려는 경우에 발생할 수 있습니다.

다음 시나리오를 고려하세요.

package main

import "fmt"

// SqlExecutor interface
type SqlExecutor interface {
    Get(i interface{}, key interface{}) (interface{}, error)
}

// GorpDbMap and GorpTransaction implement SqlExecutor
type GorpDbMap struct{}
type GorpTransaction struct{}

func (db GorpDbMap) Get(i interface{}, key interface{}) (interface{}, error) {
    return nil, nil
}

func (tx GorpTransaction) Get(i interface{}, key interface{}) (interface{}, error) {
    return nil, nil
}

func main() {
    // Initialize a GorpDbMap or GorpTransaction
    dbMap := GorpDbMap{}
    transaction := GorpTransaction{}

    // Create a repository that uses the SqlExecutor interface
    repo := Repository{
        // This will result in an error
        Gorp: &dbMap,
    }

    // Try to call Get method on the pointer to the SqlExecutor interface
    obj, err := repo.GetById(1, 2)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(obj)
}

// Repository demonstrates calling methods on interface pointers
type Repository struct {
    Gorp SqlExecutor
}

func (r Repository) GetById(i interface{}, key interface{}) interface{} {
    obj, err := r.Gorp.Get(i, key)
    if err != nil {
        panic(err)
    }
    return obj
}

위 코드를 실행할 때 다음 오류가 발생합니다.

r.Gorp.Get undefined (type *gorp.SqlExecutor has no field or method Get)

이 오류는 Get 메서드를 호출하기 전에 SqlExecutor 인터페이스 값에 대한 포인터가 제대로 역참조되지 않기 때문에 발생합니다. 메서드.

이 문제를 해결하려면 별표 연산자(*)를 사용하여 인터페이스 값에 대한 포인터를 역참조해야 합니다. 이는 다음과 같이 코드를 수정하여 수행할 수 있습니다.

func main() {
    // Initialize a GorpDbMap or GorpTransaction
    dbMap := GorpDbMap{}
    transaction := GorpTransaction{}

    // Create a repository that uses the SqlExecutor interface
    repo := Repository{
        Gorp: &dbMap,
    }

    // Try to call Get method on the pointer to the SqlExecutor interface
    obj, err := (*repo.Gorp).Get(1, 2)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(obj)
}

인터페이스 값에 대한 포인터를 역참조함으로써 이제 인터페이스를 구현하는 구조체의 기본 메서드에 액세스할 수 있습니다. 이 경우 GorpDbMap 구조체의 Get 메서드가 성공적으로 호출됩니다.

Go에서는 일반적으로 값에 포인터를 전달하는 것보다 값별로 값을 전달하는 것을 선호한다는 점에 유의하는 것이 중요합니다. 이렇게 하면 원래 값이 의도치 않게 수정되는 것을 방지할 수 있습니다. 인터페이스의 경우 일반적으로 인터페이스 값에 대한 포인터가 아닌 인터페이스 값 자체를 전달해야 합니다.

위 내용은 Go에서 인터페이스 포인터의 메서드를 올바르게 호출하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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