首頁  >  文章  >  後端開發  >  為什麼我的 fmt.Fprintf 包裝器會列印意外的輸出?

為什麼我的 fmt.Fprintf 包裝器會列印意外的輸出?

DDD
DDD原創
2024-11-12 22:51:02349瀏覽

Why Does My fmt.Fprintf Wrapper Print Unexpected Output?

將參數傳遞給可變參數函數

Go 中的可變參數函數接受可變數量的參數,這些參數儲存為指定類型的切片。當呼叫可變參數函數時,了解參數的傳遞方式至關重要。

問題:fmt.Fprintf 包裝器中的額外輸出

考慮以下嘗試圍繞fmt.Fprintf 建立包裝器的程式碼使用可變長度參數:

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

呼叫Die("foo") 時,輸出包含意外的「%%!(EXTRA []interface {}=[])」。

解:使用省略號...傳遞參數

問題是由於將args切片直接傳遞給fmt.Sprintf而產生的。要正確地單獨傳遞參數,必須使用省略號運算子...:

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

透過使用...,args 切片的每個元素都作為單獨的參數傳遞給fmt.Sprintf,從而解決發出並產生預期的輸出:

foo

以上是為什麼我的 fmt.Fprintf 包裝器會列印意外的輸出?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn