상수 배열 선언


164

나는 시도했다 :

const ascii = "abcdefghijklmnopqrstuvwxyz"
const letter_goodness []float32  = { .0817,.0149,.0278,.0425,.1270,.0223,.0202, .0609,.0697,.0015,.0077,.0402,.0241,.0675, .0751,.0193,.0009,.0599,.0633,.0906,.0276, .0098,.0236,.0015,.0197,.0007 }
const letter_goodness  = { .0817,.0149,.0278,.0425,.1270,.0223,.0202, .0609,.0697,.0015,.0077,.0402,.0241,.0675, .0751,.0193,.0009,.0599,.0633,.0906,.0276, .0098,.0236,.0015,.0197,.0007 }
const letter_goodness = []float32 { .0817,.0149,.0278,.0425,.1270,.0223,.0202, .0609,.0697,.0015,.0077,.0402,.0241,.0675, .0751,.0193,.0009,.0599,.0633,.0906,.0276, .0098,.0236,.0015,.0197,.0007 }

첫째, 선언 및 초기화는 정상적으로 작동하지만 두 번째, 세 번째 및 네 번째는 작동하지 않습니다. float의 const 배열을 어떻게 선언하고 초기화 할 수 있습니까?

답변:


232

배열은 본질적으로 변경할 수 없습니다. 당신은 그것을 일정하게 만들 수 없습니다.

가장 가까운 곳은 다음과 같습니다.

var letter_goodness = [...]float32 {.0817, .0149, .0278, .0425, .1270, .0223, .0202, .0609, .0697, .0015, .0077, .0402, .0241, .0675, .0751, .0193, .0009, .0599, .0633, .0906, .0276, .0098, .0236, .0015, .0197, .0007 }

[...]대신에 참고하십시오 []: 슬라이스 대신 (고정 크기) 배열을 얻습니다. 따라서 값은 고정되어 있지 않지만 크기는 고정되어 있습니다.


126
설명을 위해 : [...]T구문은 sugar for [123]T입니다. 고정 크기 배열을 생성하지만 컴파일러는 얼마나 많은 요소가 포함되어 있는지 파악할 수 있습니다.
jimt

5
상수 배열을 허용하려면 유형 시스템을 업데이트해야합니다. 그렇지 않으면 함수를 정의하면 f(xs [5]int)전달 된 배열이 상수인지 변경 가능한지 알 수 없습니다.
Thomas Ahle

tks, 나는 현을하려고 할 때 문제가 있습니다. 가입 cannot use constants.FilesRequired (type [4]string) as type []string in argument to strings.Join
Eddy Hernandez

슬라이스 솔루션에 감사드립니다. 의심 : 배열 자체는 변경할 수 없습니다. 배열을 만든 후에는 요소를 추가하거나 제거 할 수 없습니다. 그러나 배열 요소를 편집 할 수 있습니다.
legends2k

@ legends2k 배열의 크기를 변경할 수는 없지만 슬롯에 다른 값을 넣을 수 있습니다.
Denys Séguret

63

에서 효과적인 이동 :

Go의 상수는 상수입니다. 함수에서 로컬로 정의 된 경우에도 컴파일 타임에 작성되며 숫자, 문자열 또는 부울 만 될 수 있습니다. 컴파일 타임 제한으로 인해이를 정의하는 표현식은 상수 표현식이어야하며 컴파일러가 평가할 수 있어야합니다. 예를 들어, 1 << 3은 상수 표현식 인 반면 math.Sin (math.Pi / 4)은 math.Sin에 대한 함수 호출이 런타임에 발생해야하기 때문에 아닙니다.

슬라이스와 배열은 항상 런타임 중에 평가됩니다.

var TestSlice = []float32 {.03, .02}
var TestArray = [2]float32 {.03, .02}
var TestArray2 = [...]float32 {.03, .02}

