Chuyển đến nội dung chính
Mô-đun 3 · Bài học 3 trong tổng số 513/50 trong khóa học~10 min
Bài học theo mô-đun (3/5)

Hàm biến thiên

Hàm biến phân chấp nhận số lượng đối số tùy ý của cùng loại. Bạn khai báo chúng bằng cách đặt ... trước loại cuối cùng tham số. Bên trong hàm, tham số là một lát.

Tuyên ngôn

Go
func sum(nums ...int) int {
    tot := 0
    for _, n := range nums {
        tot += n
    }
    return tot
}

sum()              // 0   (nums = []int{})
sum(1)             // 1
sum(1, 2, 3, 4)    // 10

Chỉ tham số cuối mới có thể thay đổi:

Go
func log(prefix string, values ...any) { ... }   // ok
// func wrong(...int, suffix string) {}            // ERRORE

Trải một lát

Nếu bạn đã có một lát cắt, bạn có thể chuyển nó sang hàm biến đổi với ...:

Go
nums := []int{1, 2, 3}
sum(nums...)         // 6 — espande lo slice nei singoli argomenti

"..." đi sau lát cắt. Nếu không có sự lây lan, bạn sẽ nhận được một loại lỗi: bạn sẽ chuyển []int trong đó hàm mong đợi một chuỗi của int.

nums là một lát, không phải vùng chứa mới

Bên trong hàm nums có loại []int. Tất cả các lát tiêu chuẩn hoạt động hoạt động: len(nums), nums[0], range, v.v.

Trường hợp sử dụng cổ điển: fmt.Println

Tất cả các hàm Print* của fmt đều có tính biến đổi:

Go
// signature (semplificata):
// func Println(a ...any) (n int, err error)

fmt.Println("ciao", 42, true)
args := []any{"a", "b", "c"}
fmt.Println(args...)

Hãy thử nó

tập thể dục#go.m3.l3.e1
Nỗ lực: 0Đang tải…

Xác định sum(nums ...int) int trả về tổng của tất cả các đối số.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Bên trong hàm `nums` có kiểu `[]int`.

Giải pháp khả dụng sau 3 lần thử

tập thể dục#go.m3.l3.e2
Nỗ lực: 0Đang tải…

Gọi hàm tính tổng hiện có bằng cách chuyển các số trong lát cắt với mức chênh lệch `nums...`.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

`...` đi SAU tên lát cắt.

Giải pháp khả dụng sau 3 lần thử

Quiz#go.m3.l3.e3
Sẵn sàng

Bên trong `func f(args ...string)`, `args` là loại gì?

Go
func f(args ...string) {
    _ = args
}
Tùy chọn trả lời

Tóm tắt lại

  • ...T là tham số LAST = hàm biến thiên; bên trong là []T.
  • Được gọi với các giá trị đơn: trình biên dịch tập hợp chúng thành một slice.
  • Được gọi với một lát cắt hiện có: slice... (trải rộng, sử dụng lại lát cắt đó).
  • Tất cả các hàm fmt.Print* đều có tính biến đổi.
  • Chỉ tham số cuối cùng có thể là biến đổi.