2012-04-12 6 views
2

편집 : 제레미 월 (Jeremy Wall)은 내가 의도 한 것보다 더 구체적인 질문을했다는 것을 알았습니다. 여기에 더 좋은 버전이 있습니다.Go에서 임의의 길이의 값 시퀀스를 맵 키로 사용하는 방법은 무엇입니까?

평등이 정의 된 A 유형의 값 시퀀스에 B 유형의 값을 연결하는 테이블을 나타내고 싶습니다. Go에서 그렇게하는 가장 좋은 방법은 무엇입니까?

물론 테이블에 대해서는 Go 맵을 사용하고 싶지만 A 유형의 값 시퀀스에는 무엇을 사용할 수 있습니까? 슬라이스는 Go의 맵 키로 사용할 수 없습니다. 배열은 가능하지만 배열의 길이는 그 타입의 일부이며 런타임에 결정된 길이의 시퀀스를 사용할 수 있는지에 관심이 있습니다. (1) A의 배열을 사용하여 최대 길이를 선언하거나 (2) A의 조각을 사용하여 문자열로 직렬화하여 키로 사용할 수 있습니다 (이 기술은 Awk 및 Lua 프로그래머에게 친숙합니다 ...). Go의이 "기능"에 대한 더 나은 해결책이 있습니까?

제레미 월 (Jeremy Wall)이 내 원래 버전의 질문에 대한 대답으로 지적했듯이, A = int 인 경우 옵션 (2)은 문자열에 대한 변환을위한 룬 문자 조각을 사용할 수 있기 때문에 정수에 매우 적합합니다. 그냥 캐스팅.

+1

하지만 문제는 정말 이어질 정말 너무 구체적이다 어떤 종류의 대답이든. 그것은 당신이 대답하려고하는 특정 문제를 아는 것을 도울 것입니다. –

+0

너무 구체적인 질문에 대한 좋은 지적입니다. 내 생각은 정수를 언급하는 것만으로 구체적인 예를들 수 있지만, 다른 유형에서는 작동하지 않는 정수에 대해 실제로 좋고 간단한 솔루션이있을 것이라고 생각하지 않았습니다. –

답변

1

정수 대신 룬 문자 시퀀스를 사용할 수 있습니까? 룬은 UINT32하고 문자열로 변환 그냥 캐스트입니다 :

package main 

import "fmt" 

type myKey struct { 
    seq []int 
} 

func main() { 
    m := make(map[string]string) 
    key := []rune{1, 2} 
    m[string(key)] = "foo" 
    fmt.Print("lookup: ", m[string(key)]) 
} 

당신이있어이 코드를 재생할 수 있습니다 : I "는이"아래 대답했다 http://play.golang.org/p/Kct1dum8A0

+0

고마워요, 그건 깔끔한 트릭입니다! 내가 이해하고 있는지 확인하기 위해 : 여기에 변수 "키"는 쇠고기의 _slice_ 유형입니다, 맞습니까? 이것은 완벽하게 정수의 경우를 다루지 만, 필자가 작성한 프로그램을 개선 할 수는 있지만 (주어진 길이의 모든 [de Bruijn 시퀀스] (http://en.wikipedia.org/wiki/De_Bruijn_sequence)를 열거합니다) , 나는 단지 일반적으로 32 비트 정수가 아닌 일련의 값을 더 일반적으로 질문하려고했다. –

+0

예 키는 룬 문자입니다. 룬은 부호없는 32 비트 정수입니다. 정수의 순차가 그 안에 들어 맞으면 int의 한 부분을 차지할 수 있습니다. –

+0

시퀀스의 길이가 모두 동일한 경우 가장 적합한 숫자 유형의 배열을 사용할 수 있습니다. 그게 아니라 슬라이스 배열. 배열은 유효한 맵 키입니다 (제한 내 ... 숫자 유형의 배열은 문제가되지 않습니다.) 슬라이스보다 약간 더 빠를 수도 있습니다. – Sonia

관련 문제