[...]컴파일러에게 배열 자체의 길이를 알아 내도록 지시합니다. 슬라이스는 배열을 감싸고 대부분의 경우 작업하기가 더 쉽습니다. 상수를 사용하는 대신 소문자 첫 글자를 사용하여 변수를 다른 패키지에 액세스 할 수 없게 만듭니다.

var ThisIsPublic = [2]float32 {.03, .02}
var thisIsPrivate = [2]float32 {.03, .02}

thisIsPrivate정의 된 패키지에서만 사용할 수 있습니다. 외부에서 읽기 액세스가 필요한 경우 간단한 getter 함수를 작성할 수 있습니다 ( golang의 Getter 참조 ).


12

Go에는 배열 상수와 같은 것이 없습니다.

Go 언어 사양 에서 인용 : 상수 :

있다 부울 상수 , 룬 상수 , 정수 상수 , 부동 소수점 상수 , 복잡한 상수문자열 상수 . 룬, 정수, 부동 소수점 및 복합 상수를 통칭하여 숫자 상수 라고 합니다 .

상수 식 (상수를 초기화하는 데 사용)만을 포함 할 수 상수 피연산자 및 컴파일 시간에 평가된다.

사양에는 여러 유형의 상수가 나열되어 있습니다. 허용되는 유형 중 하나를 기본 유형으로하는 유형의 상수 표현식 을 사용 하여 상수를 작성하고 초기화 할 수 있습니다 . 예를 들어 이것은 유효합니다 :

func main() {
    type Myint int
    const i1 Myint = 1
    const i2 = Myint(2)
    fmt.Printf("%T %v\n", i1, i1)
    fmt.Printf("%T %v\n", i2, i2)
}

출력 ( Go Playground 에서 시도 ) :

main.Myint 1
main.Myint 2

배열이 필요한 경우 변수 만 될 수 있지만 상수는 아닙니다.

상수에 관한이 훌륭한 블로그 기사를 추천합니다 : 상수


그렇다면 일정한 크기의 컨테이너가 필요한 경우 어떻게해야합니까?

@Atomic_alarm 좀 더 자세히 설명해 주시겠습니까?
icza

골랑 아날로그 C- 어레이에 존재 하는가?

@Atomic_alarm 예, 배열도 Go에도 존재하며 상수 표현식이 아니며 런타임에 평가됩니다. 따라서 상수는 배열 유형이 될 수 없지만 변수는 될 수 있습니다. 예 :var arr = [2]int{2, 3}
icza

3

다른 사람들이 언급했듯이, 공식적인 Go 구성은 없습니다. 내가 상상할 수있는 가장 가까운 것은 슬라이스를 반환하는 함수 일 것입니다. 이런 식으로, 아무도 원본 슬라이스의 요소를 조작하지 않을 것을 보장 할 수 있습니다 (어레이에 "하드 코딩"되었기 때문에).

나는 그것을 짧게 만들기 위해 슬라이스를 단축했습니다 ...

func GetLetterGoodness() []float32 {
    return [...]float32 { .0817,.0149,.0278,.0425,.1270,.0223 }
}

4
이것은 가장 좋은 방법처럼 들리지만 func return 유형이 일치하지 않습니다. cannot use [6]string literal (type [6]string) as type []string in return argument그래서return []float32 { ... }
리믹스

@theRemix 세 가지 가능한 수정 사항 : (1) ...배열 리터럴 대신 슬라이스 리터럴을 선언하도록 제거하십시오 . (2) 반환 유형을로 변경하십시오 [6]float32. (3) 표현식을 배열 변수에 할당하고 a := [...]float32 { (etc.) }모든 요소의 슬라이스를 반환합니다 return a[:]. (배열 리터럴을 처리 할 수 ​​없으므로 이유가 확실하지 않습니다.)
David Moles

무슨 뜻인지 잘 모르겠습니다. 아마도 (단위) 테스트로 더 잘 해결 될 수있는 코드에서 무언가를 해결하려고하는 것처럼 들립니다.
Dynom
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.