Rumah >pembangunan bahagian belakang >Golang >Mengapa Pembungkus fmt.Fprintf Saya Mencetak Output Tidak Dijangka?

Mengapa Pembungkus fmt.Fprintf Saya Mencetak Output Tidak Dijangka?

DDD
DDDasal
2024-11-12 22:51:02477semak imbas

Why Does My fmt.Fprintf Wrapper Print Unexpected Output?

Melalukan Argumen kepada Fungsi Variadik

Fungsi variadik dalam Go menerima bilangan argumen yang berubah-ubah, yang disimpan sebagai kepingan jenis yang ditentukan. Apabila memanggil fungsi variadic, adalah penting untuk memahami cara hujah dihantar.

Masalah: Output Tambahan dalam fmt.Fprintf Wrapper

Pertimbangkan kod berikut yang cuba membuat pembalut di sekeliling fmt.Fprintf dengan argumen panjang boleh ubah:

func Die(format string, args ...interface{}) {
    str := fmt.Sprintf(format, args)
    fmt.Fprintf(os.Stderr, "%v\n", str)
    os.Exit(1)
}

Apabila memanggil Die("foo"), output mengandungi "%%!(EXTRA []antara muka {}=[])" yang tidak dijangka.

Penyelesaian: Menggunakan Ellipsis ... untuk Lulus Argumen

Isu timbul daripada menghantar kepingan args terus ke fmt.Sprintf. Untuk menghantar argumen secara individu dengan betul, pengendali elipsis ... mesti digunakan:

package main

import (
    "fmt"
    "os"
)

func Die(format string, args ...interface{}) {
    str := fmt.Sprintf(format, args...)
    fmt.Fprintf(os.Stderr, "%v\n", str)
    os.Exit(1)
}

func main() {
    Die("foo")
}

Dengan menggunakan ..., setiap elemen hirisan args dihantar sebagai argumen berasingan kepada fmt.Sprintf, menyelesaikan mengeluarkan dan menghasilkan output yang dijangkakan:

foo

Atas ialah kandungan terperinci Mengapa Pembungkus fmt.Fprintf Saya Mencetak Output Tidak Dijangka?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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