2014-09-13 2 views
0

В JavaScript вы можете использовать .apply для вызова функции и передачи массива/среза для использования в качестве аргументов функции.Использование Array в качестве аргументов вызова функции

function SomeFunc(one, two, three) {} 

SomeFunc.apply(this, [1,2,3]) 

Мне интересно, есть ли эквивалент в Go?

func SomeFunc(one, two, three int) {} 

SomeFunc.apply([]int{1, 2, 3}) 

The Go - просто для того, чтобы дать вам представление.

+0

Go не динамический язык, и вы не должны действительно нужно сделать такую ​​вещь в Go. – fuz

ответ

2

Они называются VARIADIC функции и использовать синтаксис ... см Passing arguments to ... parameters в спецификации языка.

Пример этого:

package main 

import "fmt" 

func sum(nums ...int) (total int) { 
    for _, n := range nums { // don't care about the index 
     total += n 
    } 
    return 
} 

func main() { 
    many := []int{1,2,3,4,5,6,7} 

    fmt.Printf("Sum: %v\n", sum(1, 2, 3)) // passing multiple arguments 
    fmt.Printf("Sum: %v\n", sum(many...)) // arguments wrapped in a slice 
} 

Playground example

+0

Спасибо за ответ. Я узнал об этом через несколько часов, удивился, что раньше не пробовал. Кажется очевидным, когда вы знаете. – daryl

0

Возможно использование отражения, в частности Value.Call, однако вы действительно должны переосмыслить, почему вы хотите это сделать, а также изучить интерфейсы.

fn := reflect.ValueOf(SomeFunc) 
fn.Call([]reflect.Value{reflect.ValueOf(10), reflect.ValueOf(20), reflect.ValueOf(30)}) 

playground

+0

Что вы предлагаете с интерфейсами? – daryl

+0

@ daryl Я имел в виду, что вам следует подумать, почему вам нужно использовать этот динамический вызов и посмотреть, можете ли вы заменить его интерфейсом. – OneOfOne

+0

@OneOfOne это неправильное решение, подумайте трижды, прежде чем когда-либо импортировать отражение, и особенно, когда предлагаете другим сделать это. См. Ответ AndrewN для правильной работы. – Wessie

Смежные вопросы