Go Zero 값 사용

7812 단어 gosystemsprogramming

In this article I make an argument for using the Zero Value in Go over the Nil value, where appropriate.




🔥 핫테이크 🔥


  • 비어 있음을 의미하기 위해 nil 값의 스칼라 유형에 대한 포인터를 사용해야 하는 상황은 단 한 가지이며 0 값이 의미를 갖는 경우입니다.
  • 필요하지 않은 경우 구조체 유형에 대한 포인터를 피하십시오(동시성 안전 변형 및 비 LOB)

  • 0 값



    0 값은 선언되었지만 할당되지 않은 값의 인스턴스화를 위한 기본값입니다. 이tour of go 예를 참조하십시오.

    Go에서 변수를 인스턴스화할 때 몇 가지 옵션이 있습니다.

    var mystring string = "mystring"
    mystring := "mystring"
    var mystring string
    

    var mystring string = "mystring"에서 "mystring"값을 사용하여 변수 선언을 명시적 초기화와 결합합니다.
    mystring := "mystring"에는 "문자열"의 초기화 값으로 알 수 있는 약식 유추 유형 선언이 있습니다.
    var mystring string에는 유형 선언이 있지만 초기화가 없습니까? 따라서 초기 값은 무엇입니까? Zero Value입니다.

    왜요?



    이 시점에서 대위법으로 포인터에 대해 길게 설명하려고 했지만 아무도 그것을 원하지 않습니다. 대신 읽을 수 있습니다 this article 제 생각에는 "가치가 아닌 가치"에 대한 공정한 비판이 있습니다. 유형 값이 비어 있다는 의미를 제공하기 위해 다른 유형과 값을 사용하는 것은 나쁜 습관이라고 생각합니다.

    🔥😈 예:

    type Base struct {
        ID *string
    }
    type Other struct {
      Base *Base // y? because ynot.
    }
    
    type Composed struct {
        ID string
        Base *Base
        Other *Other
    }
    
    func (c Composed) equalIDs() (bool, error) {
        // access some stuff
        var composedBaseID *string
      if c.Base != nil {
            composedBaseID = c.Base.ID
      }
        var composedOtherBaseID *string
        if c.Other != nil {
            if c.Other.Base != nil {
                idIWant = c.Other.Base.ID
        }
        }
      var emptyStrPtr string
        if composedBaseID == &emptyStrPtr || composedOtherBaseID == &emptyStrPtr {
            return false, errors.New("either id is empty because the pointer didn't even take care of that for us")
        }
    }
    
    


    🎵😌 예:

    type Base struct {
        ID
    }
    type Other struct {
      Base Base // y? because ynot.
    }
    
    type Composed struct {
        ID string
        Base Base
        Other Other
    }
    
    func (c Composed) equalIDs() (bool, error) {
        if c.Base.ID == "" || c.Other.Base.ID == "" {
            return false, errors.New("either ID is empty")
        }
        return c.BaseID == c.Other.Base.ID, nil
    }
    


    예, 이것은 인위적인 예이지만 야생에서 매우 자주 볼 수 있습니다.

    유형 구성이 강력하고 자주 사용되는 언어에서 포인터로 구성 유형을 사용하려면 값을 확인하기 전에 비어 있는지 확인하기 위해 포인터가 존재하는 각 값 액세스 깊이에서 nil 값을 확인해야 합니다. 또한 포인터에 액세스하면 구조체에 대한 포인터인 경우 지옥 예제 및 here 에서 볼 수 있듯이 대부분의 경우 여전히 0 값 유효성 검사를 수행해야 합니다.

    좋은 웹페이지 즐겨찾기