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:
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:
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>
<code class="language-go">const STR = "abcdefghij12345" var _ = map[bool]int{false: 0, len(STR) == 15: 1}</code>
<code class="language-go">var _ = [1]int{len(STR) - 15: 0} //或者 var _ = [1]int{}[len(STR) - 15]</code>
<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
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!