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 main
para executáveis, ou
package qualquercoisa
para 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) // 5
Veremos 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."