Diziyi Bağımsız Değişken Olarak Açmaya Git


108

Dolayısıyla Python ve Ruby'de bir diziyi bağımsız değişken olarak açmak için uyarlama operatörü (*) vardır. Javascript'te .apply () işlevi vardır. Go'da bir dizi / dilimi işlev bağımsız değişkenleri olarak paketlemenin bir yolu var mı? Bunun için herhangi bir kaynak da harika olurdu!

Şuna benzer bir şey:

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

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

Sözdizimsel / çeşitli hatalar yapıyorsam özür dilerim. Go'da yeniyim.


4
Her şeyden önce, arrbir dizi değil. Bu bir dilim .
newacct

Yanıtlar:


165

C'ye benzer bir vararg sözdizimi kullanabilirsiniz:

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)
}

Şimdi istediğiniz kadar çok şeyi toplayabilirsiniz. Fonksiyonu ...çağırdıktan sonra önemli olana dikkat edin my_func.

Çalışan örnek: http://ideone.com/8htWfx


10

İşleviniz, ...Hunter McMillen'in gösterdiği gibi gösterimle bir dilim kullanabileceğiniz vararg'lardır veya işlevinizin sabit sayıda bağımsız değişkeni vardır ve kodunuzu yazarken bunları açabilirsiniz.

Bunu gerçekten sabit sayıda bağımsız değişkenler üzerinde dinamik olarak yapmak istiyorsanız, yansımayı kullanabilirsiniz:

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)
}

Vararjlara karşı bu kıyaslamaların nasıl yaklaştığını merak ediyorum. Daha az verimli çalışacağını varsayardım, ancak buna bakmam gerekecek.
Hunter McMillen

@HunterMcMillen performans karşılaştırması hakkında herhangi bir fikir edindiniz mi?
AkiRoss

@AkiRoss muhtemelen, ama o kadar uzun zaman önceydi ki sonuçları unuttum: |
Hunter McMillen

lol tamam, önemli bir şey değil: Sanırım yine de daha yavaş, belki bazı testleri kendim yapacağım. Thanx
AkiRoss

0

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

Bir harita [string] dizesindeki bazı değişkenleri, bazı değişkenlerin etrafında tek tırnaklar olan ve bunların dışında tek tırnakla açmak için bir nedenim vardı. İşte bunun mantığı ve üstteki oynatma bağlantısı tam çalışma parçacığına sahip.

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}

Bir mssql sorgusu için net bir şekilde sunulan:

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');

-17

Hayır, dilde bunun için doğrudan bir destek yok. Python ve Ruby, ayrıca bahsettiğiniz Javascript; hepsi dinamik / komut dosyası dilleridir. Go, örneğin C'ye herhangi bir dinamik dilden çok daha yakındır. "Uygulama" işlevi dinamik diller için kullanışlıdır, ancak C veya Go gibi statik diller için çok az kullanım


@ user7610 yanılıyorsunuz. Söz konusu olandan farklı bir vakaya atıfta bulunuyorsunuz. Orijinal soruda, fonksiyon bildiriminde değişken parametre yoktur.
user2846569

Evet öyleydim sanırım. Python / Ruby'nin yaptığı şey, Go'nun desteklediği yansıtıcı çağrı için sözdizimsel şeker olarak düşünülebilir ...
user7610
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.