The goals of the Go project were to eliminate the slowness and clumsiness of software development at Google, and thereby to make the process more productive and scalable. The language was designed by and for people who write—and read and debug and maintain—large software systems.
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.“Less is exponentially more.” - Rob Pike, um dos criadores da linguagem.
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.
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."