source

상수 배열 선언

nicesource 2023. 6. 3. 08:30
반응형

상수 배열 선언

시도해 본 결과:

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 }

첫 번째 선언과 초기화는 잘 작동하지만 두 번째, 세 번째, 네 번째는 작동하지 않습니다.

고정 플로트 배열을 선언하고 초기화하려면 어떻게 해야 합니까?

배열은 본질적으로 불변하지 않습니다. 일정하게 만들 수 없습니다.

가장 가까운 위치는 다음과 같습니다.

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 }

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

@jimt가 지적했듯이,[...]T를 의미합니다.[123]T이것은 고정 크기 배열을 만들지만 컴파일러가 그 안에 몇 개의 요소가 있는지 알아낼 수 있습니다.

유효 출발점:

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정의된 패키지에서만 사용할 수 있습니다.외부에서 읽기 액세스가 필요한 경우 간단한 게터 함수를 작성할 수 있습니다(게터골랑 참조).

바둑에는 배열 상수 같은 것이 없습니다.

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

배열이 필요한 경우 변수만 될 수 있고 상수는 될 수 없습니다.

상수에 대한 다음과 같은 훌륭한 블로그 기사를 추천합니다.상수

다른 사람들이 언급했듯이, 이것에 대한 공식적인 바둑 구조는 없습니다.내가 상상할 수 있는 가장 가까운 것은 슬라이스를 반환하는 함수일 것입니다.이렇게 하면 원래 슬라이스의 요소를 아무도 조작하지 않을 것임을 보장할 수 있습니다( 배열에 "하드 코딩"됨).

당신의 조각을 줄여서...더 짧은...:

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

위의 @Paul의 답변 외에도 배열의 개별 요소에만 액세스해야 하는 경우(즉, 배열에서 반복하거나 배열 길이를 가져오거나 배열에서 조각을 작성할 필요가 없는 경우)에도 다음 작업을 수행할 수 있습니다.

대신에

var myArray [...]string{ /* ... */ }

할수있습니다

func myConstArray(n int) string {
  return [...]string{ /* ... */ }[n]
}

그런 다음 요소를 추출하는 대신

str := myArray[i]

당신은 그것들을 추출합니다.

str := myConstArray(i)

Godbolt에 대한 링크: https://godbolt.org/z/8hz7E45eW (어셈블리에서 어떻게 하는지 참고)main배열의 복사본이 수행되지 않으며 컴파일러가 n이 컴파일 시간에 알려진 경우 해당 요소를 추출할 수 있는 방법(일반적인 비 상수 배열에서는 불가능한 것).

대신 어레이에서 반복하거나 슬라이스를 만들어야 하는 경우, @Paul의 답변은 여전히 유효합니다. (함수가 호출될 때마다 어레이의 복사본을 만들어야 하므로 런타임에 상당한 영향을 미칠 가능성이 있음에도 불구하고).

불행히도 이것은 https://github.com/golang/go/issues/6386 이 해결될 때까지 얻을 수 있는 상수 배열에 가장 가까운 것입니다.


◦ 엄밀히 말하면, 제 답변에 설명된 것처럼 상수 배열로도 할 수 있지만, 꽤 못생겼고 런타임에 효율적이지 않습니다: https://go.dev/play/p/rQEWQhufGyK.

언급URL : https://stackoverflow.com/questions/13137463/declare-a-constant-array

반응형