Đi mở gói mảng dưới dạng đối số


103

Vì vậy, trong Python và Ruby có toán tử splat (*) để giải nén một mảng dưới dạng đối số. Trong Javascript có hàm .apply (). Có cách nào để giải nén một mảng / lát cắt làm đối số hàm trong Go không? Bất kỳ nguồn lực nào cho điều này cũng sẽ tuyệt vời!

Một cái gì đó dọc theo dòng này:

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

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

Tôi xin lỗi nếu tôi mắc lỗi cú pháp / các loại. Tôi mới chơi cờ vây.


4
Trước hết, arrkhông phải là một mảng. Nó là một lát cắt .
newacct,

Câu trả lời:


159

Bạn có thể sử dụng cú pháp vararg tương tự như 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)
}

Bây giờ bạn có thể tổng hợp bao nhiêu thứ tùy thích. Lưu ý điều quan trọng ...sau khi bạn gọi my_funchàm.

Ví dụ đang chạy: http://ideone.com/8htWfx


8

Hàm của bạn là varargs, trong đó bạn có thể sử dụng một lát cắt với ...ký hiệu như Hunter McMillen cho thấy hoặc hàm của bạn có một số đối số cố định và bạn có thể giải nén chúng khi viết mã của mình.

Nếu bạn thực sự muốn thực hiện điều này động trên một hàm có số lượng đối số cố định, bạn có thể sử dụng phản xạ:

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

Tôi tò mò muốn biết điểm chuẩn này so với phương pháp tiếp cận kỳ đà như thế nào. Tôi cho rằng nó sẽ hoạt động kém hiệu quả hơn, nhưng tôi sẽ phải xem xét nó.
Hunter McMillen

@HunterMcMillen Bạn có nhận được thông tin chi tiết nào về so sánh hiệu suất không?
AkiRoss

@AkiRoss chắc, nhưng lâu quá rồi nên quên kết quả rồi: |
Hunter McMillen

lol ok, không phải là vấn đề lớn: Dù sao thì tôi cho rằng nó chậm hơn, có lẽ tôi sẽ tự chạy một số bài kiểm tra. Thanx
AkiRoss 14/09/15

0

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

Tôi có lý do để giải nén một số vars từ một chuỗi [string] bản đồ với các dấu ngoặc kép xung quanh một số trong số chúng cũng như không. Đây là logic của nó và liên kết phát lên trên có đoạn mã hoạt động đầy đủ.

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}

Trình bày rõ ràng cho một truy vấn mssql như:

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

-16

Không, không có hỗ trợ trực tiếp cho điều này bằng ngôn ngữ. Python và Ruby, cũng như Javascript mà bạn đang đề cập; đều là ngôn ngữ động / kịch bản. Ví dụ, Go gần giống với C hơn bất kỳ ngôn ngữ động nào. Chức năng 'áp dụng' rất hữu ích cho các ngôn ngữ động, nhưng ít được sử dụng cho các ngôn ngữ tĩnh như C hoặc Go,


@ user7610 bạn nhầm rồi. Bạn đang đề cập đến trường hợp khác với trường hợp được đề cập. Trong câu hỏi ban đầu, không có tham số thay đổi trong khai báo hàm.
user2846569, 31/07/18

Tôi đoán là vậy. Có gì Python / Ruby không có thể được coi như cú pháp đường cho các cuộc gọi phản ánh rằng Go hỗ trợ ...
user7610
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.