Go exige conversão explícita entre tipos diferentes.
A conversão entre tipos (também conhecida como type casting) é feita por meio de uma função com o nome do tipo de destino.
Por exemplo, para converter um int em um float64, você precisa fazer o seguinte:
var x int = 42 // x has type int
f := float64(x) // f has type float64 (ie. 42.0)
Existe um pacote strconv para converter entre tipos primitivos (como int) e string.
import "strconv"
var intString string = "42"
var i, err = strconv.Atoi(intString)
var number int = 12
var s string = strconv.Itoa(number)
As interfaces em Go podem introduzir ambiguidade sobre o tipo subjacente.
Uma asserção de tipo permite extrair o valor concreto subjacente de um valor de interface usando esta sintaxe: interfaceVariable.(concreteType).
Por exemplo:
var input any = 12
number := input.(int)
OBSERVAÇÃO: isso vai causar um panic se a variável de interface não contiver um valor do tipo concreto.
Podemos testar se um valor de interface contém um tipo concreto específico usando os dois valores de retorno da asserção de tipo: o valor subjacente e um valor Boolean que informa se a asserção foi bem-sucedida. Por exemplo:
str, ok := input.(string) // no panic if input is not a string
Se input contiver uma string, então str será o valor subjacente e ok terá o valor true.
Se input não contiver uma string, então str será o valor zero do tipo string (ou seja, "", a string vazia) e ok terá o valor false.
Em nenhum dos casos ocorre um panic.
Um switch de tipo pode realizar várias asserções de tipo em sequência.
Ele tem a mesma sintaxe de uma asserção de tipo (interfaceVariable.(concreteType)), mas o concreteType é substituído pela palavra-chave type.
Veja um exemplo:
var i any = 12 // try: 12.3, true, int64(12), []int{}, map[string]int{}
switch v := i.(type) {
case int:
fmt.Printf("the integer %d\n", v)
case string:
fmt.Printf("the string %s\n", v)
default:
fmt.Printf("type, %T, not handled explicitly: %#v\n", v, v)
}
A Jen trabalha na sala de triagem de uma grande fábrica. A sala de triagem precisa processar tudo o que chega até ela, categorizando cada item com um rótulo. A Jen é responsável pelas coisas que foram pré-categorizadas como números e precisa de um programa para ajudá-la com a triagem.
A maioria dos valores primitivos deve receber rótulos diretos.
Para números, ela quer strings dizendo "This is the number 2.0" (se o número era 2).
A Jen quer a mesma saída para inteiros e números de ponto flutuante.
Existem algumas interfaces Box que precisam ser desembrulhadas para obter seu conteúdo.
Para um NumberBox, ela quer strings dizendo "This is a box containing the number 3.0" (se o método Number() retornar 3).
Para um FancyNumberBox, ela quer strings dizendo "This is a fancy box containing the number 4.0", mas apenas se o tipo for um FancyNumber.
Qualquer coisa inesperada deve dizer "Return to sender", para que a Jen possa devolvê-la de onde veio.
A Jen quer que os números retornem strings como "This is the number 2.0" (incluindo um dígito depois do ponto decimal):
fmt.Println(DescribeNumber(-12.345))
// Output: This is the number -12.3
A Jen quer que as caixas de número retornem strings como "This is a box containing the number 2.0" (de novo, incluindo um dígito depois do ponto decimal):
fmt.Println(DescribeNumberBox(numberBoxContaining{12}))
// Output: This is a box containing the number 12.0
A Jen precisa de uma função auxiliar para extrair o número de um FancyNumberBox.
Se o FancyNumberBox for um FancyNumber, extraia seu valor e converta-o de string para int.
Qualquer outro tipo de FancyNumberBox deve retornar 0.
fmt.Println(ExtractFancyNumber(FancyNumber{"10"}))
// Output: 10
fmt.Println(ExtractFancyNumber(AnotherFancyNumber{"4"}))
// Output: 0
Se o FancyNumberBox for um FancyNumber, a Jen quer strings dizendo "This is a fancy box containing the number 4.0".
Qualquer outro tipo de FancyNumberBox deve dizer "This is a fancy box containing the number 0.0".
fmt.Println(DescribeFancyNumberBox(FancyNumber{"10"}))
// Output: This is a fancy box containing the number 10.0
fmt.Println(DescribeFancyNumberBox(AnotherFancyNumber{"4"}))
// Output: This is a fancy box containing the number 0.0
OBSERVAÇÃO: devemos usar a função ExtractFancyNumber!
DescribeAnything, que usa todas elasEssa é a função principal de que a Jen precisa, e ela recebe qualquer entrada.
DescribeAnything deve delegar para as outras funções com base no tipo do valor passado.
Mais especificamente:
int quanto float64 devem delegar para DescribeNumber
NumberBox deve delegar para DescribeNumberBox
FancyNumberBox deve delegar para DescribeFancyNumberBox
"Return to sender"
fmt.Println(DescribeAnything(numberBoxContaining{12.345}))
// Output: This is a box containing the number 12.3
fmt.Println(DescribeAnything("some string"))
// Output: Return to sender
Crie sua conta no Exercism para aprender e dominar Go com 34 conceitos165 exercícios e mentoria humana de verdade, tudo de graça.