当前位置: 首页 > 面试题库 >

如何解析golang中的多个收益

尹兴生
2023-03-14
问题内容

我有一个Go函数,它返回两个整数值。下面是功能

func temp() (int, int){
 return 1,1
}

是否可以将temp函数直接放入a Println并使用以下字符串格式打印两个输出:

fmt.Println("first= %d and second = %d", temp() ) // This doesn't work

在Python中,我可以执行以下操作:

def func():
    return 1,1
print("{0}={1}".format(*func())
>> '1=2'

我也可以在Go中做类似的事情吗?


问题答案:

前言:
我在中发布了此实用程序github.com/icza/gox,请参见builtinx.Wrap()

首先,对于您尝试执行的操作,应该使用fmt.Printf()而不是fmt.Println()仅按照前者的预期使用并使用格式字符串

展望未来,默认情况下不支持此操作,因为从Spec:Calls中引用:

作为一种特殊情况,如果一个函数或方法的返回值g数量相等并且可以分别分配给另一个函数或方法的参数f,则该调用f(g(parameters_of_g))将在按顺序f将返回值绑定g到参数之后调用f
的调用f除的调用外不得包含任何参数g,并且g必须至少具有一个返回值。如果f具有最终...参数,则分配g常规参数后保留的返回值。

fmt.Printf()具有以下特征:

func Printf(format string, a ...interface{}) (n int, err error)

fmt.Printf()除了函数调用(调用的返回值)之外,您不能将其他参数传递给其他参数。

请注意,的签名fmt.Println()为:

func Println(a ...interface{}) (n int, err error)

这意味着它fmt.Println(temp())起作用,并且对于具有至少一个返回值的任何其他函数也是如此,因为带引号的部分的最后一句话允许这样做(
“如果f具有最终...参数,则为其分配返回值,将g其分配给常规参数。“

但是,通过一些技巧,我们也可以实现您想要的fmt.Printf()

请注意,如果temp()将返回type的值[]interface{},我们可以...将其用作某些可变参数的值。

这意味着工作:

func main() {
    fmt.Printf("1: %v, 2: %v\n", temp()...)
}

func temp() []interface{} { return []interface{}{1, 2} }

并正确打印(在Go Playground上尝试):

1: 1, 2: 2

因此,我们只需要一个实用函数即可将任何函数的返回值包装到中[]interface{},因此我们可以将其传递给fmt.Printf()

这简直是​​太简单了:

func wrap(vs ...interface{}) []interface{} {
    return vs
}

如上文所述(使用fmt.Println()),我们可以将至少具有1个返回值的任何函数的返回值wrap()作为其输入参数的值传递。

现在使用此wrap()功能,请参见以下示例:

func main() {
    fmt.Printf("1: %v\n", wrap(oneInt())...)
    fmt.Printf("1: %v, 2: %v\n", wrap(twoInts())...)
    fmt.Printf("1: %v, 2: %v, 3: %v\n", wrap(threeStrings())...)
}

func oneInt() int { return 1 }

func twoInts() (int, int) { return 1, 2 }

func threeStrings() (string, string, string) { return "1", "2", "3" }

这可行,并且输出(在Go Playground上尝试):

1: 1
1: 1, 2: 2
1: 1, 2: 2, 3: 3


 类似资料:
  • 问题内容: 输出: 我有api调用返回的结果,它就像对象数组(json数组)的复杂格式。我需要通过golang解析该结果,我该如何实现?以下数据是我的结果,它是从api调用获取的。 问题答案: 您仅错过了一点:您需要导出结构的字段: 它将起作用(在Go Playground上尝试): 请注意,JSON文本包含带有小写字母文本的字段名称,但是包足够“聪明”以匹配它们。如果它们完全不同,则可以使用st

  • 问题内容: 我过去一直通过gomail.v2发送电子邮件的唯一方法是对一个循环中的每个电子邮件使用Send()函数。但是我需要显示其他已发送相同电子邮件的电子邮件地址。 我发现了类似的东西: 通过仅将电子邮件发送给字符串中的第一个收件人来工作。并且在电子邮件管理器(例如Gmail,Outlook或任何其他其他收件人地址)中显示但未发送。 我应该怎么做呢? 问题答案: 试试看吗?

  • 一般名词都是类(名词提炼法) 飞机发射两颗炮弹摧毁了8辆装甲车 飞机 炮弹 装甲车 隔壁老王在公车上牵着一条叼着热狗的草泥马 老王 热狗 草泥马

  • 问题内容: 我对iOS应用程序开发非常陌生,并且从服务器收到以下响应: 请任何人帮助我了解如何在我的应用程序中使用员工ID和员工姓名。 问题答案: 您的JSON数据看起来像“嵌套JSON”,这意味着您必须将其反序列化两次。 第一个反序列化从您的JSON数据中提取一个字符串: 现在是字符串 再次是JSON数据。第二个反序列化提取数组: 现在您可以像访问它

  • 问题内容: 场景:我正在尝试解析一个XML结构,但我不知道如何在xml属性值包含文本和更多嵌套值的情况下建立结构。所有其他属性都已正确设置,我不确定是否需要获取源的值并创建一个单独的解析器来检索元素的值。 编辑: 我正在尝试将源解析为以下形式的字符串:你好%{first_name}%{last_name} 用当前结构解组xml字符串将返回一个空结构 使用innerxml的@plato将源设置为:

  • 对于“航班”组合应用程序,我正在尝试为飞机上的每个座位生成机票(以便航班预先填充一些人)。这是一个功能的一部分,该功能还将航班预先填充到数据库以设置数据。有对数据库的调用,以检查航班号和确认号是否是唯一的,而不是预先存在的。在航班的情况下,如果航班号已经存在,则该航班将被删除。但是,如果确认号处于循环状态时已经存在,则重新生成确认号的异步方面遇到了一些问题。所以本质上,我遇到的问题: Genera