Posso escrever uma instrução if-else simples com atribuição de variável em go (golang) como faria em php? Por exemplo:
$var = ( $a > $b )? $a: $b;
Atualmente tenho que usar o seguinte:
var c int
if a > b {
c = a
} else {
c = b
}
Desculpe, não consigo lembrar o nome desta instrução de controle e não consegui encontrar a informação no site ou através de pesquisa do google. : /
Respostas:
Como os comentários mencionados, Go não oferece suporte a um liners ternário. A forma mais curta que consigo pensar é esta:
Mas, por favor, não faça isso, não vale a pena e só vai confundir as pessoas que leem seu código.
fonte
Costumo usar o seguinte:
basicamente o mesmo que @Not_a_Golfer, mas usando inferência de tipo .
fonte
listeningPath := "production.some.com"; if DEBUG { listeningPath := "development.some.com" }
mesma velocidade que o ternário para produção e boa legibilidade.Como os outros mencionados,
Go
não oferece suporte a one-liners ternários. No entanto, escrevi uma função de utilidade que pode ajudá-lo a conseguir o que deseja.Aqui estão alguns casos de teste para mostrar como você pode usá-lo
Para me divertir, escrevi funções utilitárias mais úteis, como:
Se quiser usar algum deles, você pode encontrá-los aqui https://github.com/shomali11/util
fonte
Obrigado por apontar para a resposta correta.
Acabei de verificar o FAQ Golang (duh) e afirma claramente, isso não está disponível no idioma:
informações adicionais encontradas que podem ser de interesse sobre o assunto:
fonte
var c int; if a > b { c = a } else { c = b }
:? Mas eu sugiro mantê-lo em 5 linhas para formar um bloco de luz para a recreação do leitor;)Uma forma possível de fazer isso em apenas uma linha, usando um mapa, simples Estou verificando se
a > b
se étrue
que eu estou atribuindoc
aoa
contráriob
No entanto, isso parece incrível, mas em alguns casos pode NÃO ser a solução perfeita por causa da ordem de avaliação. Por exemplo, se estou verificando se um objeto não
nil
obteve alguma propriedade dele, observe o seguinte trecho de código que,panic
no caso demyObj equals nil
Porque o mapa será criado e construído primeiro, antes de avaliar a condição, então, nesse caso
myObj = nil
, simplesmente entrarei em pânico.Sem esquecer de mencionar que você ainda pode fazer as condições em apenas uma linha simples, verifique o seguinte:
fonte
Use a função lambda em vez do operador ternário
Exemplo 1
para dar o máximo int
Exemplo 2
Suponha que você tenha essa
must(err error)
função para tratar erros e queira usá-la quando uma condição não for atendida. (desfrute em https://play.golang.com/p/COXyo0qIslP )fonte
Às vezes, tento usar a função anônima para conseguir definir e atribuir acontecem na mesma linha. como abaixo:
https://play.golang.org/p/rMjqytMYeQ0
fonte
Uma construção muito semelhante está disponível no idioma
*
ie
fonte
Você pode usar um fecho para isso:
A única queixa que tenho com a sintaxe de fechamento em Go é que não há alias para a função de retorno zero do parâmetro zero padrão, então seria muito mais agradável (pense em como você declara literais de mapa, matriz e fatia com apenas um nome de tipo).
Ou mesmo a versão mais curta, como um comentador acabou de sugerir:
Você ainda precisaria usar um encerramento se precisasse fornecer parâmetros para as funções. Isso poderia ser evitado no caso de passar métodos em vez de apenas funções, eu acho, onde os parâmetros são a estrutura associada aos métodos.
fonte
doif(condition, dothis, dothat)