Go의 쌍 / 튜플 데이터 유형


118

Tour of Go마지막 연습을하는 동안 나는 ( string, int) 쌍 의 대기열이 필요하다고 결정했습니다 . 간단합니다.

type job struct {
    url string
    depth int
}

queue := make(chan job)
queue <- job{url, depth}

하지만 이로 인해 Go에 내장 된 쌍 / 튜플 데이터 유형이 있습니까? 함수에서 여러 값반환 하기위한 지원이 있지만 AFAICT, 생성 된 여러 값 튜플은 Go의 유형 시스템에서 일류 시민이 아닙니다. 그럴까요?

"당신이 시도한 것"부분에 관해서는 (Python 프로그래머의 POV에서) 명백한 구문

queue := make(chan (string, int))

작동하지 않았습니다.

답변:


57

Go에는 튜플 유형이 없으며 정확합니다. 함수가 반환하는 여러 값은 일류 객체를 나타내지 않습니다.

Nick의 대답은 .NET을 사용하여 임의의 유형을 처리하는 유사한 작업을 수행하는 방법을 보여줍니다 interface{}. (구조물이 아닌 배열을 사용하여 튜플처럼 인덱싱 할 수 있지만 핵심 아이디어는 interface{}유형입니다)

내 다른 대답은 익명 구조체를 사용하여 유형을 만드는 것을 피하는 비슷한 작업을 수행하는 방법을 보여줍니다.

이러한 기술에는 튜플의 속성이 있지만 튜플이 아닙니다.


91

할 수 있습니다. 튜플보다 장황하게 보이지만 유형 검사를 받기 때문에 크게 개선되었습니다.

편집 : Nick의 제안에 따라 스 니펫을 완전한 작동 예제로 대체했습니다. 플레이 그라운드 링크 : http://play.golang.org/p/RNx_otTFpk

package main

import "fmt"

func main() {
    queue := make(chan struct {string; int})
    go sendPair(queue)
    pair := <-queue
    fmt.Println(pair.string, pair.int)
}

func sendPair(queue chan struct {string; int}) {
    queue <- struct {string; int}{"http:...", 3}
}

익명의 구조체와 필드는 이와 같은 빠르고 더러운 솔루션에 적합합니다. 하지만 가장 단순한 경우를 제외하고 모두 명명 된 구조체를 정의하는 것이 좋습니다.


9
초보자에게는 분명하지 않다고 생각하기 때문에 익명 구조체 멤버에서 값을 얻는 방법을 설명해야 할 것입니다!
닉 크레이그 우드

9
그러나 동일한 유형의 필드가 여러 개있는 경우에는 작동하지 않습니다
newacct

1
익명 구조체에 이름이 지정된 필드를 가질 수 있습니다. 익명 구조체 정의가 나타나는 각 위치 (이 예에서는 세 번)와 같은 방식으로 필드 이름이 지정되도록해야합니다. 익명 필드를 사용하는 것이 더 쉽습니다. .
Sonia

5
그래서 대답은 "아니, 튜플 유형이 없습니다"입니다.
Fred Foo

37

원한다면 이런 식으로 할 수 있습니다.

package main

import "fmt"

type Pair struct {
    a, b interface{}
}

func main() {
    p1 := Pair{"finished", 42}
    p2 := Pair{6.1, "hello"}
    fmt.Println("p1=", p1, "p2=", p2)
    fmt.Println("p1.b", p1.b)
    // But to use the values you'll need a type assertion
    s := p1.a.(string) + " now"
    fmt.Println("p1.a", s)
}

그러나 이미 가지고있는 것은 완벽하게 관용적이며 구조체는 데이터를 완벽하게 설명하므로 일반 튜플을 사용하는 것보다 큰 이점이 있습니다.

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