¿Puedo escribir una declaración simple if-else con asignación de variable en go (golang) como lo haría en php? Por ejemplo:
$var = ( $a > $b )? $a: $b;
Actualmente tengo que usar lo siguiente:
var c int
if a > b {
c = a
} else {
c = b
}
Lo siento, no recuerdo el nombre de esta declaración de control y no pude encontrar la información en el sitio o mediante la búsqueda de Google. : /
Respuestas:
Como se mencionó en los comentarios, Go no es compatible con los one liners ternarios. La forma más corta en la que puedo pensar es esta:
Pero no hagas eso, no vale la pena y solo confundirá a las personas que lean tu código.
fuente
A menudo uso lo siguiente:
básicamente lo mismo que @ Not_a_Golfer's pero usando inferencia de tipos .
fuente
listeningPath := "production.some.com"; if DEBUG { listeningPath := "development.some.com" }
misma velocidad que el ternario para la producción y, en mi humilde opinión, legibilidad bastante buena.Como los demás mencionaron,
Go
no es compatible con frases ternarias. Sin embargo, escribí una función de utilidad que podría ayudarlo a lograr lo que desea.Aquí hay algunos casos de prueba para mostrar cómo puede usarlo
Por diversión, escribí funciones de utilidad más útiles como:
Si desea utilizar alguno de estos, puede encontrarlos aquí https://github.com/shomali11/util
fuente
Gracias por señalar la respuesta correcta.
Acabo de consultar las preguntas frecuentes de Golang (duh) y dice claramente que esto no está disponible en el idioma:
información adicional encontrada que podría ser de interés sobre el tema:
fuente
var c int; if a > b { c = a } else { c = b }
:? Pero sugiero mantenerlo en 5 líneas para formar un bloque de luz para la recreación del lector;)Una posible manera de hacer esto en una sola línea, utilizando un mapa, sencilla estoy comprobando si
a > b
si estrue
voy a asignarc
aa
otra cosab
Sin embargo, esto se ve increíble, pero en algunos casos puede que NO sea la solución perfecta debido al orden de evaluación. Por ejemplo, si estoy comprobando si un objeto no
nil
obtiene alguna propiedad de él, mire el siguiente fragmento de código que,panic
en caso demyObj equals nil
Debido a que el mapa se creará y construirá primero antes de evaluar la condición, en caso de
myObj = nil
esto, simplemente entrará en pánico.Sin olvidar mencionar que aún puede hacer las condiciones en una sola línea, verifique lo siguiente:
fuente
Use la función lambda en lugar del operador ternario
Ejemplo 1
para dar el máximo int
Ejemplo 2
Suponga que tiene esta
must(err error)
función para manejar errores y desea usarla cuando no se cumple una condición. (disfrútelo en https://play.golang.com/p/COXyo0qIslP )fuente
A veces, trato de usar una función anónima para lograr que la definición y la asignación ocurran en la misma línea. como abajo:
https://play.golang.org/p/rMjqytMYeQ0
fuente
Una construcción muy similar está disponible en el idioma
*
es decir
fuente
Puedes usar un cierre para esto:
La única queja que tengo con la sintaxis de cierre en Go es que no hay un alias para la función de retorno cero del parámetro cero predeterminado, entonces sería mucho mejor (piense en cómo declara los literales de mapa, matriz y corte con solo un nombre de tipo).
O incluso la versión más corta, como acaba de sugerir un comentarista:
Aún necesitaría usar un cierre si necesita dar parámetros a las funciones. Esto podría obviarse en el caso de pasar métodos en lugar de solo funciones, creo, donde los parámetros son la estructura asociada con los métodos.
fuente
doif(condition, dothis, dothat)