2012-09-08 36 views
20

Tôi đang cố gắng để viết wrapper fmt.Fprintf đơn giản mà mất số biến của các đối số, đây là mã:Go - thông số chức năng variadic pass-through

func Die(format string, args ...interface{}) { 
    str := fmt.Sprintf(format, args) 
    fmt.Fprintf(os.Stderr, "%v\n", str) 
    os.Exit(1) 
} 

Nhưng khi tôi gọi đó là:

Die("foo")

tôi nhận được:

foo%!(EXTRA []interface {}=[])

Không thể hiểu tại sao tôi nhận được văn bản này sau "foo" & cách chính xác để tạo trình bao bọc xung quanh fmt.Fprintf là gì?

+3

BTW, hàm Die thực hiện lại những gì [log.Fatal] (http://golang.org/pkg/log/#Fatal) và/hoặc [log.Logger.Fatalf] (http: // golang. org/pkg/log/# Logger.Fatalf) đã sẵn sàng cho. – zzzz

Trả lời

35

Chức năng biến thể nhận các đối số dưới dạng một lát của loại. Trong trường hợp này, hàm của bạn nhận được []interface{} có tên args. Khi bạn chuyển đối số đó đến fmt.Sprintf, bạn sẽ chuyển đối số đó thành một đối số duy nhất của loại []interface{}. Những gì bạn thực sự muốn là vượt qua từng giá trị trong args như một đối số riêng biệt (giống như cách bạn nhận được chúng). Để làm điều này, bạn phải sử dụng cú pháp ....

str := fmt.Sprintf(format, args...) 

Điều này cũng được giải thích trong đặc điểm kỹ thuật Go here.

Các vấn đề liên quan