首页 >后端开发 >Golang >为什么我的 fmt.Fprintf 包装器打印意外的输出?

为什么我的 fmt.Fprintf 包装器打印意外的输出?

DDD
DDD原创
2024-11-12 22:51:02434浏览

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