Dưới đây là một ví dụ về vấn đề tôi đang gặp:Go: Chức năng biến thể và quá nhiều đối số?
package main
import "fmt"
func foo(a int, b ...int) {
fmt.Println(a,b)
}
func main() {
a := 0
aa := 1
b := []int{2,3,4}
foo(a, aa, b...)
}
Khi tôi chạy này, tôi nhận được lỗi too many arguments in call to foo
. Tôi đoán tôi có thể hiểu lý do tại sao điều này xảy ra, nhưng điều không rõ ràng đối với tôi là làm thế nào tôi có thể thực hiện nó mà không cần phải tạo bản sao b
với một khe phụ ở đầu cho aa
(mà tôi không muốn làm, mã này sẽ chạy khá thường xuyên và với b
là hơi dài).
Vì vậy, câu hỏi của tôi là: Tôi chỉ làm điều này sai? Và nếu không, điều gì sẽ là cách hiệu quả nhất để làm những gì tôi đang cố gắng làm?
(Ngoài ra, tôi không thể thay đổi chữ ký của foo
).
Biến 'b' trông giống như một lát thay vì một mảng. – Eonil
Bắt tốt. Nó quá dễ dàng để phá vỡ quy tắc "Bạn không nên gọi một lát một mảng!" –
Khi mở rộng một lát, cấu trúc lát được sao chép tất nhiên, nhưng mảng cơ bản không được sao chép. Chỉ để được chính xác. – PickBoy