[go] Go의 쌍 / 튜플 데이터 유형

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))

작동하지 않았습니다.



답변

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

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

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

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


답변

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

편집 : 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}
}

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


답변

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

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)
}

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


답변