Jadual Kandungan
Kompilasi penegasan masa dalam bahasa Go
Tegaskan bahawa ungkapan boolean malar adalah benar (atau salah) pada masa penyusunan:
Tegaskan bahawa panjang rentetan tetap ialah 15:
Tegaskan bahawa integer malar ialah 15:
Tegaskan bahawa pemalar X adalah tidak kurang daripada pemalar Y:
Tegaskan bahawa rentetan malar tidak kosong:
Gunakan semakan saiz tatasusunan:
Tegaskan panjang penghitungan:
Gunakan fungsi init dan panic:
Rumah pembangunan bahagian belakang Golang Kompilasi Penegasan Masa dalam Go (Golang)

Kompilasi Penegasan Masa dalam Go (Golang)

Jan 14, 2025 am 10:23 AM

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.

const aBoolConst = true
var _ = map[bool]int{false: 0, aBoolConst: 1}
Salin selepas log masuk

Tegaskan bahawa panjang rentetan tetap ialah 15:

const STR = "abcdefghij12345"
var _ = map[bool]int{false: 0, len(STR) == 15: 1}
Salin selepas log masuk

Tegaskan bahawa integer malar ialah 15:

var _ = [1]int{len(STR) - 15: 0}
//或者
var _ = [1]int{}[len(STR) - 15]
Salin selepas log masuk

Tegaskan bahawa pemalar X adalah tidak kurang daripada pemalar Y:

const _ uint = X - Y
//或者
type _ [X - Y]int
Salin selepas log masuk

Tegaskan bahawa rentetan malar tidak kosong:

var _ = aStringConst[0]
//或者
const _ = 1 / len(aStringConst)
Salin selepas log masuk

Gunakan semakan saiz tatasusunan:

import "unsafe"

type MyStruct struct {
    A int64
    B int64
}

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

Tegaskan panjang penghitungan:

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]
}
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):

const ExpectedSize = 8

var myInt int64

func init() {
    if unsafe.Sizeof(myInt) != ExpectedSize {
        panic("int size is not 8 bytes")
    }
}
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!

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

Tag artikel panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

GO Language Pack Import: Apakah perbezaan antara garis bawah dan tanpa garis bawah? GO Language Pack Import: Apakah perbezaan antara garis bawah dan tanpa garis bawah? Mar 03, 2025 pm 05:17 PM

GO Language Pack Import: Apakah perbezaan antara garis bawah dan tanpa garis bawah?

Bagaimana saya menulis objek dan stub untuk ujian di GO? Bagaimana saya menulis objek dan stub untuk ujian di GO? Mar 10, 2025 pm 05:38 PM

Bagaimana saya menulis objek dan stub untuk ujian di GO?

Bagaimana untuk melaksanakan pemindahan maklumat jangka pendek antara halaman dalam kerangka beego? Bagaimana untuk melaksanakan pemindahan maklumat jangka pendek antara halaman dalam kerangka beego? Mar 03, 2025 pm 05:22 PM

Bagaimana untuk melaksanakan pemindahan maklumat jangka pendek antara halaman dalam kerangka beego?

Bagaimana saya boleh menggunakan alat pengesanan untuk memahami aliran pelaksanaan aplikasi saya? Bagaimana saya boleh menggunakan alat pengesanan untuk memahami aliran pelaksanaan aplikasi saya? Mar 10, 2025 pm 05:36 PM

Bagaimana saya boleh menggunakan alat pengesanan untuk memahami aliran pelaksanaan aplikasi saya?

Bagaimana saya boleh menentukan kekangan jenis tersuai untuk generik di GO? Bagaimana saya boleh menentukan kekangan jenis tersuai untuk generik di GO? Mar 10, 2025 pm 03:20 PM

Bagaimana saya boleh menentukan kekangan jenis tersuai untuk generik di GO?

Bagaimana cara menulis fail dalam bahasa Go dengan mudah? Bagaimana cara menulis fail dalam bahasa Go dengan mudah? Mar 03, 2025 pm 05:15 PM

Bagaimana cara menulis fail dalam bahasa Go dengan mudah?

Bagaimana cara menukar senarai hasil pertanyaan mysql ke dalam slice struktur tersuai dalam bahasa Go? Bagaimana cara menukar senarai hasil pertanyaan mysql ke dalam slice struktur tersuai dalam bahasa Go? Mar 03, 2025 pm 05:18 PM

Bagaimana cara menukar senarai hasil pertanyaan mysql ke dalam slice struktur tersuai dalam bahasa Go?

Bagaimanakah saya menulis tanda aras yang mencerminkan prestasi dunia secara tepat di GO? Bagaimanakah saya menulis tanda aras yang mencerminkan prestasi dunia secara tepat di GO? Mar 10, 2025 pm 05:36 PM

Bagaimanakah saya menulis tanda aras yang mencerminkan prestasi dunia secara tepat di GO?

See all articles