php小編小新分享一種實用技巧,即如何在切片(Slice)增長時自動將新增的元素添加到函數(shù)參數(shù)中。切片是一種靈活的數(shù)據(jù)結(jié)構(gòu),但在函數(shù)參數(shù)中使用時可能會遇到一些挑戰(zhàn)。本文將介紹一種簡潔的方法,通過使用可變參數(shù)(Variadic Arguments)和展開操作符(Spread Operator),實現(xiàn)隨著切片增長自動添加新元素到函數(shù)參數(shù)的功能。這個技巧能夠提高代碼的可讀性和可維護性,讓我們一起來學習吧!
問題內(nèi)容
有沒有辦法自動執(zhí)行此操作?
package main
import "fmt"
func main() {
var a []string
a = append(a, "this", "this2", "this3")
increaseArguments(a)
a = append(a, "this4")
increaseArguments(a)
}
func increaseArguments(b []string) {
// I want, when i add new element to slice i want this function act as this
// fmt.Println(b[0],b[1], b[2], b[3])
fmt.Println(b[0], b[1], b[2])
}
登錄后復制
有沒有辦法自動添加 b[3] 作為 fmt.println 的參數(shù)?
解決方法
請注意,如果 b 的類型為 []any,您可以將其作為 fmt.println():
fmt.println(b...)
登錄后復制
但是由于 b 的類型是 []string,所以你不能。
但是如果將 b 轉(zhuǎn)換為 []any 切片,則可以。您可以使用此輔助函數(shù)來完成此操作:
func convert[t any](x []t) []any {
r := make([]any, len(x))
for i, v := range x {
r[i] = v
}
return r
}
登錄后復制
然后:
func increasearguments(b []string) {
fmt.println(convert(b)...)
}
登錄后復制
這將輸出(在 go playground 上嘗試):
this this2 this3 this this2 this3 this4
登錄后復制
注意:在 convert() 中創(chuàng)建一個新切片不會使該解決方案變慢,因為顯式傳遞值(如 fmt.println(b[0], b[1], b[2]) )隱式創(chuàng)建一個切片。
查看相關問題:如何傳遞多個返回值可變參數(shù)函數(shù)的值?






