Rumah >pembangunan bahagian belakang >Golang >Kompilasi Penegasan Masa dalam Go (Golang)

Kompilasi Penegasan Masa dalam Go (Golang)

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-14 10:23:45709semak imbas

Compile-Time Assertions in Go (Golang)

Mekanisme penegasan masa kompilasi bahasa Go digunakan untuk menguatkuasakan syarat atau kekangan tertentu pada peringkat penyusunan dan bukannya pada masa jalan. Jika syarat tidak dipenuhi, proses penyusunan akan gagal dan melaporkan ralat, yang membantu untuk mengesan ralat seawal mungkin dan memastikan program itu memenuhi invarian atau andaian tertentu sebelum pelaksanaan.

Penegasan masa kompilasi sering digunakan untuk:

  • Pastikan saiz struktur data adalah seperti yang diharapkan.
  • Sahkan bahawa nilai pemalar atau ungkapan adalah seperti yang dijangkakan.
  • Kuatkuasakan kekangan jenis atau semakan masa penyusunan lain.

Kompilasi penegasan masa dalam bahasa Go

Bahasa Go itu sendiri tidak secara langsung menyokong penegasan masa kompilasi seperti beberapa bahasa lain. Walau bagaimanapun, kita boleh mencapai fungsi yang sama dengan beberapa teknik pintar. Berikut adalah beberapa kaedah biasa:

Tegaskan bahawa ungkapan boolean malar adalah benar (atau salah) pada masa penyusunan:

Kami boleh memanfaatkan ciri berikut:

Spesifikasi bahasa Go dengan jelas menetapkan bahawa kunci malar dalam literal komposit peta/hirisan/tatasusunan tidak boleh diulang.

Sebagai contoh, kod berikut memastikan bahawa ungkapan Boolean malar aBoolConst adalah benar. Jika ia palsu, kod itu tidak akan disusun.

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

Tegaskan bahawa panjang rentetan tetap ialah 15:

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

Tegaskan bahawa integer malar ialah 15:

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

Tegaskan bahawa pemalar X adalah tidak kurang daripada pemalar Y:

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

Tegaskan bahawa rentetan malar tidak kosong:

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

Gunakan semakan saiz tatasusunan:

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

type MyStruct struct {
    A int64
    B int64
}

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

Tegaskan panjang penghitungan:

<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>

Gunakan fungsi init dan panic:

Walaupun ini bukan hanya penegasan masa kompilasi, anda boleh menggunakan fungsi init untuk melakukan semakan yang akan gagal apabila atur cara bermula (bertindak secara berkesan sebagai penegasan masa jalan semasa pemula):

<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>

Atas ialah kandungan terperinci Kompilasi Penegasan Masa dalam Go (Golang). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn