Go é uma linguagem de programação garbage-collected de tipagem estática, compilada e concorrente. Foi desenvolvida pelo Google e liberada ao mundo open source em 2007.
Para alguns, Go é uma linguagem rápida, divertida e produtiva.
Simplicidade
Simplicidade
Simplicidade!
Go não é "The Ultimate Programming Language", nasceu com um objetivo: fazer longas bases de código mais simples e programadores mais produtivos. Pra isso, sacrifica algumas coisas.package main import "fmt" func main() { fmt.Println("Hello, from Go!") }
package main import ( "fmt" "net/http" ) func main() { // registra um código que roda ao ser feito um request na raiz ("/") http.HandleFunc("/", meuHandler) http.ListenAndServe(":8080", nil) } // a função recebe como parametro um ResponseWriter (que é usado para escrever na resposta para o cliente) // e um ponteiro (sim, um ponteiro) para um Request (que é usado para se obter informações sobre quem se conectou) // a função Fprintf (sim, igual a de C) escreve em um Writer (no caso, ResponseWriter) a string "Olá, mundo!" func meuHandler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Olá, mundo!") }Aponte um browser para http://localhost:8080 e veja a mensagem "Olá, mundo!"
(:
Fora da caixa, a performance de Go é invejável: 10 mil conexões concorrentes em um servidor modesto. E sem um XML à vista. Não acredita? Veja você mesmo.package mainpara executáveis, ou
package qualquercoisapara libraries. Explicar as diferenças entre "package main" e "package foo"
package main func main() { // função que roda ao se executar o binário }
package main import ( "fmt" // pacote da biblioteca padrão )
// foo/foo.go package foo var AInteger int = 1 var anotherInteger int = 2 // main.go package main import ( "meupacote/foo" "fmt" ) func main() { fmt.Println(foo.AInteger) // "1" fmt.Println(foo.anotherInteger) // erro }
var a int var b string a = 1 b = "2" var c float64 = 5.4 var numeroComplexoOdiadoNoEnsinoMedio complex128 = 2 + 5i // sim, números complexos nativos! // pra funções também func Soma(a int, b int) int { return a + b } // se você inicializar a variável na declaração, pode omitir o tipo var myVar = "this is a var."
var a int fmt.Println(a) // 0
var a = 1 fmt.Println(a) // 1 func swap(a, b int) (int, int) { return b, a }
a, b := "foobar", 2 fmt.Println(a, b) // foobar 2
if b >= 1 { a = b - 5 } else if b < 0 { a = b + 10 }
if _, erro := arquivo.Read(conteudo); erro != nil { fmt.Println("Erro ao ler arquivo:", erro) }
for i := 0; i < 10; i++ { fmt.Println("i:", i) }
arquivo, _ := os.OpenFile("meu_arquivo.txt") // ... fazendo coisas com o arquivo, e no final da função arquivo.Close()Fácil de esquecer o "arquivo.Close()" ali no final da função, especialmente se ela for longa.
arquivo, err := os.OpenFile("meu_arquivo.txt") if err != nil { // cuidar do erro } defer arquivo.Close()Quando esta função terminar, o Close() do arquivo será chamado automaticamente. O comando também empilha as funções, e as chama em ordem LIFO (Last In, First Out).
func HelloWorld() string { return "hello, world" } fmt.Println(HelloWorld())
fn := func(a int) float64 { return a * 2.0 } fmt.Println(fn(5)) // 10.0
type Foo int var f Foo = Foo(5) // type cast de 5 para o tipo Foo fmt.Println(f) // 5Veremos o quanto isto é útil mais pra frente.
type Usuario struct { Nome string Idade int } meuUsuario := Usuario{ Nome: "Foo", Idade: 26, } fmt.Println(meuUsuario) // {Foo, 26}
// considere o Usuario do ultimo slide. func (u Usuario) PrintarNome() { fmt.Println("Meu nome é", u.Nome, ". Prazer em conhecê-lo.") } meuUsuario := Usuario{ Nome: "Marcos" } meuUsuario.PrintarNome() // printa na tela: "Meu nome é Marcos. Prazer em conhecê-lo."