Go é ● Open Source ● Legível ● Segura ○ Type safety e Memory safe ○ Não possui buffer overflows ○ Não permite operações aritméticas com ponteiros (pointer arithmetic) ● Compilada ● Orientada a objetos (mas sem class, extends ou implements como no Java) ● Controlada por GC ● Estaticamente tipada ● Parte da familía do C
Fluxos de Controle ● Não necessita de ( ) nas condições como no Java e C ● { } são obrigatórios para delimitar o escopo ● Condições ○ If ■ Variáveis podem ser declaradas na condição e terão escopo apenas dentro do if ○ For ■ break e continue ■ while do C é for no Go ■ Se omitir a condição do loop ele executará para sempre (while true do C) ○ Switch ■ Similar ao C e Java, porém só executa o case selecionado ■ Não necessita de break no fim da condição, ele é implícito
If (exemplo) if i % 2 == 0 { // even } else { // odd } if i % 2 == 0 { // divisível por 2 } else if i % 3 == 0 { // divisível por 3 } if f, err := os.Open("f.txt"); err == nil { // abriu arquivo com sucesso } else { // erro ao abrir arquivo }
for { if i == 0 { continue } if i > 100 { break } i++ } For (exemplo) for i := 0; i <= 10; i++ { fmt.Println(i) } for k, v := range myMap { fmt.Println(k, v) }
Funções ● Podem retornar múltiplos valores func f() (int, err) ● Variadic functions igual do C (número de argumentos variável) func fprint(format string, args ...interface{}) ● Varíavels de retorno podem ser nomeadas func f() (value int, error err) ● Omissão do tipo em argumentos do mesmo tipo em sequência func f(s1, s2, s3 string, value int) bool ● Suporte a Closures (funções dentro de funções)
Ponteiros ● Similar ao C var x *int y := new(int) z := &Foo{} ● Não é permitido operações em cima do endereço var p *int = &a[0] var q = p+2 // não permitido ● Existe o método new mas não o delete ● Controlado pelo GC
Interfaces e Structs ● Interfaces ○ Contém apenas declaração de métodos (similar ao java) ○ Duck typing ● Structs ○ Tipo que contém campos nomeados ○ Suporte a métodos ○ Incorporação de tipos
Conversão de tipos ● Sem conversão implícita ● A expressão T(v) converte o valor v para o tipo T i := 42 f := float64(i) u := uint(f) ● Type assertion (o tipo na esquerda deve ser obrigatoriamente uma interface) var i interface{} = 42 f := i.(float64) f, ok := i.(float64)
Defer, Panic & Recover ● defer é um comando ● panic e recover são funções ● Defer agenda execução de uma função ● Panic causa um runtime error (similar a throw new Exception() no Java) ● Recover é usado para capturar runtime errors
Concorrência ● Goroutines ○ Funções que execução concorrentemente com outras ○ Usa-se a keyword go para invocar uma função ● Channels ○ Permite a comunicação entre goroutines ○ Útil para sincronizar execução ○ O comando select funciona como um switch para channels ○ Channels podem ser bufferizados ou não
Conclusão ● Go é ○ Simples ○ Legível ○ Divertido ● Interfaces são implícitas (duck typing) ● Usa composição ao invés de herança ● Concorrência é poderosa