> 백엔드 개발 > Golang > Go에서 메서드를 호출할 때 인터페이스 값에 대한 포인터를 사용하지 말아야 하는 이유는 무엇입니까?

Go에서 메서드를 호출할 때 인터페이스 값에 대한 포인터를 사용하지 말아야 하는 이유는 무엇입니까?

DDD
풀어 주다: 2024-12-07 05:15:16
원래의
438명이 탐색했습니다.

Why Should I Avoid Using Pointers to Interface Values When Calling Methods in Go?

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

Go에서는 인터페이스에 대해 프로그래밍하고 인터페이스를 수정하지 않고 트랜잭션을 사용해야 하는 경우가 있습니다. 암호. 일반적인 접근 방식은 "개체"에 대한 포인터를 필드 속성에 전달하여 필요한 경우 롤백을 활성화하는 것입니다. 그러나 이 접근 방식은 혼란을 초래할 수 있습니다.

코드 예제를 고려해 보겠습니다.

package repositories

import (
    "github.com/coopernurse/gorp"
)

type Repository struct {
    Gorp *gorp.SqlExecutor // Pointer to SqlExecutor
}

func (r *Repository) GetById(i interface{}, key interface{}) interface{} {
    obj, err := r.Gorp.Get(i, key) // Call method on pointer
    if err != nil {
        panic(err)
    }
    return obj
}
로그인 후 복사

여기서 롤백을 수행하려면 Gorp "객체"에 대한 포인터가 필요하다고 생각할 수 있습니다. 그러나 Go의 몇 가지 주요 개념을 이해하는 것이 중요합니다.

  • 인터페이스에 대한 포인터: Go에서는 인터페이스 값에 대한 포인터를 절대 사용하지 않습니다. 인터페이스는 추상화된 값 유형입니다.
  • 값에 의한 호출: Go에서는 모든 함수 인수가 값에 의해 전달됩니다. 여기에는 포인터가 포함됩니다.
  • 값 수정: 구조체나 다른 유형에 포인터를 전달할 때 원래 값을 수정할 수 있습니다. 그러나 인터페이스에 대한 포인터의 경우는 그렇지 않습니다.

예제 코드에서는 Gorp SqlExecutor에 대한 포인터가 있더라도 인터페이스 포인터 자체에서 메서드를 호출할 수 없습니다. 대신 기본 값에 대한 메서드를 호출하고 있습니다. 이 경우 기본 값은 SqlExecutor 구조체입니다.

따라서 Repository 구조체에서 포인터를 안전하게 제거하고 SqlExecutor 인터페이스를 Repository에 전달할 수 있습니다.

package repositories

import (
    "github.com/coopernurse/gorp"
)

type Repository struct {
    Gorp gorp.SqlExecutor // Pointer removed
}

func (r *Repository) GetById(i interface{}, key interface{}) interface{} {
    obj, err := r.Gorp.Get(i, key)
    if err != nil {
        panic(err)
    }
    return obj
}
로그인 후 복사

이것은 코드는 예상대로 작동하며 기본 SqlExecutor를 수정하지 않고도 트랜잭션을 사용할 수 있습니다. 이 컨텍스트에서는 인터페이스에 포인터를 전달하는 것에 대해 걱정할 필요가 없습니다.

위 내용은 Go에서 메서드를 호출할 때 인터페이스 값에 대한 포인터를 사용하지 말아야 하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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