O Go pode ter parâmetros opcionais? Ou posso apenas definir duas funções com o mesmo nome e um número diferente de argumentos?
go
overloading
devyn
fonte
fonte
Respostas:
O Go não possui parâmetros opcionais nem suporta sobrecarga de método :
fonte
make
um caso especial, então? Ou não é mesmo realmente implementado como uma função ...make
é uma construção de linguagem e as regras mencionadas acima não se aplicam. Veja esta pergunta relacionada .range
é o mesmo casomake
, nesse sentidoUma boa maneira de obter algo como parâmetros opcionais é usar argumentos variados. A função realmente recebe uma fatia do tipo que você especificar.
fonte
params
é uma fatia de intsVocê pode usar uma estrutura que inclui os parâmetros:
fonte
Para um número arbitrário e potencialmente grande de parâmetros opcionais, um bom idioma é usar as opções funcionais .
Para seu tipo
Foobar
, primeiro escreva apenas um construtor:onde cada opção é uma função que modifica o Foobar. Em seguida, forneça maneiras convenientes para o usuário usar ou criar opções padrão, por exemplo:
Parque infantil
Por uma questão de concisão, você pode dar um nome ao tipo de opções ( Playground ):
Se você precisar de parâmetros obrigatórios, inclua-os como primeiros argumentos do construtor antes da variável
options
.Os principais benefícios do idioma das opções funcionais são:
Essa técnica foi cunhada por Rob Pike e também demonstrada por Dave Cheney .
fonte
func()
s, se necessário, do que dobrar meu cérebro em torno dessa abordagem. Sempre que tenho que usar essa abordagem, como na biblioteca Echo, encontro meu cérebro preso na toca do coelho das abstrações. #wiw #Nem parâmetros opcionais nem sobrecarga de função são suportados no Go. Go suporta um número variável de parâmetros: Passando argumentos para ... parâmetros
fonte
Não - nem. De acordo com os documentos dos programadores do Go for C ++ ,
Não consigo encontrar uma declaração igualmente clara de que parâmetros opcionais não são suportados, mas eles também não são suportados.
fonte
Você pode encapsular isso muito bem em uma função semelhante ao que está abaixo.
Neste exemplo, o prompt por padrão possui dois pontos e um espaço à sua frente. . .
. . . no entanto, você pode substituir isso fornecendo um parâmetro para a função prompt.
Isso resultará em um prompt como abaixo.
fonte
Acabei usando uma combinação de uma estrutura de parâmetros e argumentos variáveis. Dessa forma, não precisei alterar a interface existente consumida por vários serviços e meu serviço conseguiu passar parâmetros adicionais conforme necessário. Código de exemplo no playground de golang: https://play.golang.org/p/G668FA97Nu
fonte
O idioma Go não suporta sobrecarga de método, mas você pode usar argumentos variados, assim como parâmetros opcionais, também pode usar a interface {} como parâmetro, mas não é uma boa escolha.
fonte
Estou um pouco atrasado, mas se você gosta de uma interface fluente, pode projetar seus setters para chamadas encadeadas como esta:
E então chame assim:
Isso é semelhante ao idioma das opções funcionais apresentado na resposta do @Ripounet e possui os mesmos benefícios, mas tem algumas desvantagens:
err
variável e zerando-a.Há, no entanto, uma pequena vantagem possível: esse tipo de chamada de função deve ser mais fácil para o compilador alinhar, mas eu realmente não sou especialista.
fonte
Você pode passar parâmetros nomeados arbitrários com um mapa.
fonte
Outra possibilidade seria usar um struct que com um campo para indicar se é válido. Os tipos nulos do sql, como NullString, são convenientes. É bom não ter que definir seu próprio tipo, mas caso você precise de um tipo de dados personalizado, sempre poderá seguir o mesmo padrão. Acho que a opcionalidade é clara na definição da função e há um mínimo de código ou esforço extra.
Como um exemplo:
fonte