У меня есть регистратор, который работает нормально, но производит довольно много накладных расходов в отношении выделения памяти.Ниже Debug()
функция не печатает специально, потому что logOutputLevel
недостаточно высока.
var logOutputLevel = 2
func Debug(s string, args ...interface{}) {
if logOutputLevel > 1 { return }
fmt.Printf(s, args...)
}
Тем не менее, этот метод производит довольно много ресурсов при передаче ему значений.При передаче указателей на него не выделяются большие ресурсы.См. Следующие тесты:
func BenchmarkLog(b *testing.B) {
x := "abc"
for n := 0; n < b.N; n++ {
Debug("test %s", x)
}
}
func BenchmarkLogRef(b *testing.B) {
x := "abc"
for n := 0; n < b.N; n++ {
Debug("test %s", &x)
}
}
Производит:
BenchmarkLog-8 50000000 43.1 ns/op 16 B/op 1 allocs/op
BenchmarkLogRef-8 500000000 3.17 ns/op 0 B/op 0 allocs/op
Теперь это все хорошо, и я пытаюсь переработать метод Debug()
, чтобы он принимал только одну строку и неограниченные аргументы указателя только,Позже я хотел бы «разыменовать» все аргументы и передать их на fmt.Printf()
, если уровень логирования достаточно высок.
Как мне этого добиться?Есть ли конкретная языковая идиома для «только указателей»?Я предполагаю, что ...*interface{}
означает указатель на interface{}
(а не любые значения должны быть указателем).