Go не имеет необязательных значений по умолчанию для аргументов функции.
Вы можете эмулировать их в некоторой степени, имея специальный тип, содержащий набор параметров для функции.
В вашем игрушечном примере это было бы что-то вроде
type Concat1Args struct {
a string
}
func Concat1(args Concat1Args) string {
if args.a == "" {
args.a = "default-a"
}
return fmt.Sprintf("%s", args.a)
}
"Уловка" здесь в том, что в Go каждый тип имеет свое "нулевое значение", а при создании значения составного типа, используятак называемый литерал, можно инициализировать только некоторые поля типа, поэтому в нашем примере это будет
s := Concat1(Concat1Args{})
против
s := Concat1(Concat1Args{"whatever"})
Я знаю, что это выглядит неуклюже, и я показал это в основном для демонстрационных целей.В реальном производственном коде, где функция может иметь дюжину или более параметров, их упаковка в выделенный составной тип обычно является единственным разумным способом, но для случая, подобного вашему, лучше просто явно передать ""
вфункция.