120 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			120 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| ---
 | |
| title: Go Structs
 | |
| localeTitle: Ir estruturas
 | |
| ---
 | |
| ## Ir estruturas
 | |
| 
 | |
| No Go, as estruturas são usadas para armazenar dados e funções relacionadas. Um exemplo pode ser uma estrutura para representar um usuário:
 | |
| 
 | |
| ```go
 | |
| type User struct { 
 | |
|     FirstName string 
 | |
|     LastName  string 
 | |
|     Email     string 
 | |
|     Age       int 
 | |
|  } 
 | |
| ```
 | |
| 
 | |
| Aqui podemos armazenar o nome, o sobrenome, o endereço de e-mail e a idade de um usuário. O nome da propriedade é seguido pelo tipo de dados que queremos armazenar. Por exemplo, a propriedade `FirstName` é uma `string` enquanto a propriedade `Age` é um `int` .
 | |
| 
 | |
| ### Criando Objetos
 | |
| 
 | |
| Para inicializar um novo objeto, podemos usar a sintaxe Go shorthand para criar e atribuir variáveis. Podemos passar os dados nesse momento ou definir os dados mais tarde:
 | |
| 
 | |
| ```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 
 | |
|  } 
 | |
| ```
 | |
| 
 | |
| ### Métodos de objeto
 | |
| 
 | |
| Ir permite atribuir métodos a estruturas. Isso permite o agrupamento de operações relevantes para os dados afetados. Neste exemplo, vamos escrever um método na estrutura `User` para gerar o nome completo do usuário:
 | |
| 
 | |
| ```go
 | |
| func (u User) FullName() string { 
 | |
|     return strings.Join([]string{u.FirstName, u.LastName}, " ") 
 | |
|  } 
 | |
| ```
 | |
| 
 | |
| Este método unirá o primeiro e último nome do usuário com um espaço intermediário. Chamar o método pode ser assim:
 | |
| 
 | |
| ```go
 | |
|     println(user1.FullName()) 
 | |
| ```
 | |
| 
 | |
| ### Tags de estrutura
 | |
| 
 | |
| Tags de estrutura são usadas para modificar como os codificadores lidam com os dados. Por exemplo, definindo os nomes das chaves ao codificar para JSON:
 | |
| 
 | |
| ```go
 | |
| type User struct { 
 | |
|     FirstName string `json:"first_name"` 
 | |
|     LastName  string `json:"last_name"` 
 | |
|     Email     string `json:"email"` 
 | |
|     Age       int    `json:"age"` 
 | |
|  } 
 | |
| ```
 | |
| 
 | |
| ### Dados exportados
 | |
| 
 | |
| As estruturas podem conter propriedades exportadas (públicas) e não exportadas (privadas). Isso é definido com uma primeira letra maiúscula para exportada ou uma primeira letra minúscula para não exportada. Neste exemplo, tornaremos a propriedade de email privada:
 | |
| 
 | |
| ```go
 | |
| type User struct { 
 | |
|     // Exported Data 
 | |
|     FirstName string 
 | |
|     LastName  string 
 | |
|     Age       int 
 | |
|  
 | |
|     // Unexported Data 
 | |
|     email     string 
 | |
|  } 
 | |
| ```
 | |
| 
 | |
| Isso fará com que o código a seguir lance um erro no momento da criação, pois está tentando interagir com uma propriedade não exportada:
 | |
| 
 | |
| ```go
 | |
|     user1.email = "john@wick.com" 
 | |
| ```
 | |
| 
 | |
| Isso também se aplica aos 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... 
 | |
|  } 
 | |
| ```
 | |
| 
 | |
| ### Modificando propriedades por meio de métodos
 | |
| 
 | |
| Para modificar os dados de um objeto de dentro de um de seus métodos, o objeto deve ser um ponteiro. Um exemplo pode ser assim:
 | |
| 
 | |
| \`\` \`ir // SetEmail define o endereço de email do usuário func (u \* User) SetEmail (string de email) { u.email = email }
 | |
| 
 | |
| // Acessor de email func (u \* Usuário) Email () string { retornar u.email }
 | |
| 
 | |
| func main () { // Criando o ponteiro user1 user1 = & User { Nome: "John", Sobrenome: "Wick", }
 | |
| ```
 | |
| // Set the user's email address 
 | |
|  user1.SetEmail("john@wick.com") 
 | |
|  
 | |
|  // Access and print the user's email address 
 | |
|  println(user1.Email()) 
 | |
| ```
 | |
| 
 | |
| } |