ในภาษา Go
[]string
เป็นสตริงอาร์เรย์
และเรายังใช้...string
เป็นพารามิเตอร์
อะไรคือความแตกต่าง?
นิยามฟังก์ชัน:
func f(args ...string) {}
ฉันสามารถเรียกใช้ฟังก์ชันนี้ได้หรือไม่?
args := []string{"a", "b"}
f(args)
ในภาษา Go
[]string
เป็นสตริงอาร์เรย์
และเรายังใช้...string
เป็นพารามิเตอร์
อะไรคือความแตกต่าง?
นิยามฟังก์ชัน:
func f(args ...string) {}
ฉันสามารถเรียกใช้ฟังก์ชันนี้ได้หรือไม่?
args := []string{"a", "b"}
f(args)
คำตอบ:
[]string
เป็นสตริงอาร์เรย์
ในทางเทคนิคแล้วมันคือชิ้นส่วนที่อ้างอิงถึงอาร์เรย์พื้นฐาน
และเรายังใช้
...string
เป็นพารามิเตอร์อะไรคือความแตกต่าง?
ในส่วนของโครงสร้างไม่มีอะไรจริงๆ ชนิดข้อมูลที่เกิดจากไวยากรณ์ทั้งสองเหมือนกัน
...
ไวยากรณ์พารามิเตอร์ทำให้พารามิเตอร์ variadic จะยอมรับstring
อาร์กิวเมนต์เป็นศูนย์หรือมากกว่าและอ้างอิงเป็นชิ้นส่วน
สำหรับการโทรf
คุณสามารถส่งสตริงไปยังพารามิเตอร์ตัวแปรด้วยไวยากรณ์ต่อไปนี้:
func f(args ...string) {
fmt.Println(len(args))
}
args := []string{"a", "b"}
f(args...)
ไวยากรณ์นี้สามารถใช้ได้สำหรับทั้งชิ้นสร้างขึ้นโดยใช้ไวยากรณ์ที่แท้จริงหรือชิ้นที่เป็นตัวแทนของพารามิเตอร์ variadic (ตั้งแต่มีจริงๆความแตกต่างระหว่างพวกเขาไม่ได้)
[]string
ไวยากรณ์ ฉันจะเพิ่มคำพูดให้กับคำตอบของฉันเพื่อให้ชัดเจนขึ้น :-)
println
ทำงานกับจุดไข่ปลาได้หรือไม่? ที่นี่คุณจะพบการทดสอบของฉัน หากมีใครต้องการฟังก์ชั่นการพิมพ์แก้จุดบกพร่องไปดู playgound ของฉัน
ทั้งสองสร้างอาร์เรย์ของสตริง แต่ความแตกต่างอยู่ที่วิธีการเรียก
func f(args ...string) {
}
// Would be called like this:
f("foo","bar","baz");
สิ่งนี้ช่วยให้คุณยอมรับอาร์กิวเมนต์จำนวนตัวแปร (ประเภทเดียวกันทั้งหมด)
ตัวอย่างที่ดีในเรื่องนี้คือfmt.Print
และเพื่อน ๆ ซึ่งสามารถยอมรับข้อโต้แย้งน้อยหรือมากเท่าที่คุณต้องการ
def fn(*args)
โครงสร้างของหลาม
นี่คือสิ่งที่คุณต้องการ:
var args []string = []string{"A", "B", "C"}
func Sample(args ...string) {
for _, arg := range args {
fmt.Println(arg)
}
}
func main() {
Sample(args...)
}
ช่วยลดความซับซ้อนของพารามิเตอร์ฟังก์ชันของคุณ นี่คือตัวอย่าง ( https://play.golang.org/p/euMuy6IvaM ): Method SampleEllipsis ยอมรับพารามิเตอร์ประเภทเดียวกันตั้งแต่ศูนย์ถึงหลายพารามิเตอร์ แต่ในเมธอด SampleArray จะต้องประกาศอาร์กิวเมนต์
package main
import "fmt"
func SampleEllipsis(args ...string) {
fmt.Printf("Sample ellipsis : %+v\n",args)
}
func SampleArray(args []string) {
fmt.Println("Sample array ")
SampleEllipsis(args...)
}
func main() {
// Method one
SampleEllipsis([]string{"A", "B", "C"}...)
// Method two
SampleEllipsis("A", "B", "C")
// Method three
SampleEllipsis()
// Simple array
SampleArray([]string{"A", "B", "C"})
// Simple array
SampleArray([]string{})
}
ผลตอบแทน:
Sample ellipsis : [A B C]
Sample ellipsis : [A B C]
Sample ellipsis : []
Sample array
Sample ellipsis : [A B C]
Sample array
Sample ellipsis : []
[]string
เป็นสไลซ์ไม่ใช่อาร์เรย์ ความแตกต่างระหว่างอาร์เรย์และชิ้นส่วนมีความละเอียดอ่อน แต่มีความสำคัญ