it-swarm.dev

الذهاب تفريغ صفيف الحجج

لذلك في Python و Ruby يوجد عامل splat (*) لتفريغ صفيف كوسيطات. في Javascript هناك وظيفة .apply (). هل هناك طريقة لتفريغ صفيف/شريحة كوسائط دالة في Go؟ أي موارد لهذا سيكون كبيرا كذلك!

شيء على غرار هذا:

func my_func(a, b int) (int) {
    return a + b
}

func main() {
    arr := []int{2,4}
    sum := my_func(arr)
}

أعتذر إذا ارتكبت أخطاء نحوية/متنوعة. أنا جديد على الذهاب.

73
eatonphil

يمكنك استخدام بناء جملة vararg يشبه C:

package main
import "fmt"

func my_func( args ...int) int {
   sum := 0
   for _,v := range args {
      sum = sum + v
   }

   return sum;
}

func main() {
    arr := []int{2,4}
    sum := my_func(arr...)
    fmt.Println("Sum is ", sum)
}

يمكنك الآن جمع العديد من الأشياء التي تريدها. لاحظ الرمز المهم ... بعد استدعاء دالة my_func المهمة.

مثال قيد التشغيل: http://ideone.com/8htWfx

116
Hunter McMillen

إما أن تكون وظيفتك هي varargs ، حيث يمكنك استخدام شريحة مع رمز ... كما يظهر Hunter McMillen ، أو أن وظيفتك بها عدد ثابت من الوسائط ويمكنك فك حزمها عند كتابة التعليمات البرمجية الخاصة بك.

إذا كنت تريد فعل ذلك ديناميكيًا باستخدام دالة ذات عدد ثابت من الوسائط ، يمكنك استخدام الانعكاس:

package main
import "fmt"
import "reflect"

func my_func(a, b int) (int) {
    return a + b
}

func main() {
    arr := []int{2,4}
    var args []reflect.Value
    for _, x := range arr {
        args = append(args, reflect.ValueOf(x))
    }
    fun := reflect.ValueOf(my_func)
    result := fun.Call(args)
    sum := result[0].Interface().(int)
    fmt.Println("Sum is ", sum)
}
5
newacct