ไปแกะกล่อง Array เป็นอาร์กิวเมนต์


108

ดังนั้นใน 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)
}

ฉันขออภัยหากฉันทำผิดพลาดเกี่ยวกับไวยากรณ์ / สารพัน ฉันเพิ่งเริ่มใช้ Go


4
ก่อนอื่นarrไม่ใช่อาร์เรย์ มันเป็นชิ้น
newacct

คำตอบ:


165

คุณสามารถใช้ไวยากรณ์ 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


10

ไม่ว่าฟังก์ชันของคุณจะเป็น 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)
}

ฉันอยากรู้ว่าเกณฑ์มาตรฐานนี้เทียบกับแนวทางของ varargs อย่างไร ฉันคิดว่ามันจะทำงานได้อย่างมีประสิทธิภาพน้อยลง แต่ฉันจะต้องตรวจสอบมัน
Hunter McMillen

@HunterMcMillen คุณได้รับข้อมูลเชิงลึกเกี่ยวกับการเปรียบเทียบประสิทธิภาพหรือไม่?
AkiRoss

@AkiRoss อาจจะ แต่นานมาแล้วที่ฉันลืมผลลัพธ์: |
Hunter McMillen

ฮ่า ๆ ตกลงไม่ใช่เรื่องใหญ่: ฉันคิดว่ามันช้าลงอยู่ดีบางทีฉันอาจจะทำการทดสอบเอง Thanx
AkiRoss

0

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

ฉันมีเหตุผลที่จะแกะ vars บางตัวจากสตริง map [string] ที่มีเครื่องหมายคำพูดเดี่ยวรอบ ๆ บางตัวและไม่มี นี่คือเหตุผลสำหรับมันและลิงค์การเล่นด้านบนมีตัวอย่างข้อมูลการทำงานเต็มรูปแบบ

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}

ซึ่งนำเสนออย่างหมดจดสำหรับแบบสอบถาม mssql เป็น:

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

ไม่ไม่มีการสนับสนุนโดยตรงในภาษานี้ Python และ Ruby รวมถึง Javascript ที่คุณกล่าวถึง เป็นภาษาแบบไดนามิก / สคริปต์ทั้งหมด Go เป็นวิธีที่ใกล้ตัวอย่างเช่น C มากกว่าภาษาไดนามิกใด ๆ ฟังก์ชัน "ใช้" มีประโยชน์สำหรับภาษาแบบไดนามิก แต่มีประโยชน์เพียงเล็กน้อยสำหรับภาษาคงที่เช่น C หรือ Go


@ user7610 คุณผิด คุณกำลังตอบสนองต่อกรณีอื่นที่ไม่ใช่ปัญหา ในคำถามเดิมไม่มีพารามิเตอร์ตัวแปรในการประกาศฟังก์ชัน
user2846569

ใช่ฉันคิดว่า Python / Ruby ทำอะไรได้บ้างที่สามารถคิดได้ว่าเป็นน้ำตาลเชิงไวยากรณ์สำหรับการเรียกแบบสะท้อนแสงที่ Go รองรับ ...
user7610
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.