programing

빈 슬라이스를 초기화하는 올바른 방법

padding 2023. 5. 8. 21:56
반응형

빈 슬라이스를 초기화하는 올바른 방법

크기가 고정되지 않은 빈 슬라이스를 선언하려면 다음 작업을 수행하는 것이 좋습니다.

mySlice1 := make([]int, 0)

또는:

mySlice2 := []int{}

어떤 것이 올바른 방법인지 궁금할 뿐입니다.

당신이 제시한 두 가지 대안은 의미론적으로 동일하지만 사용합니다.make([]int, 0)런타임에 대한 내부 호출이 발생합니다.make slice (고 1.16).

또한 다음과 같은 옵션을 사용할 수 있습니다.nil값:

var myslice []int

Golang.org 블로그에 기록된 바와 같이:

0 슬라이스는 0을 가리키지 않더라도 기능적으로 0 길이 슬라이스와 동일합니다.길이가 0이며 할당과 함께 추가할 수 있습니다.

A nil하지만 슬라이스는 할 것입니다.json.Marshal()안으로"null"반면에 빈 조각은 다음과 같습니다."[]"@farwayer가 지적했듯이.

@Arman Ordukhani가 지적한 바와 같이 위의 옵션 중 어떤 것도 할당을 유발하지 않습니다.

그들은 동등합니다.다음 코드 참조:

mySlice1 := make([]int, 0)
mySlice2 := []int{}
fmt.Println("mySlice1", cap(mySlice1))
fmt.Println("mySlice2", cap(mySlice2))

출력:

mySlice1 0
mySlice2 0

두 조각 모두 다음과 같습니다.0두 슬라이스가 모두 가지고 있음을 의미하는 용량0길이(용량보다 클 수 있음). 즉, 두 조각 모두 요소가 없음을 나타냅니다.이것은 두 조각이 모든 측면에서 동일하다는 것을 의미합니다.

유사한 질문을 참조하십시오.

골랑에 제로 슬라이스와 빈 슬라이스가 있는 이유는 무엇입니까?

바둑 언어에서 영 슬라이스 vs 비-닐 슬라이스 vs 빈 슬라이스

@ANISUS의 답변에 추가로...

아래는 "행동에 나서라" 책의 몇 가지 정보이며, 제가 언급할 가치가 있다고 생각합니다.

사이의 차이nil&empty얇게 썬 조각들

이와 같은 슬라이스를 생각하면 다음과 같습니다.

[pointer] [length] [capacity]

그러면:

nil slice:   [nil][0][0]
empty slice: [addr][0][0] // points to an address

영 슬라이스

조각을 반환하는 함수에서 예외가 발생하는 경우와 같이 존재하지 않는 조각을 나타낼 때 유용합니다.

// Create a nil slice of integers.
var slice []int

빈 조각

빈 슬라이스는 데이터베이스 쿼리가 0 결과를 반환하는 경우와 같이 빈 컬렉션을 나타낼 때 유용합니다.

// Use make to create an empty slice of integers.
slice := make([]int, 0)

// Use a slice literal to create an empty slice of integers.
slice := []int{}

제로 슬라이스를 사용하든 빈 슬라이스를 사용하든 상관없이 기본 제공 기능append,len,그리고.cap똑같이 일하다


이동 놀이터 예:

package main

import (
    "fmt"
)

func main() {

    var nil_slice []int
    var empty_slice = []int{}

    fmt.Println(nil_slice == nil, len(nil_slice), cap(nil_slice))
    fmt.Println(empty_slice == nil, len(empty_slice), cap(empty_slice))

}

인쇄:

true 0 0
false 0 0

Go: 빈 슬라이스와 nil 슬라이스는 다르게 초기화됩니다.

var nilSlice []int 
emptySlice1 := make([]int, 0)
emptySlice2 := []int{}

fmt.Println(nilSlice == nil)    // true
fmt.Println(emptySlice1 == nil) // false
fmt.Println(emptySlice2 == nil) // false

세 조각 모두에서 렌과 캡은 0입니다.

@ANISUS의 답변 외에도

공식 Go MongoDb Driver 사용 시 anil슬라이스도 에 병합됩니다."null"반면에 빈 조각은 다음과 같습니다."[]".

커뮤니티 지원 MGO 드라이버를 사용하는 경우 두 가지 모두nil그리고 빈 조각들은 마셜로 모아질 것입니다."[]".

참조: https://jira.mongodb.org/browse/GODRIVER-971

언급URL : https://stackoverflow.com/questions/29164375/correct-way-to-initialize-empty-slice

반응형