2013-07-06 2 views
2

I는 이동의 compress/flate 패키지를 통해 판독하고, I [1]이 코드 홀수 조각이 발견 문맥에서슬라이스의 끝을 지나서 일하는 것은 관용적입니까?

n := int32(len(list)) 
list = list[0 : n+1] 
list[n] = maxNode() 

list는 후에 자세히 데이터 배열을 가리키는 것이 보증된다. 이것은 개인 함수이므로 라이브러리 외부에서 오용 될 수 없습니다.

저에게 이것은 런타임 예외가되어야하는 무서운 해킹처럼 보입니다. 예를 들어, 다음 D 코드는 오류 RangeError 생성

x := []int{1, 2, 3} 
y = x[:2] 
y = append(y, 4) // x is now [1, 2, 4] because of how append works 

을하지만 두 솔루션은 매우 해키 것 같고 :

auto x = [1, 2, 3]; 
auto y = x[0 .. 2]; 
y = y[0 .. 3]; 

남용 조각 (더 안전 모양도 등) 더 간단하게 할 수있는과를 다음 무서운, 그리고 IMHO는 그들이하는 것처럼 작동해서는 안됩니다. 이런 종류의 일은 관용적 인 Go 코드로 간주됩니까? 그렇다면 위에 열거 한 것은 입니다. idiomatic? 배열을 통해 창 - [1]

http://golang.org/src/pkg/compress/flate/huffman_code.go#L136

답변

9

이것은 슬라이스를 남용하지 않는, 이것은 단지 완벽하게 조각이 무엇 사용하고 있습니다.

내가 another related answer I made에서이 그림을 할게요

: 당신은 당신이 밖으로 이동하지 않습니다 알고

array : [0 0 0 0 0 0 0 0 0 0 0 0] 
array : <---- capacity ---> 
slice :  [0 0 0 0] 
slice :  <---- capacity ---> 

배열이 정상의 조각 표준보다 큰

하나를 확장하여 더 큰 조각을 취할 기본 배열 ( cap()을 사용하여 확인할 수 있음)

예를 들어 버그 코드와 관련해서는 위험 할 수 있지만 배열과 슬라이스는 언어의 가장 기본적인 구조 중 하나이므로 이러한 버그를 피하려면 사용하기 전에 배열과 조각을 사용해야합니다. 나는 개인적으로 어떤 이동 코더도 API를 아는 것이 아니라 what are slices을 알고 있어야한다고 생각합니다. 당신이 링크 코드에서


는 짧은 분석이

list := make([]literalNode, len(freq)+1) 

로 만들어집니다 list 가능한 더 가능한 오버 플로우가없고 나중에보다 클 수 없습니다 수있는 count로 조정되는 것을 보여줍니다 len(freq) :

list = list[0:count] 

하나는 몇 가지 더 의견을 선호 수도 있지만이 포함 된 함수로 list = list[0 : n+1]은 비공개입니다 한 곳에서만 호출 되었기 때문에 주석 요약과 코드 불명료 사이의 균형이 맞다고 생각할 수도 있습니다. 코드를 숨기는 데 너무 많은 의견을 갖는 것은 고통스럽고이 코드를 읽을 필요가있는 사람은 누구나 내가했던 것처럼 오버플로가 없는지 쉽게 확인할 수 있습니다.

+0

귀하의 다른 답변도 상당히 좋습니다. 이 행동은 내가 처음 만났을 때 놀랐다 (D 예제를 보라). 호출자에 대한 가정을하기 때문에 위험한 것으로 보인다. 그래서 나는 그것을 무서운 것으로 생각한다.이 라이브러리의 전용 함수이기 때문에이 코드 스 니펫을 관용적이라고 생각하십니까? – tjameson

+0

@tjameson 제 대답을 자세히 설명했습니다. "관용적 인"질문에, 나는이 관용적 인 것으로 생각한다. –

1

언어 사양에서 슬라이스 연산의 상한이 길이가 아니라 슬라이스의 용량임을 명시하기 때문에 런타임 예외가 될 수 없습니다.

관련 문제