在PHP中,我們有list()
,它使我們能夠在一個操作中將值分配給變量列表。例如:PHP的列表()相當於什麼?
list($a, $b) = ['valueA', 'valueB'];
echo $a; # valueA
echo $b; # valueB
Go有可能做同樣的事嗎?像Regexp.FindStringSubmatch()
這樣的函數會返回一個數組,所以將這個值直接映射到其他變量上會很好。
在PHP中,我們有list()
,它使我們能夠在一個操作中將值分配給變量列表。例如:PHP的列表()相當於什麼?
list($a, $b) = ['valueA', 'valueB'];
echo $a; # valueA
echo $b; # valueB
Go有可能做同樣的事嗎?像Regexp.FindStringSubmatch()
這樣的函數會返回一個數組,所以將這個值直接映射到其他變量上會很好。
你不能這樣做,但有一種方法可以通過利用它的變量的指針值來實現。
創建一個函數,將所有接收器變量的指針作爲切片傳遞,然後重新賦值。
func main() {
var arr = []string{"value 1", "value 2", "value 3"}
var a, b, c string
vcopy(arr, &a, &b, &c)
fmt.Println(a) // value 1
fmt.Println(b) // value 2
fmt.Println(c) // value 3
}
func vcopy(arr []string, dest ...*string) {
for i := range dest {
if len(arr) > i {
*dest[i] = arr[i]
}
}
}
http://play.golang.org/p/gJzWp1WglJ例
通過使用這種技術,傳遞任何變量是沒有問題的。
這只是不好的做法,爲什麼會有人使用它而不是:'a,b,c:= s [0],s [1],s [2]'?這也不是一個數組。 – OneOfOne
沒有什麼內置的,但你可以編寫自己的函數做同樣的事情:
func unlist(x []string) (string, string) {
return x[0], x[1]
}
a, b := unlist(values);
然而,這並不意味着就沒有辦法來概括這,這意味着你必須寫一個函數用於解構*你需要它的每個不同數量和類型的參數。
*注意:此操作的通用名稱是「解構賦值」。
請參閱http://stackoverflow.com/questions/19832189/unpack-golang-slices-on-assignment使用解包,不需要列表構造函數。 –