2015-10-28 3 views
0

Я реализую обертку вокруг стандартного лог-пакета, чтобы сделать регистратор с различными уровнями журнала.Golang: fmt, variadic args и%! (EXTRA type = value) error

У меня есть следующий интерфейс:

type Logger interface { 
    Trace(fmt string, args ...interface{}) 
    Debug(fmt string, args ...interface{}) 
    Info(fmt string, args ...interface{}) 
    Warn(fmt string, args ...interface{}) 
    Error(fmt string, args ...interface{}) 
    Fatal(fmt string, args ...interface{}) 
    Panic(fmt string, args ...interface{}) 
} 

В реализации у меня есть что-то вроде этого (не точный код)

func Info(format string, args ...interface{}){ 
    msg := fmt.Sprintf(format, args...) 
    log.Println(msg) 
} 

Теперь, предположим, я называю свою библиотеку так:

logger.Info("Hello %s", "World") 

Я получаю распечатку: «Hello%! (EXTRA string = WORLD)», вместо ожидаемого «Hello World» ». Там аналогичный выход, если я делаю

Это возвращает «Hello World%! EXTRA [] interface {} = []".

+0

вашей строка формата аргумент называются 'fmt', но вы используете 'format' в вызове' Sprintf'. – JimB

+0

опечатка. я починил это. – dialAlpha

+1

Это не показывает, что вы описываете: http://play.golang.org/p/IKwT8oKX3k – JimB

ответ

3

Я не могу воспроизвести это поведение. Вы уверены, что это не простая ошибка, которую вы забыли показать здесь?

https://play.golang.org/p/-jtmll17Xj

package main 

import "fmt" 

func Info(format string, args ...interface{}){ 
    msg := fmt.Sprintf(format, args...) 
    fmt.Print(msg) 
} 

func main() { 
    Info("Hello %s", "World") 
} 

Печать

Hello World 

Согласно the fmt docs, %!(EXTRA string=WORLD) добавляется к строке, когда вы передаете дополнительные параметры, неожиданный формат. Может быть, вы используете строку формата "Hello World" вместо "Hello %s" или передаете аргумент дважды?

+0

Ошибка была между стулом и клавиатурой. Я перепутал следующие интерфейсы: 'func Print (v ... interface {}) 'и ' func Printf (формат string, v ... interface {})' Некоторые из моего кода вызывали библиотеку без строки формата. См. Здесь более подробный пример: [link] (http://play.golang.org/p/Xx79qujaFp) – dialAlpha

+0

@BoppreH Эта ссылка * fmt * doc была неоценима. –

2

Ошибка была между стулом и клавиатурой. Я перепутал следующие интерфейсы:

func Print(v ...interface{}) 
func Printf(format string, v ...interface{}) 

Некоторые из моего кода звонят в библиотеку без формата string.See здесь для более подробного примера: http://play.golang.org/p/Xx79qujaFp

Смежные вопросы