English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
O (operação de arquivo)
Como criar uma interface?
Em Go, você pode usar a seguinte sintaxe para criar uma interface: //type interface_name interface{ }
Assinatura do método
//Criar uma interface Por exemplo: // Método () int1type myinterface interface{ () int2fun64 }
Aqui, o nome da interface está entre as palavras-chave type e interface, e a assinatura do método está entre chaves. () float
Em Go, para implementar uma interface, é necessário implementar todos os métodos declarados na interface. A interface Go é implementada implicitamente. Assim como outras linguagens, ela não contém nenhuma palavra-chave específica para implementar a interface. Veja o exemplo a seguir:
// O programa Go explica como //Implementar a interface package main import "fmt" //Criar uma interface type tank interface { // Método Tarea() float64 Volume() float64 } type myvalue struct { radius float64 height float64 } //Método de implementação //Cadeia (Tank) interface func (m myvalue) Tarea() float64 { return 2*m.radius*m.height + 2*3.14*m.radius*m.radius } func (m myvalue) Volume() float64 { return 3.14 * m.radius * m.radius * m.height } func main() { // Acesso usando a interface do barril var t tank t = myvalue{10, 14} fmt.Println("A área do barril:", t.Tarea()) fmt.Println("A capacidade do barril:", t.Volume()) }
Saída:
A área do barril: 908 A capacidade do barril: 4396
O valor nulo da interface é nil.
Quando a interface contém zero métodos, esse tipo de interface é chamado de interface vazia. Portanto, todos os tipos implementam a interface vazia.
Sintaxe:
interface{}
Tipo de interface:A interface tem dois tipos, um estático e um dinâmico. O tipo estático é a interface em si, por exemplo, tank no exemplo abaixo. Mas a interface não tem valor estático, então ela sempre aponta para o valor dinâmico.
A variável do tipo de interface, que contém o valor do tipo que implementa a interface, portanto, o valor deste tipo é chamado de valor dinâmico e o tipo é o tipo dinâmico. Também chamado de valor específico e tipo específico.
//Explicar os conceitos do programa Go //Valor dinâmico e tipo package main import "fmt" //Criação de interface type tank interface { // Método Tarea() float64 Volume() float64 } func main() { var t tank fmt.Println("O valor da interface de tank é: ", t) fmt.Printf("O tipo de tank é: %T ", t) }
Saída:
O valor da interface de tank é: <nil> O tipo de tank é: <nil>
No exemplo acima, há uma interface chamada tank. No exemplo presente,fmt.Println("O valor da interface de tank é: ", t) A sentença retorna o valor dinâmico da interface, enquanto a sentença fmt.Printf("O tipo de tank é: %T ", t) retorna o tipo dinâmico da interface, que é nil, porque aqui a interface não sabe quem está implementando.
Assertivo de tipo:No Go, a assertivo de tipo é uma operação aplicada a valores de interface. Em outras palavras, a assertivo de tipo é o processo de extração de valores de interface.
Sintaxe:
a.(T)
Aqui, a é o valor ou expressão da interface, T é o tipo de assertivo também conhecido como tipo. A assertivo de tipo é usado para verificar se o tipo dinâmico do operando coincide com o tipo assertivo. Se T for um tipo específico, a assertivo de tipo verifica se o tipo dinâmico fornecido de a coincide com T, aqui, se a verificação for bem-sucedida, a assertivo de tipo retorna o valor dinâmico de a. Caso contrário, se a verificação falhar, a operação gerará uma exceção panic. Se T for um tipo de interface, a assertivo de tipo verifica se o tipo dinâmico fornecido satisfaz T, aqui, se a verificação for bem-sucedida, não é extraído o valor dinâmico.
//Aserção de tipo package main import "fmt" func myfun(a interface{}) { //Extrair o valor de a val := a.(string) fmt.Println("valor: ", val) } func main() { var val interface { } = "w3codebox" myfun(val) }
Saída:
valor: w3codebox
No exemplo acima, se o valor forval := a。(string)a instrução é alterada paraval := a。(int)então o programa lançará exceção panic. Portanto, para evitar esse problema, usamos a seguinte sintaxe:
value, ok := a.(T)
Aqui, se o tipo de a for igual a T, o valor contém o valor dinâmico de a e ok é configurado como true. E se o tipo de a não for igual a T, ok é configurado como false e o valor contém o valor zero e o programa não lança exceção panic. Veja o programa a seguir:
package main import "fmt" func myfun(a interface{}) { value, ok := a.(float64) fmt.Println(value, ok) } func main() { var a1 interface { } = 98.09 myfun(a1) var a2 interface { } = "w3codebox" myfun(a2) }
Saída:
98.09 true 0 false
Julgamento de tipo:No Go interface, o julgamento de tipo é usado para comparar o tipo específico do interface com os tipos fornecidos nas instruções case. É semelhante a uma declaração de tipo, mas com uma diferença, pois especifica o tipo em maiúsculas, não o valor. Você também pode comparar o tipo com o tipo de interface. Veja o exemplo a seguir:
package main import "fmt" func myfun(a interface{}) { //Uso de julgamento de tipo switch a.(type) { case int: fmt.Println("Tipo: int, valor: ", a.(int)) case string: fmt.Println("\nTipo: string, valor: ", a.(string)) case float64: fmt.Println("\nTipo: float64,valor: ", a.(float64)) padrão: fmt.Println("\nTipo não encontrado") } }
Saída:
Tipo: string, valor: w3codebox Tipo: float64,valor: 67.9 Tipo não encontrado
Uso da interface:Quando você deseja passar diferentes tipos de parâmetros em um método ou função, você pode usar uma interface, como a função Println(). Ou, quando vários tipos implementam a mesma interface, você também pode usar a interface.