2016-04-26 3 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

Вы не можете сделать это в go, но есть способ достичь этого, используя значение указателя его переменной.

Создайте функцию, передайте указатель всех переменных получателя в виде срезов, затем повторно назначьте значение.

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