>백엔드 개발 >Golang >Go의 컴파일 타임 어설션(Golang)

Go의 컴파일 타임 어설션(Golang)

Mary-Kate Olsen
Mary-Kate Olsen원래의
2025-01-14 10:23:45659검색

Compile-Time Assertions in Go (Golang)

Go 언어 컴파일 시간 어설션 메커니즘은 런타임이 아닌 컴파일 단계에서 특정 조건이나 제약 조건을 적용하는 데 사용됩니다. 조건이 충족되지 않으면 컴파일 프로세스가 실패하고 오류를 보고합니다. 이는 가능한 한 빨리 오류를 감지하고 프로그램이 실행 전에 특정 불변성이나 가정을 충족하는지 확인하는 데 도움이 됩니다.

컴파일 시간 어설션은 다음과 같은 용도로 자주 사용됩니다.

  • 데이터 구조 크기가 예상한 것과 같은지 확인하세요.
  • 상수 또는 표현식의 값이 예상한 것과 같은지 확인하세요.
  • 유형 제약 조건이나 기타 컴파일 시간 검사를 시행하세요.

Go 언어의 컴파일 타임 어설션

Go 언어 자체는 다른 언어처럼 컴파일 타임 어설션을 직접 지원하지 않습니다. 그러나 몇 가지 영리한 기술을 사용하면 유사한 기능을 달성할 수 있습니다. 다음은 몇 가지 일반적인 방법입니다.

컴파일 시 상수 부울 식이 true(또는 false)인지 확인:

다음 기능을 활용할 수 있습니다.

Go 언어 사양에는 맵/슬라이스/배열 복합 리터럴의 상수 키가 반복될 수 없다고 명확하게 규정되어 있습니다.

예를 들어 다음 코드는 상수 부울 표현식 aBoolConst이 true인지 확인합니다. false이면 코드가 컴파일되지 않습니다.

<code class="language-go">const aBoolConst = true
var _ = map[bool]int{false: 0, aBoolConst: 1}</code>

상수 문자열의 길이가 15인지 확인:

<code class="language-go">const STR = "abcdefghij12345"
var _ = map[bool]int{false: 0, len(STR) == 15: 1}</code>

상수 정수가 15인지 확인:

<code class="language-go">var _ = [1]int{len(STR) - 15: 0}
//或者
var _ = [1]int{}[len(STR) - 15]</code>

상수 X가 상수 Y보다 작지 않다고 주장:

<code class="language-go">const _ uint = X - Y
//或者
type _ [X - Y]int</code>

상수 문자열이 비어 있지 않은지 확인:

<code class="language-go">var _ = aStringConst[0]
//或者
const _ = 1 / len(aStringConst)</code>

배열 크기 확인 사용:

<code class="language-go">import "unsafe"

type MyStruct struct {
    A int64
    B int64
}

// 确保结构体大小为16字节
var _ = [1]int{int(unsafe.Sizeof(MyStruct{}) - 16): 0}</code>

어설션 열거 길이:

<code class="language-go">type enumType int

const (
    EnumA enumType = iota
    EnumB
    EnumC
    end
)

var enumDescriptions = [...]string{
    EnumA: "first",
    EnumB: "second",
    EnumC: "third",
}

func (e enumType) String() string {
    if e == end {
        panic("invalid value")
    }
    return enumDescriptions[e]
}

var _ = [1]int{}[len(enumDescriptions) - int(end)]

func _() {
    var x [1]struct{}
    _ = x[EnumA - 0]
    _ = x[EnumB - 1]
    _ = x[EnumC - 2]
}</code>

init 기능과 panic 사용:

이것은 엄밀히 말하면 컴파일 타임 어설션은 아니지만 init 함수를 사용하여 프로그램 시작 시 실패하는 검사를 수행할 수 있습니다(초기화 중 런타임 어설션으로 효과적으로 작동).

<code class="language-go">const ExpectedSize = 8

var myInt int64

func init() {
    if unsafe.Sizeof(myInt) != ExpectedSize {
        panic("int size is not 8 bytes")
    }
}</code>

위 내용은 Go의 컴파일 타임 어설션(Golang)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.