Pergi Membongkar Array Sebagai Argumen

107

Jadi di Python dan Ruby ada operator percikan (*) untuk membongkar array sebagai argumen. Dalam Javascript ada fungsi .apply (). Apakah ada cara untuk membongkar array / slice sebagai argumen fungsi di Go? Sumber daya apa pun untuk ini akan bagus juga!

Sesuatu di sepanjang garis ini:

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

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

Saya mohon maaf jika saya membuat kesalahan sintaksis / bermacam-macam. Saya baru mengenal Go.

eatonphil.dll
sumber
4
Pertama-tama, arrbukanlah sebuah array. Ini sepotong .
newacct

Jawaban:

165

Anda dapat menggunakan sintaks vararg yang mirip dengan 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)
}

Sekarang Anda dapat menjumlahkan sebanyak yang Anda mau. Perhatikan yang penting ...setelah Anda memanggil my_funcfungsi tersebut.

Contoh yang berjalan: http://ideone.com/8htWfx

Hunter McMillen
sumber
9

Entah fungsi Anda adalah vararg, di mana Anda dapat menggunakan slice dengan ...notasi seperti yang diperlihatkan Hunter McMillen, atau fungsi Anda memiliki sejumlah argumen tetap dan Anda dapat mengekstraknya saat menulis kode Anda.

Jika Anda benar-benar ingin melakukan ini secara dinamis pada fungsi argumen jumlah tetap, Anda dapat menggunakan refleksi:

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)
}
newacct
sumber
Saya penasaran untuk melihat bagaimana tolok ukur ini dibandingkan dengan pendekatan vararg. Saya akan berasumsi bahwa performanya akan kurang efisien, tetapi saya harus memeriksanya.
Hunter McMillen
@HunterMcMillen apakah Anda mendapatkan wawasan tentang perbandingan kinerja?
AkiRoss
@AkiRoss mungkin, tapi sudah lama sekali saya lupa hasilnya: |
Hunter McMillen
lol ok, bukan masalah besar: Saya rasa ini lebih lambat, mungkin saya akan menjalankan beberapa tes sendiri. Thanx
AkiRoss
0

https://play.golang.org/p/2nN6kjHXIsd

Saya punya alasan untuk membongkar beberapa vars dari string [string] peta dengan tanda kutip tunggal di sekitar beberapa di antaranya maupun tanpa. Inilah logika untuk itu dan tautan putar di atas memiliki cuplikan yang berfungsi penuh.

func unpack(a map[string]string) string {

var stmt, val string
var x, y []string
for k, v := range a {
    x = append(x, k)
    y = append(y, "'"+v+"'")
}

stmt = "INSERT INTO tdo.rca_trans_status (" + strings.Join(x, ", ")
val = ") VALUES (" + strings.Join(y, ",") + ");"

return stmt + val}

Yang menyajikan dengan rapi untuk kueri mssql sebagai:

INSERT INTO tdo.rca_trans_status (rca_json_body, original_org, md5sum, updated, rca_key) VALUES ('blob','EG','2343453463','2009-11-10 23:00:00','prb-180');
Bill H.
sumber
-17

Tidak, tidak ada dukungan langsung untuk ini dalam bahasa ini. Python dan Ruby, serta Javascript yang Anda sebutkan; semuanya adalah bahasa dinamis / skrip. Go jauh lebih dekat dengan, misalnya, C daripada ke bahasa dinamis manapun. Fungsionalitas 'terapkan' berguna untuk bahasa dinamis, tetapi tidak banyak digunakan untuk bahasa statis seperti C atau Go,

zzzz
sumber
@ user7610 Anda salah. Anda mengacu pada kasus yang berbeda dari yang dipermasalahkan. Dalam pertanyaan awal tidak ada parameter variadic dalam deklarasi fungsi.
pengguna2846569
Ya, saya, saya kira. Apa yang dilakukan Python / Ruby dapat dianggap sebagai gula sintaksis untuk panggilan reflektif yang didukung Go ...
user7610