shad-go/varfmt
Vladimir Kuznetsov f692370e51 Update README.md
- fix typo
2020-02-23 14:33:54 +03:00
..
fmt.go Add varfmt 2020-02-21 23:43:16 +03:00
fmt_test.go Use fmt in BenchmarkSprintf. 2020-02-22 04:28:47 +03:00
README.md Update README.md 2020-02-23 14:33:54 +03:00

varfmt

Реализуйте функцию varfmt.Sprintf. Функция принимает формат строку и переменное число аргументов.

Синтаксис формат-строки похож на формат-строки питона:

  • {} - задаёт ссылку на аргумент
  • {number} - ссылается на аргумент с индексом number
  • {} ссылается на аргумент с индексом равным позиции {} внутри паттерна

Например, varfmt.Sprintf("{1} {0}", "Hello", "World) должен вернуть строку World Hello.

Аргументы функции могут быть произвольными типами. Вам нужно форматировать их так же, как это делает функция fmt.Sprint. Вызывать fmt.Sprint для форматирования отдельного аргумента не запрещается.

Ваше решение будет сравниваться с baseline-решением на бенчмарке. Сравнение будет проходить независимо по трем метрикам.

  • time/op - время на одну итерацию бенчмарка
  • alloc/op - число выделенных байт на одну итерацию бенчмарка
  • allocs/op - число выделенных объектов на одну итерацию бенчмарка

Ваш код должен быть не более чем в два раза хуже чем baseline.

goos: linux
goarch: amd64
pkg: gitlab.com/slon/shad-go/varfmt
BenchmarkFormat/small_int-4         	 4744729	       263 ns/op	      64 B/op	       4 allocs/op
BenchmarkFormat/small_string-4      	 2388128	       484 ns/op	     168 B/op	       8 allocs/op
BenchmarkFormat/big-4               	    8997	    127827 ns/op	  194656 B/op	      41 allocs/op
BenchmarkSprintf/small-4            	13330094	        85.7 ns/op	       2 B/op	       1 allocs/op
BenchmarkSprintf/small_string-4     	 9351295	       123 ns/op	      16 B/op	       1 allocs/op
BenchmarkSprintf/big-4              	   12006	    108144 ns/op	   16392 B/op	       1 allocs/op
PASS

Примеры

Как запустить все тесты и бенчмарки:

go test -v -bench=. ./varfmt/...

Как запустить только бенчмарки:

go test -v -run=^a -bench=. ./varfmt/...

Здесь ^a - регулярное выражение, задающее тесты для запуска, а . - задаёт бенчмарки.

Как запустить только big бенчмарки:

go test -v -run=^a -bench=/big ./varfmt/...