Análisis del Ejemplo en sintaxis (GO)
El siguiente código es el código del ejemplo en sintaxis de golang, el cual iré dividiéndolo en varios pedazos para analizarlo de mejor manera y ver lo que hace.
Tenga en cuenta que el código que puse no es un programa completo solo hace algunas cosas para que tenga idea de la sintaxis que tiene el lenguaje Go.
// Example by blastcoding.com package main import ( "bufio" "fmt" "os" "regexp" "runtime" "strconv" "strings" ) type Person struct { name string surname string telephone int iDocument int birthday string picture string email string } var colorYellow string = "" var colorBlue string = "" var crlf string = "" func main() { actualAsk := 1 switch os := runtime.GOOS; os { case "darwin", "linux": colorYellow = "\033[33m" colorBlue = "\033[34m" crlf = "\n" default: colorYellow = "" colorBlue = "" crlf = "\r\n" } user := Person{ name: "", surname: "", telephone: 0, iDocument: 0, birthday: "", picture: "", } for true { showMenu(colorBlue) response := callAsk(actualAsk, user) response = strings.TrimRight(response, crlf) switch response { case ":end": os.Exit(3) case ":help": showHelp(colorYellow) case ":show": showUserInfo(colorYellow, user) case ":back": actualAsk -= 1 case ":next": if actualAsk == 7 { showUserInfo(colorYellow, user) } actualAsk += 1 case ":to 1": actualAsk = 1 case ":to 2": actualAsk = 2 case ":to 3": actualAsk = 3 case ":to 4": actualAsk = 4 case ":to 5": actualAsk = 5 case ":to 6": actualAsk = 6 case ":to 7": actualAsk = 7 default: pcheck := proccessAsk(actualAsk, &user, response) if pcheck { if actualAsk < 8 { actualAsk = actualAsk + 1 fmt.Println(string(colorYellow), "continue") } else { showUserInfo(colorYellow, user) } } fmt.Println(string(colorYellow), "repeat ask"+strconv.FormatBool(pcheck)) } } } func proccessAsk(actualAsk int, user *Person, response string) bool { var check bool = true switch actualAsk { case 1: //name check, _ = regexp.MatchString("([a-zA-Z]){2,}", response) if check { user.name = response } else { fmt.Println(string(colorYellow), "Please re-enter name") } case 2: //surname check, _ = regexp.MatchString("([a-zA-Z]){1,}", response) if check { user.surname = response } else { fmt.Println(string(colorYellow), "Please re-enter surname") } case 3: //telephone check, _ = regexp.MatchString("([0-9]){8,9}", response) if check { processed_response, _ := strconv.Atoi(response) user.telephone = processed_response } else { fmt.Println(string(colorYellow), "the number that you try to enter is not valid plaese re enter it") } case 4: //iDocument check, _ = regexp.MatchString("([0-9]){8,}", response) if check { processed_response, _ := strconv.Atoi(response) user.iDocument = processed_response } else { fmt.Println(string(colorYellow), "the number that you try to enter is not valid plaese re enter it") } case 5: //birthday check, _ = regexp.MatchString("([0-2][0-9]|(3)[0-1])(\\/)(((0)[0-9])|((1)[0-2]))(\\/)\\d{4}", response) if check { user.birthday = response } else { fmt.Println(string(colorYellow), "that' s not a valid date") } case 6: //picture user.picture = strconv.Itoa(user.iDocument) + ".jpg" case 7: //email check, _ = regexp.MatchString("[\\w-\\.]+@([\\w-]+\\.)+[\\w-]{2,4}", response) if check { user.email = response } else { fmt.Println(string(colorYellow), "email entered is incorrect:") } } return check } func callAsk(actualAsk int, user Person) string { var xresponse string switch actualAsk { case 1: xresponse = askName(colorYellow) case 2: xresponse = askSurname(colorYellow) case 3: xresponse = askTelephone(colorYellow) case 4: xresponse = askIDocument(colorYellow) case 5: xresponse = askBirthday(colorYellow) case 6: xresponse = askPicture(colorYellow) case 7: xresponse = askEmail(colorYellow) case 8: showUserInfo(colorYellow, user) reader := bufio.NewReader(os.Stdin) xresponse, _ = reader.ReadString('\n') } return xresponse } func showMenu(colorBlue string) { fmt.Println(string(colorBlue), "you can use the following commands [back][next][end][help]") } func showHelp(colorYellow string) { message := "[back] send you back to the last instance \n-\n" message += "[to] go to question, posible values 1,2,3,4,5,6\n" message += "where these are the questions:\n" message += "1: name, 2:surname, 3:telephone, 4:CI or DNI, 5:birthday, 6:picture, 7:email\n-\n" message += "Example [to 1]\n-\n" message += "[next] go next ask\n-\n" message += "[end] close the program\n-\n" message += "you are in help command =D\n-\n" fmt.Println(string(colorYellow), message) } func showUserInfo(colorYellow string, user Person) { message := "=================================\n\n" message += "The user information is:\n" message += "Name:" + user.name + "\n" message += "Surname:" + user.surname + "\n" message += "Telephone:" + strconv.Itoa(user.telephone) + "\n" message += "CI:" + strconv.Itoa(user.iDocument) + "\n" message += "Birthday:" + user.birthday + "\n" /*message += "Picture:" + user.iDocument + "\n"*/ message += "=================================\n\n" message += "Opening Picture" fmt.Println(string(colorYellow), message) } func askName(colorYellow string) string { reader := bufio.NewReader(os.Stdin) fmt.Println(string(colorYellow), "dime tu nombre") name, _ := reader.ReadString('\n') return name } func askSurname(colorYellow string) string { reader := bufio.NewReader(os.Stdin) fmt.Println(string(colorYellow), "[EN]Surname:,[ES]Apellido:") surname, _ := reader.ReadString('\n') return surname } func askTelephone(colorYellow string) string { reader := bufio.NewReader(os.Stdin) fmt.Println(string(colorYellow), "[EN]:Telephone, [ES]Telefono:") telephone, _ := reader.ReadString('\n') return telephone } func askIDocument(colorYellow string) string { reader := bufio.NewReader(os.Stdin) fmt.Println(string(colorYellow), "[EN]:DNI,[ES]CI,DNI:") iDocument, _ := reader.ReadString('\n') return iDocument } func askBirthday(colorYellow string) string { reader := bufio.NewReader(os.Stdin) fmt.Println(string(colorYellow), "[EN]:Birthday,[ES]Fecha de Nacimiento:") birthday, _ := reader.ReadString('\n') return birthday } func askPicture(colorYellow string) string { reader := bufio.NewReader(os.Stdin) fmt.Println(string(colorYellow), "[EN]:Picture,[ES]Foto:") picture, _ := reader.ReadString('\n') return picture } func askEmail(colorYellow string) string { reader := bufio.NewReader(os.Stdin) fmt.Println(string(colorYellow), "Email") email, _ := reader.ReadString('\n') return email }
Sobre el ejemplo
Este pequeño ejemplo lo que hace es recabar los datos del usuario y ponerlo en una estructura de tipo persona creada por nosotros al inicio del código. No hay código de almacenamiento en una base de datos o un archivo en este ejemplo talvez continuemos este ejemplo en los siguientes post y sea agregado.
Yo en el post anterior creo que ya había explicado que lo primero que se ejecuta en go es la función main en el packete main en main.go. Así pues eso lo obviaremos.
Import
Luego de lo del packete tenemos el import
import ( "bufio" "fmt" "os" "regexp" "runtime" "strconv" "strings" )
Lo que está haciendo aquí nuestro código es obteniendo los paquetes que vamos a utilizar. Donde bufio es para entradas y salidas, fmt es de formato, os es del sistema operativo, regex es para expresiones regulares, runtime en este caso lo estamos utilizando para saber donde nos estamos ejecutando, strconv para convertir string y strings para realizar cambios sobre strings como pueden ser Trim, split y otros.
The program loop
En este ejemplo verá un loop en el program que se ejecuta hasta que salimos del, los juegos también usan esta clase de loop en ese caso le llaman el game loop.
en la funcion main vemos como empieza este loop en
for true{ //code }
Color segun Sistema Operativo
En este ejemplo se dara color segun el sistema oerativo que tengamos, si se usa ios o linux tendra color en la consola y en caso de windows no tendra color(cuestiones de consolas).
Para saber el sistema operativo en el que estamos corriendo tenemos el siguiente fragmento de código:
main.go color en terminal segun OSswitch os := runtime.GOOS; os { case "darwin", "linux": colorYellow = "\033[33m" colorBlue = "\033[34m" crlf = "\n" default: colorYellow = "" colorBlue = "" crlf = "\r\n" }
Espera ¿eso que hace?, Bueno primero declara la variable con := y luego la usa runtime.GOOS nos devuelve el sistema operativo y si en go podemos declarar la variable en el switch.
Obtener texto ingresado en consola
Ahora veremos como obtener los textos ingresados en la consola, esto pasa en todas las funciones ask de este ejemplo: askName, askSurname, askIDocument, askTelephone, etc. Solo veremos 1 para que usted la entienda, ya que las demás no difieren en nada solo que obtenemos un valor diferente.
func askName(colorYellow string) string { reader := bufio.NewReader(os.Stdin) fmt.Println(string(colorYellow), "dime tu nombre") name, _ := reader.ReadString('\n') return name }
En la primera línea le decimos que lea lo que se está ingresando de hecho el nombre stdin se debe a standard input.
Bufio es Buffered I(input)/O(output). Todo lo que se está ingresando esta siendo almacenado mientras está siendo procesado.
La siguiente línea es un print line para pedir el nombre, esto está medio desorganizado, ya que debería estar primera pero igual funcionara.
ReadString
Con ReadString digamos que estamos leyendo lo que está siendo almacenado en buffer hasta que aparezca el delimitador en este caso un salto de línea(cuando presionamos enter), cuando se encuentra con el salto de línea lo que está en buffer(reader) es asignado a name como un string.
Finalmente devuelvo lo que esta en asignado a name.
Multiples valores de retorno en funciones
El lenguaje go también permite tener más de un valor de retorno como ejemplo utilizaremos el siguiente codigo:
check, _ = regexp.MatchString("([a-zA-Z]){2,}", response)
Como podemos ver regex.MatchString devuelve 2 valores uno lo asignaré a check y el otro no me interesa por esta razón estamos utilizando «_».
Cuando no necesitamos uno de los valores devueltos en una función podemos utilizar _ llamado blank identifier para no tener que lidiar con ese valor.
En el caso de regex.MatchString devuelve 2 valores bool y un error.