第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

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

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

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

3 回答

?
慕的地8271018

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

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

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

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

fmt.Printf()具有以下簽名:

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

fmt.Printf()除了函數(shù)調用(調用的返回值)之外,您不能將其他參數(shù)傳遞給。

請注意,簽名fmt.Println()是:

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

這意味著它fmt.Println(temp())可以工作,對于任何其他至少具有一個返回值的函數(shù)也是如此,因為引用部分的最后一句話允許這個(“如果f有一個最終...參數(shù),它被分配返回值g后保留的返回值常規(guī)參數(shù)?!?/em>?)

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

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

這意味著這有效:

func main() {

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

}


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

并正確打?。ㄔ贕o Playground上嘗試):


1: 1, 2: 2

所以我們只需要一個實用函數(shù),將任何函數(shù)的返回值包裝到一個 中[]interface{},這樣我們就可以使用它傳遞給fmt.Printf().


它非常簡單:


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

? ? return vs

}

如上所述(使用fmt.Println()),我們可以將至少具有 1 個返回值的任何函數(shù)的返回值作為wrap()其輸入參數(shù)的值傳遞。


現(xiàn)在使用這個wrap()函數(shù),看下面的例子:


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

[編輯]


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


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 關注
  • 223 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

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

公眾號

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