Rumah  >  Artikel  >  pembangunan bahagian belakang  >  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
WBOYke hadapan
2024-02-12 20:20:091186semak imbas

具有 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)

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")

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?

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"
    }
}

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))

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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam