亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何將多個返回值傳遞給可變參數函數?

如何將多個返回值傳遞給可變參數函數?

Go
明月笑刀無情 2023-04-17 16:13:12
我有一個返回兩個整數值的 Go 函數。下面是函數func temp() (int, int){ return 1,1}是否可以將temp函數直接放入 aPrintln并使用如下字符串格式打印兩個輸出:fmt.Println("first= %d and second = %d", temp() ) // This doesn't work在 Python 中,我能夠執行以下操作:def func():    return 1,1print("{0}={1}".format(*func())>> '1=2'我也可以在 Go 中做類似的事情嗎?
查看完整描述

3 回答

?
慕的地8271018

TA貢獻1796條經驗 獲得超4個贊

首先,對于您嘗試做的事情,您應該使用fmt.Printf()而不是像fmt.Println()前者期望的那樣使用格式字符串。

展望未來,這在默認情況下不受支持,因為引用自Spec: Calls:

作為一種特殊情況,如果一個函數或方法的返回值g在數量上相等并且可以單獨分配給另一個函數或方法的參數f,那么調用將在按順序將返回值綁定到參數后f(g(parameters_of_g))調用。除了 的調用之外,的調用不得包含任何參數,并且必須至少有一個返回值。如果有一個最終參數,它會被分配常規參數分配后剩余的返回值。fgffggf...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后保留的返回值常規參數?!?/em>?)

但是通過一些小技巧,我們也可以實現你想要的fmt.Printf()

請注意,如果temp()返回一個類型的值[]interface{},我們可以將...其作為一些可變參數的值傳遞。

這意味著這有效:

func main() {

? ? fmt.Printf("1: %v, 2: %v\n", temp()...)

}


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

并正確打?。ㄔ贕o 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


查看完整回答
反對 回復 2023-04-17
?
泛舟湖上清波郎朗

TA貢獻1818條經驗 獲得超3個贊

不,這是不可能的。您必須將多值表達式中的所有值分配給單獨的變量才能使用它們,例如:


a, b := temp()

fmt.Println("first = %d and second = %d", a, b)

// first = 1 and second = 1

[編輯]


有趣的是,在某些情況下,如果參數類型和元數匹配,或者對于純可變參數函數( Go Playground),您似乎可以使用多值表達式作為函數調用參數:


func oneTwo() (int, int) {

  return 1, 2

}


func incr2(x, y int) (int, int) {

  return x + 1, y + 1

}


func main() {

  incr2(oneTwo()) // OK: multi-value return and arguments match.


  fmt.Println(oneTwo()) // OK: pure variadic function.


  fmt.Printf("%d %d", oneTwo()) // ERR: mixed formal and variadic args.

}



查看完整回答
反對 回復 2023-04-17
?
哈士奇WWW

TA貢獻1799條經驗 獲得超6個贊

當我沒有使用任何字符串格式時,我能夠打印它,如下所示

fmt.Println(temp())

這僅由 支持Println,但不支持printf


查看完整回答
反對 回復 2023-04-17
  • 3 回答
  • 0 關注
  • 217 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號