3 回答

TA貢獻1796條經驗 獲得超4個贊
首先,對于您嘗試做的事情,您應該使用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
后保留的返回值常規參數?!?/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

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.
}
- 3 回答
- 0 關注
- 217 瀏覽
添加回答
舉報