Rumah > pembangunan bahagian belakang > Golang > Sprintf dengan 3 hujah jenis penunjuk yang berbeza (boleh jadi nol). Pengendali ternary tidak tersedia, bagaimana untuk mengelakkan menulis berpuluh-puluh baris?

Sprintf dengan 3 hujah jenis penunjuk yang berbeza (boleh jadi nol). Pengendali ternary tidak tersedia, bagaimana untuk mengelakkan menulis berpuluh-puluh baris?

WBOY
Lepaskan: 2024-02-12 20:20:09
ke hadapan
1244 orang telah melayarinya

具有 3 个不同指针类型的参数(可以为 nil)的 Sprintf。三元运算符不可用,如何避免写几十行?

Editor PHP Zimo berada di sini untuk menjawab soalan tentang fungsi Sprintf. Kadangkala kita perlu menggunakan fungsi Sprintf untuk memformat rentetan, tetapi dalam beberapa kes, kita mungkin menghadapi situasi dengan parameter tiga jenis penunjuk yang berbeza, dan parameter ini mungkin tiada. Dalam kes ini, kami tidak boleh menggunakan operator ternary, jika tidak, kod akan menjadi verbose dan tidak mudah dibaca. Jadi, bagaimanakah kita harus mengelak daripada menulis berpuluh-puluh baris kod yang panjang? Seterusnya, saya akan berkongsi dengan anda penyelesaian mudah.

Kandungan soalan

Saya mahu mencipta rentetan ini menggunakan sprintf

message := fmt.sprintf("unit %s has a level of %v, but is of category %v",
    *entity.name, *entity.levelcode, *entity.categorycode)
Salin selepas log masuk

Dalam entiti, pembolehubah ialah penunjuk, yang boleh menjadi nil:

  • name*string
  • levelcode 具有 *levelcodeJenis
  • categorycode 具有 *categorycodeJenis

Tetapi jika mereka mempunyai nilai, saya mahu nilai itu bukan penunjuk. (iaitu unit abc mempunyai tahap sifar tetapi tergolong dalam kategori snap-in )

Tidak kira bahasa apa yang saya gunakan, saya akan menulis seperti ini:

message := fmt.sprintf("unit %s has a level of %v, but is of %v category",
    entity.name != nil ? *entity.name : "nil", entity.levelcode != nil ? *entity.levelcode : "nil", entity.categorycode != nil ? *entity.categorycode : "nil")
Salin selepas log masuk

Tetapi go tidak membenarkan pengendali ternary. Jika saya tidak mengendalikan nilai nil, sprintf akan membuang pengecualian.

Jadi, adakah saya perlu bermula seperti ini?

if entity.Name == nil && entity.LevelCode != nil && entity.CategoryCode != nil) {
   message := "Unit nil has a Level of nil, but is of nil Category"
}
else {
   if entity.Name != nil && entity.LevelCode != nil && entity.CategoryCode != nil) {
     message := fmt.Sprintf("Unit %s has a Level of nil, but is of nil Category",
    entity.Name != nil ? *entity.Name : "nil")
   }
   else {
      ...

     for 9 combinations of values nil or not nil values, and 9 sprintf formats?
   }
}

What the shortest way to dump my variables content in a formatted line?
Salin selepas log masuk

Penyelesaian

Terima kasih, dengan bantuan anda saya berjaya membina fungsi tersebut.

// value treat pointers that can be nil, and return their values if they aren't.
func value[t any](v *t) string {
    if (v != nil) {
        return fmt.sprintf("%v", *v)
    } else {
        return "nil"
    }
}
Salin selepas log masuk

Dipanggil begini

message := fmt.Sprintf("Unit %s has a Level of %v, but is of %v Category",
    value(entity.Name), value(entity.LevelCode), value(entity.CategoryCode))
Salin selepas log masuk

Menulis lima kenyataan untuk satu sprintf...tetapi ia berkesan.

Atas ialah kandungan terperinci Sprintf dengan 3 hujah jenis penunjuk yang berbeza (boleh jadi nol). Pengendali ternary tidak tersedia, bagaimana untuk mengelakkan menulis berpuluh-puluh baris?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan