golang에서 [] string과… string의 차이점은 무엇입니까?


85

Go 언어에서는

[]string 문자열 배열입니다.

...string매개 변수로 도 사용 합니다.

차이점은 무엇입니까?

기능 정의 :

func f(args ...string) {}

이 함수를 아래와 같이 호출 할 수 있습니까?

args := []string{"a", "b"}

f(args)

답변:


126

[]string 문자열 배열입니다.

기술적으로는 기본 배열을 참조하는 슬라이스입니다.

...string매개 변수로 도 사용 합니다.

차이점은 무엇입니까?

구조와 관련하여 실제로는 없습니다. 두 구문의 결과 데이터 유형은 동일합니다.

...매개 변수 구문은 가변 매개 변수를합니다. 0 개 이상의 string인수를 허용 하고이를 슬라이스로 참조합니다.

호출과 관련 f하여 다음 구문을 사용하여 문자열 조각을 variadic 매개 변수에 전달할 수 있습니다.

func f(args ...string) {
    fmt.Println(len(args))
}


args := []string{"a", "b"}

f(args...)

이 구문은 리터럴 구문을 사용하여 빌드 된 슬라이스 또는 가변 매개 변수를 나타내는 슬라이스 (실제로 서로 차이가 없기 때문에)에 사용할 수 있습니다.

http://play.golang.org/p/QWmzgIWpF8


10
[]string배열이 아니라 슬라이스입니다. 배열과 슬라이스의 차이점은 미묘하지만 중요합니다.
스티븐 와인버그

@StephenWeinberg : 예, "차이가 무엇인지"인용문에 대한 "정말 아무것도 없습니다"라는 대답은 가변 함수 매개 변수에 의해 생성 된 슬라이스와 []string구문을 사용하여 생성 된 슬라이스 간의 차이에 대한 질문에 대한 대답입니다 . 더 명확하게 대답하기 위해 더 많은 인용문을 추가하겠습니다. :-)
나는 게으른 싫어

@IHateLazy println줄임표 를 사용하여 내장 작업을 수행 하는 방법이 있습니까? 여기에서 내 실험을 찾을 수 있습니다. 누군가 디버그 인쇄 기능을 원하면 내 playgound를보십시오.
vault

14

둘 다 문자열 배열을 생성하지만 차이점은 호출 방법에 있습니다.

func f(args ...string) {

}
// Would be called like this:

f("foo","bar","baz");

이를 통해 가변 개수의 인수 (모두 동일한 유형)를 허용 할 수 있습니다.

이것의 좋은 예는 fmt.Print당신이 원하는만큼 적게 또는 많은 arugments를 받아 들일 수있는 친구들과입니다.


나는 Go 전문가는 아니지만 하나의 가변 인수와 다른 하나는 단일 배열 인수가 아니며 두 가지가 다른 언어와 같이 구별되지 않습니까?
궤도의 가벼운 경주

1
트윗 담아 가기 명확하지 않다면 혼란을 드려 죄송합니다. 배열 생성에 대한 첫 번째 줄은 두 인스턴스의 결과 인수가 배열임을 의미합니다. 파이썬의 def fn(*args)구조와 거의 동일합니다 .
tylerl

그래서 Go는 가변 인자를 배열 유형의 인스턴스로 노출합니까? 그것은 기쁘게 생각합니다.
궤도

실제로 둘 다 배열이 아닌 문자열 조각을 만듭니다. 그들은 golang에서 다른 것들입니다.
PointerToConstantChar

둘 다 문자열의 "배열"을 생성하지 않고 문자열의 "슬라이스"를 생성합니다.
Inanc Gumus

5

원하는 것은 다음과 같습니다.

var args []string = []string{"A", "B", "C"}

func Sample(args ...string) {
    for _, arg := range args {
        fmt.Println(arg)
    }
}

func main() {
    Sample(args...)
}

플레이 : http://play.golang.org/p/N1ciDUKfG1


1

함수 매개 변수를 단순화합니다. 다음은 예제입니다 ( https://play.golang.org/p/euMuy6IvaM ) : SampleEllipsis 메소드는 0부터 동일한 유형의 여러 매개 변수를 허용하지만 SampleArray 메소드에서는 선언 할 필수 인수 입니다.

package main

import "fmt"

func SampleEllipsis(args ...string) {
    fmt.Printf("Sample ellipsis : %+v\n",args)
}


func SampleArray(args []string) {
    fmt.Println("Sample array ")
    SampleEllipsis(args...)
}

func main() {
    // Method one
    SampleEllipsis([]string{"A", "B", "C"}...)
    // Method two
    SampleEllipsis("A", "B", "C")
    // Method three
    SampleEllipsis()

    // Simple array
    SampleArray([]string{"A", "B", "C"})

    // Simple array
    SampleArray([]string{})

}

반환 :

Sample ellipsis : [A B C]
Sample ellipsis : [A B C]
Sample ellipsis : []
Sample array 
Sample ellipsis : [A B C]
Sample array 
Sample ellipsis : []
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.