2016-04-26 67 views
-2

在PHP中,我們有list(),它使我們能夠在一個操作中將值分配給變量列表。例如:PHP的列表()相當於什麼?

list($a, $b) = ['valueA', 'valueB']; 
echo $a; # valueA 
echo $b; # valueB 

Go有可能做同樣的事嗎?像Regexp.FindStringSubmatch()這樣的函數會返回一個數組,所以將這個值直接映射到其他變量上會很好。

+3

請參閱http://stackoverflow.com/questions/19832189/unpack-golang-slices-on-assignment使用解包,不需要列表構造函數。 –

回答

0

你不能這樣做,但有一種方法可以通過利用它的變量的指針值來實現。

創建一個函數,將所有接收器變量的指針作爲切片傳遞,然後重新賦值。

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

通過使用這種技術,傳遞任何變量是沒有問題的。

+0

這只是不好的做法,爲什麼會有人使用它而不是:'a,b,c:= s [0],s [1],s [2]'?這也不是一個數組。 – OneOfOne

1

沒有什麼內置的,但你可以編寫自己的函數做同樣的事情:

func unlist(x []string) (string, string) { 
    return x[0], x[1] 
} 

a, b := unlist(values); 

然而,這並不意味着就沒有辦法來概括這,這意味着你必須寫一個函數用於解構*你需要它的每個不同數量和類型的參數。

*注意:此操作的通用名稱是「解構賦值」。

+0

這甚至沒有有效去.. – OneOfOne

+0

@OneOfOne:我很抱歉,但有人不斷編輯答案是無效的。他顯然不明白go的多重返回值是如何工作的。 – slebetman

+0

@Noval Agung Prayogo:請不要將工作代碼更改爲無效的代碼。請了解如何返回工作 – slebetman