120 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			120 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| ---
 | |
| title: Go Structs
 | |
| localeTitle: Ir Estructuras
 | |
| ---
 | |
| ## Ir Estructuras
 | |
| 
 | |
| En Go, las estructuras se utilizan para almacenar datos y funciones relacionadas. Un ejemplo podría ser una estructura para representar a un usuario:
 | |
| 
 | |
| ```go
 | |
| type User struct { 
 | |
|     FirstName string 
 | |
|     LastName  string 
 | |
|     Email     string 
 | |
|     Age       int 
 | |
|  } 
 | |
| ```
 | |
| 
 | |
| Aquí podemos almacenar el nombre, el apellido, la dirección de correo electrónico y la edad de un usuario. El nombre de la propiedad va seguido del tipo de datos que queremos almacenar. Por ejemplo, la propiedad `FirstName` es una `string` mientras que la propiedad `Age` es un `int` .
 | |
| 
 | |
| ### Creando objetos
 | |
| 
 | |
| Para inicializar un nuevo objeto, podemos usar la sintaxis abreviada de Go para crear y asignar variables. Podemos pasar los datos en este punto o establecer los datos en un momento posterior:
 | |
| 
 | |
| ```go
 | |
| func main() { 
 | |
|     // Create a user and set both the first and last name properties 
 | |
|     user1 := User{ 
 | |
|         FirstName: "John", 
 | |
|         LastName: "Wick", 
 | |
|     } 
 | |
|  
 | |
|     // Now we have our user object, we can set the data like this 
 | |
|     user1.Email = "john@wick.com" 
 | |
|     user1.Age = 30 
 | |
|  } 
 | |
| ```
 | |
| 
 | |
| ### Metodos de objeto
 | |
| 
 | |
| Go permite asignar métodos a estructuras. Esto permite agrupar las operaciones relevantes a los datos que afecta. En este ejemplo, escribiremos un método en la estructura de `User` para generar el nombre completo del usuario:
 | |
| 
 | |
| ```go
 | |
| func (u User) FullName() string { 
 | |
|     return strings.Join([]string{u.FirstName, u.LastName}, " ") 
 | |
|  } 
 | |
| ```
 | |
| 
 | |
| Este método unirá el nombre y apellido del usuario con un espacio en el medio. Llamar al método podría verse así:
 | |
| 
 | |
| ```go
 | |
|     println(user1.FullName()) 
 | |
| ```
 | |
| 
 | |
| ### Etiquetas de Struct
 | |
| 
 | |
| Las etiquetas Struct se utilizan para modificar cómo los codificadores manejan los datos. Por ejemplo, establecer los nombres de las claves al codificar a JSON:
 | |
| 
 | |
| ```go
 | |
| type User struct { 
 | |
|     FirstName string `json:"first_name"` 
 | |
|     LastName  string `json:"last_name"` 
 | |
|     Email     string `json:"email"` 
 | |
|     Age       int    `json:"age"` 
 | |
|  } 
 | |
| ```
 | |
| 
 | |
| ### Datos exportados
 | |
| 
 | |
| Las estructuras pueden contener propiedades exportadas (públicas) y no exportadas (privadas). Esto se establece por tener una primera letra mayúscula para exportar o una primera letra minúscula para no exportar. En este ejemplo, haremos que la propiedad del correo electrónico sea privada:
 | |
| 
 | |
| ```go
 | |
| type User struct { 
 | |
|     // Exported Data 
 | |
|     FirstName string 
 | |
|     LastName  string 
 | |
|     Age       int 
 | |
|  
 | |
|     // Unexported Data 
 | |
|     email     string 
 | |
|  } 
 | |
| ```
 | |
| 
 | |
| Al hacer esto, el siguiente código arrojará un error en el momento de la compilación, ya que está intentando interactuar con una propiedad no exportada:
 | |
| 
 | |
| ```go
 | |
|     user1.email = "john@wick.com" 
 | |
| ```
 | |
| 
 | |
| Esto también se aplica a los métodos:
 | |
| 
 | |
| ```go
 | |
| // Exported method. This can be called from anywhere 
 | |
|  func (u User) Email() { 
 | |
|     return u.email 
 | |
|  } 
 | |
|  
 | |
|  // Unexported method. This can only be called by other methods on this struct 
 | |
|  func (u User) updateLoginCount { 
 | |
|     // code to update login count... 
 | |
|  } 
 | |
| ```
 | |
| 
 | |
| ### Modificar propiedades a través de métodos.
 | |
| 
 | |
| Para modificar los datos de un objeto desde uno de sus métodos, el objeto debe ser un puntero. Un ejemplo podría verse así:
 | |
| 
 | |
| \`\` \`ir // SetEmail establece la dirección de correo electrónico del usuario func (u \* User) SetEmail (cadena de correo electrónico) { u.email = email }
 | |
| 
 | |
| // correo electrónico de acceso func (u \* Usuario) Correo electrónico () cadena { volver u.email }
 | |
| 
 | |
| func main () { // Creando el puntero user1 user1 = & User { Nombre: "Juan", Apellido: "Mecha", }
 | |
| ```
 | |
| // Set the user's email address 
 | |
|  user1.SetEmail("john@wick.com") 
 | |
|  
 | |
|  // Access and print the user's email address 
 | |
|  println(user1.Email()) 
 | |
| ```
 | |
| 
 | |
| } |