Saya mendefinisikan struktur ...
type Session struct {
playerId string
beehive string
timestamp time.Time
}
Terkadang saya menetapkan sesi kosong untuk itu (karena nihil tidak mungkin)
session = Session{};
Lalu saya ingin memeriksa, apakah kosong:
if session == Session{} {
// do stuff...
}
Jelas ini tidak berhasil. Bagaimana cara menulisnya?
Jawaban:
Anda dapat menggunakan == untuk membandingkan dengan literal komposit nilai nol karena semua bidang dapat dibandingkan :
contoh taman bermain
Karena ambiguitas penguraian , tanda kurung diperlukan di sekitar literal komposit dalam kondisi if.
Penggunaan di
==
atas berlaku untuk struct yang semua bidangnya sebanding . Jika struct berisi bidang yang tidak dapat dibandingkan (irisan, peta, atau fungsi), bidang tersebut harus dibandingkan satu per satu dengan nilai nolnya.Alternatif untuk membandingkan seluruh nilai adalah dengan membandingkan bidang yang harus disetel ke nilai bukan nol dalam sesi yang valid. Misalnya, jika id pemain harus! = "" Dalam sesi yang valid, gunakan
sumber
session
bukan nol*Session
, maka gunakanif (Session{} == *session {
.struct containing []byte cannot be compared
karena, well, struct saya berisi potongan byte.==
perbandingan dengan bidang potongan akan gagal. Untuk membandingkan struct ini, gunakan salah satureflect.DeepEqual
atau pertimbangkan sesuatu yang lebih khusus seperti yang dibahas di sini: stackoverflow.com/questions/24534072/…Berikut adalah 3 saran atau teknik lainnya:
Dengan Bidang Tambahan
Anda dapat menambahkan bidang tambahan untuk mengetahui apakah struct telah diisi atau kosong. Aku sengaja menamakannya
ready
dan tidakempty
karena nilai nol daribool
adalahfalse
, jadi jika Anda membuat struct baru sepertiSession{}
yangready
lapangan akan secara otomatisfalse
dan akan memberitahu Anda kebenaran: bahwa struct tidak-belum siap (itu kosong).Saat Anda menginisialisasi struct, Anda harus mengatur
ready
ketrue
.isEmpty()
Metode Anda tidak diperlukan lagi (meskipun Anda dapat membuatnya jika Anda mau) karena Anda dapat mengujiready
bidang itu sendiri.Signifikansi dari satu
bool
bidang tambahan ini meningkat saat struct tumbuh lebih besar atau jika berisi bidang yang tidak sebanding (misalnya irisan,map
dan nilai fungsi).Menggunakan Nilai Nol dari Bidang yang Ada
Ini mirip dengan saran sebelumnya, tetapi menggunakan nilai nol dari bidang yang ada yang dianggap tidak valid jika struct tidak kosong. Kegunaan ini bergantung pada implementasi.
Misalnya jika dalam contoh Anda
playerId
tidak boleh kosongstring
""
, Anda dapat menggunakannya untuk menguji apakah struct Anda kosong seperti ini:Dalam hal ini, ada baiknya menggabungkan pemeriksaan ini ke dalam
isEmpty()
metode karena pemeriksaan ini bergantung pada implementasi:Dan menggunakannya:
Gunakan Pointer ke struct Anda
Saran kedua adalah dengan menggunakan Pointer untuk struct Anda:
*Session
. Pointer dapat memilikinil
nilai, jadi Anda dapat mengujinya:sumber
Menggunakan reflect.deepEqual juga berfungsi , terutama ketika Anda memiliki peta di dalam struct
sumber
Ingatlah bahwa dengan pointer ke struct Anda harus mendereferensi variabel dan tidak membandingkannya dengan pointer ke struct kosong:
Periksa taman bermain ini .
Juga di sini Anda dapat melihat bahwa struct yang memiliki properti yang merupakan potongan pointer tidak dapat dibandingkan dengan cara yang sama ...
sumber
Sebagai alternatif dari jawaban lain, dimungkinkan untuk melakukan ini dengan sintaks yang mirip dengan cara yang Anda maksudkan jika Anda melakukannya melalui
case
pernyataan daripadaif
:contoh taman bermain
sumber
Hanya tambahan cepat, karena saya menangani masalah yang sama hari ini:
Dengan Go 1.13, dimungkinkan untuk menggunakan
isZero()
metode baru :Saya tidak menguji ini terkait kinerja, tetapi saya rasa ini seharusnya lebih cepat, daripada membandingkan melalui
reflect.DeepEqual()
.sumber
Mungkin seperti ini
sumber