2013-07-25 20 views
7

Trong dự án hiện tại của tôi, tôi đang cố gắng viết chức năng ghi nhật ký có điều kiện gọi fmt.Println.Cách bọc các chức năng với đối số "... interface {}" (như Printf)

chức năng Log hiện tại của tôi trông như thế này:

func Log(level int, a ...interface{}) { 
    if level <= LogLevel { 
     fmt.Println(a) 
    } 
} 

Nhưng khi tôi gọi nó là như thế này đầu ra của Log được bọc trong dấu ngoặc vì một lý do:

http://play.golang.org/p/Aa8vC54Ih0

package main 

import "fmt" 

var LogLevel int 

func main() { 
    fmt.Println("string", 10, 3.1415926) 
    LogLevel = 1 
    Log(1, "string", 10, 3.1415926) 
} 

func Log(level int, a ...interface{}) { 
    if level <= LogLevel { 
     fmt.Println(a) 
    } 
} 

string 10 3.1415926 
[string 10 3.1415926] 

Điều này với tôi trông giống như đối số a trong Nhật ký được chuyển đổi bằng cách nào đó. Làm thế nào tôi sẽ đi qua để vượt qua a để fmt.Println theo cách giống hệt như gọi fmt.Println trực tiếp?

Trả lời

10

Chỉ cần thay đổi fmt.Println(a)-fmt.Println(a...) "lập luận Passing để ... thông số"

Xem trong spec đi http://golang.org/ref/spec#Passing_arguments_to_..._parameters

+3

Cảm ơn bạn. Tôi thực sự nên ngồi xuống và đọc kỹ toàn bộ thông số. – Splitlocked

+3

Chỉ cần làm rõ, những gì bạn đang làm khi bạn làm 'fmt.Println (a)' đang tự in mảng, do đó, 'Println' định dạng nó để chỉ ra rằng đó là một mảng. Khi bạn làm 'fmt.Println (a ...)', nó được mở rộng thành 'fmt.Println (a [0], a [1], a [2])' và vân vân, mà 'Println' coi như một chuỗi các giá trị thay vì một mảng. – joshlf

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