Использование значения по умолчанию в golang func - PullRequest
0 голосов
/ 20 сентября 2018

Я пытаюсь реализовать значение по умолчанию в соответствии с вариантом 1 сообщения Golang и значения по умолчанию .Но когда я пытаюсь сделать go install, в терминале появляется следующая ошибка:

not enough arguments in call to test.Concat1
    have ()
    want (string)

Код:

package test

func Concat1(a string) string {
  if a == "" {
    a = "default-a"
  }
  return fmt.Sprintf("%s", a)
}

// другой пакет

package main

func main() {
  test.Concat1()
}

Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 20 сентября 2018

Параметры по умолчанию в Go работают иначе, чем в других языках.В функции может быть один многоточие, всегда в конце, в котором будет сохранен фрагмент значений одного типа, поэтому в вашем случае это будет:

func Concat1(a ...string) string {

, но это означает, что вызывающая сторона может пройтив любом количестве аргументов> = 0. Также вам нужно проверить, что аргументы в срезе не пусты, а затем назначить их самостоятельно.Это означает, что им не назначают значение по умолчанию через какой-либо специальный синтаксис в Go.Это невозможно, но вы можете сделать

if a[0] == "" {
    a[0] = "default value"
}

Если вы хотите, чтобы пользователь пропускал либо ноль, либо одну строку, просто создайте две функции в вашем API, например,

func Concat(a string) string { // ...

func ConcatDefault() string {
    Concat("default value")
}
0 голосов
/ 20 сентября 2018

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"})

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

0 голосов
/ 20 сентября 2018

Я не думаю, что то, что вы пытаетесь сделать, будет работать таким образом.Вы можете выбрать вариант # 4 со страницы, которую вы цитировали, которая использует переменные переменной.В вашем случае выглядит так, будто вы хотите просто строку, так что это будет примерно так:

func Concat1(a ...string) string {
  if len(a) == 0 {
    return "a-default"
  }
  return a[0]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...