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

Kompilasi Penegasan Masa dalam Go (Golang)

Mary-Kate Olsen
Lepaskan: 2025-01-14 10:23:45
asal
662 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

Tegaskan bahawa integer malar ialah 15:

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

Tegaskan bahawa pemalar X adalah tidak kurang daripada pemalar Y:

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

Tegaskan bahawa rentetan malar tidak kosong:

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

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan