├── README.md
├── avancado
├── banco_mongo
│ ├── html
│ │ ├── local.html
│ │ └── ola.html
│ ├── main.go
│ ├── manipulador
│ │ ├── funcao.go
│ │ ├── local.go
│ │ ├── ola.go
│ │ └── variaveis.go
│ ├── model
│ │ ├── local.go
│ │ ├── log.go
│ │ └── pagina.go
│ └── repo
│ │ ├── conexaomongo.go
│ │ ├── conexaosql.go
│ │ └── local.go
├── banco_sql
│ ├── html
│ │ ├── local.html
│ │ └── ola.html
│ ├── main.go
│ ├── manipulador
│ │ ├── funcao.go
│ │ ├── local.go
│ │ ├── ola.go
│ │ └── variaveis.go
│ ├── model
│ │ ├── local.go
│ │ └── pagina.go
│ └── repo
│ │ └── conexaosql.go
├── defer
│ ├── cidades.csv
│ ├── cidades.json
│ ├── main.go
│ └── model
│ │ └── cidade.go
├── json_unmarshall
│ ├── main.go
│ └── model
│ │ └── blogpost.go
├── servidor_web
│ ├── html
│ │ └── ola.html
│ ├── main.go
│ ├── manipulador
│ │ ├── funcao.go
│ │ ├── ola.go
│ │ └── variaveis.go
│ └── model
│ │ └── pagina.go
├── web_get
│ └── main.go
└── web_post
│ ├── main.go
│ └── model
│ └── usuario.go
├── fundamentos
├── erro
│ ├── main.go
│ └── model
│ │ └── imovel.go
├── for
│ └── main.go
├── funcoes_avancado
│ ├── main.go
│ └── matematica
│ │ ├── generico.go
│ │ ├── soma.go
│ │ └── tipo.go
├── funcoes_basico
│ ├── main.go
│ └── matematica
│ │ ├── generico.go
│ │ └── soma.go
├── if
│ └── main.go
├── mapas
│ ├── main.go
│ └── model
│ │ └── imovel.go
├── pacotes
│ ├── main.go
│ ├── operadora
│ │ └── nome.go
│ └── prefixo
│ │ └── numero.go
├── ponteiro
│ └── main.go
├── structs_avancado
│ ├── main.go
│ └── model
│ │ ├── imovel.go
│ │ └── movel.go
├── structs_basico
│ └── main.go
├── switch
│ └── main.go
└── variaveis
│ └── variavel.go
└── intermediario
├── array
└── main.go
├── channel
└── main.go
├── escrever_arquivos
├── cidades.csv
├── main.go
└── model
│ └── cidade.go
├── gobuild
├── gobuild
├── main.go
├── meuapp
├── meuappraspberry
├── meuappwindows.exe
└── model
│ └── imovel.go
├── goroutines-maxprocs
└── main.go
├── goroutines
├── main.go
├── model
│ └── cidade.go
├── riodejaneiro.csv
├── riodejaneiro.json
├── saopaulo.csv
└── saopaulo.json
├── interfaces
├── main.go
└── model
│ └── ave.go
├── lerarquivos
├── cidades.csv
└── main.go
├── select
└── main.go
├── slices_basico
├── esquema-slice.png
└── main.go
└── slices_parte2
├── esquema-slice.png
└── main.go
/README.md:
--------------------------------------------------------------------------------
1 | # Material do Curso de Go em Português
2 |
3 | Este é um material de apoio para servir de exemplos em workshops e cursos online. A sequência está dentro do [curso online](https://www.udemy.com/cursodego/) ou será passada pelo facilitador no workshop. Porém, se você quiser usar esse material como referência para um item somente, pode usar fora de ordem.
4 |
5 | Caso queira contribuir ou tenha alguma dúvida, envie um Pull Request.
6 |
7 | ## Licença
8 |
9 | Este material é livre, licenciado sobre a licença Creative Commons
e pode ser utilizado livremente para estudo e em palestras desde que seja dado credito ao autor [Jeff Prestes](https://github.com/jeffprestes).
--------------------------------------------------------------------------------
/avancado/banco_mongo/html/local.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | Eu amo Go!!
4 |
5 |
6 | {{.Pais}}
7 | {{.Cidade}}
8 |
9 |
--------------------------------------------------------------------------------
/avancado/banco_mongo/html/ola.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | Eu amo Go!!
4 |
5 |
6 | A hora no mundo de Go é: {{.Hora}}
7 |
8 |
--------------------------------------------------------------------------------
/avancado/banco_mongo/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "net/http"
6 |
7 | "github.com/jeffprestes/cursodego/avancado/banco_mongo/manipulador"
8 | "github.com/jeffprestes/cursodego/avancado/banco_mongo/repo"
9 | )
10 |
11 | func init() {
12 | fmt.Println("Vamos começar a subir o servidor...")
13 | }
14 |
15 | func main() {
16 |
17 | err := repo.AbreConexaoComBancoDeDadosSQL()
18 | if err != nil {
19 | fmt.Println("Parando a carga do servidor. Erro ao abrir o banco de dados: ", err.Error())
20 | return
21 | }
22 |
23 | err = repo.AbreSessaoComMongo()
24 | if err != nil {
25 | fmt.Println("Parando a carga do servidor. Erro ao abrir a sessao com o MongoDB: ", err.Error())
26 | return
27 | }
28 |
29 | http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
30 | fmt.Fprintln(w, "Olá Mundo!")
31 | })
32 | http.HandleFunc("/funcao", manipulador.Funcao)
33 | http.HandleFunc("/ola", manipulador.Ola)
34 | http.HandleFunc("/local/", manipulador.Local)
35 | fmt.Println("Estou escutando, comandante...")
36 | http.ListenAndServe(":8181", nil)
37 | }
38 |
--------------------------------------------------------------------------------
/avancado/banco_mongo/manipulador/funcao.go:
--------------------------------------------------------------------------------
1 | package manipulador
2 |
3 | import (
4 | "fmt"
5 | "net/http"
6 | )
7 |
8 | //Funcao é um manipulador de requisição HTTP na rota /funcao
9 | func Funcao(w http.ResponseWriter, r *http.Request) {
10 | fmt.Fprintln(w, "Aqui é um manipulador usando função num pacote")
11 | }
12 |
--------------------------------------------------------------------------------
/avancado/banco_mongo/manipulador/local.go:
--------------------------------------------------------------------------------
1 | package manipulador
2 |
3 | import (
4 | "fmt"
5 | "net/http"
6 | "strconv"
7 | "time"
8 |
9 | "github.com/jeffprestes/cursodego/banco_mongo/model"
10 | "github.com/jeffprestes/cursodego/banco_mongo/repo"
11 | )
12 |
13 | //Local é o manipulador da requisição de rota /local/
14 | func Local(w http.ResponseWriter, r *http.Request) {
15 | local := model.Local{}
16 | codigoTelefone, err := strconv.Atoi(r.URL.Path[7:])
17 | if err != nil {
18 | http.Error(w, "Não foi enviado um numero válido. Verifique.", http.StatusBadRequest)
19 | fmt.Println("[local] erro ao converter o numero enviado: ", err.Error())
20 | return
21 | }
22 | sql := "select country, city, telcode from place where telcode = ?"
23 | linha, err := repo.Db.Queryx(sql, codigoTelefone)
24 | if err != nil {
25 | http.Error(w, "Não foi possível pesquisar esse numero.", http.StatusInternalServerError)
26 | fmt.Println("[local] nao foi possível executar a query: ", sql, " Erro: ", err.Error())
27 | return
28 | }
29 | for linha.Next() {
30 | err = linha.StructScan(&local)
31 | if err != nil {
32 | http.Error(w, "Não foi possível pesquisar esse numero.", http.StatusInternalServerError)
33 | fmt.Println("[local] nao foi fazer o binding dos dados do banco na struct: ", err.Error())
34 | return
35 | }
36 | }
37 | localMongo, err := repo.ObtemLocal(codigoTelefone)
38 | if err != nil {
39 | http.Error(w, "Não foi possível pesquisar esse numero.", http.StatusInternalServerError)
40 | fmt.Println("[local] nao foi possível executar a query no MongoDB. Erro: ", err.Error())
41 | return
42 | }
43 | if err := ModeloLocal.ExecuteTemplate(w, "local.html", localMongo); err != nil {
44 | http.Error(w, "Houve um erro na renderização da página.", http.StatusInternalServerError)
45 | fmt.Println("[local] Erro na execucao do modelo: ", err.Error())
46 | }
47 | sql = "insert into logquery (daterequest) values (?)"
48 | resultado, err := repo.Db.Exec(sql, time.Now().Format("02/01/2006 15:04:05"))
49 | if err != nil {
50 | fmt.Println("[local] Erro na inclusao do log: ", sql, " - ", err.Error())
51 | }
52 | linhasAfetadas, err := resultado.RowsAffected()
53 | if err != nil {
54 | fmt.Println("[local] Erro ao pegar o numero de linhas afetadas pelo comando: ", sql, " - ", err.Error())
55 | }
56 | log := model.RegistroLog{}
57 | log.DataVisita = time.Now().Format("02/01/2006 15:04:05")
58 | err = repo.SalvaLog(log)
59 | if err != nil {
60 | fmt.Println("[local] Erro na inclusao do log no MongoDB: ", err.Error())
61 | }
62 | fmt.Println("Sucesso! ", linhasAfetadas, " linha(s) afetada(s)")
63 | }
64 |
--------------------------------------------------------------------------------
/avancado/banco_mongo/manipulador/ola.go:
--------------------------------------------------------------------------------
1 | package manipulador
2 |
3 | import (
4 | "fmt"
5 | "net/http"
6 | "time"
7 |
8 | "github.com/jeffprestes/cursodego/banco_mongo/model"
9 | )
10 |
11 | //Ola é o manipulador da requisição a rota /ola
12 | func Ola(w http.ResponseWriter, r *http.Request) {
13 | hora := time.Now().Format("15:04:05")
14 | pagina := model.Pagina{}
15 | pagina.Hora = hora
16 | if err := ModeloOla.ExecuteTemplate(w, "ola.html", pagina); err != nil {
17 | http.Error(w, "Houve um erro na renderização da página.", http.StatusInternalServerError)
18 | fmt.Println("[Ola] Erro na execucao do modelo: ", err.Error())
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/avancado/banco_mongo/manipulador/variaveis.go:
--------------------------------------------------------------------------------
1 | package manipulador
2 |
3 | import "html/template"
4 |
5 | //ModeloOla armazena o modelo de pagina ola
6 | var ModeloOla = template.Must(template.ParseFiles("html/ola.html"))
7 |
8 | //ModeloLocal armazena o modelos de pagina Local
9 | var ModeloLocal = template.Must(template.ParseFiles("html/local.html"))
10 |
--------------------------------------------------------------------------------
/avancado/banco_mongo/model/local.go:
--------------------------------------------------------------------------------
1 | package model
2 |
3 | //Local armazena os dados da localidade pelo seu codigo telefonico
4 | type Local struct {
5 | Pais string `json:"pais" db:"country" bson:"country"`
6 | Cidade string `json:"cidade" db:"city" bson:"city"`
7 | CodigoTelefonico int `json:"cod_telefone" db:"telcode" bson:"telcode"`
8 | }
9 |
--------------------------------------------------------------------------------
/avancado/banco_mongo/model/log.go:
--------------------------------------------------------------------------------
1 | package model
2 |
3 | //RegistroLog armazena quando a pagina foi visitada
4 | type RegistroLog struct {
5 | DataVisita string `json:"dataVisita" bson:"dataVisita"`
6 | Quem string `json:"quem,omitempty" bson:"quem,omitempty"`
7 | }
8 |
--------------------------------------------------------------------------------
/avancado/banco_mongo/model/pagina.go:
--------------------------------------------------------------------------------
1 | package model
2 |
3 | //Pagina armazena as informações a serem renderizadas no modelo/template http Go
4 | type Pagina struct {
5 | Hora string
6 | }
7 |
--------------------------------------------------------------------------------
/avancado/banco_mongo/repo/conexaomongo.go:
--------------------------------------------------------------------------------
1 | package repo
2 |
3 | import (
4 | "gopkg.in/mgo.v2"
5 | )
6 |
7 | //SessaoMongo armazena a sessao de conexao com o Mongo
8 | var SessaoMongo *mgo.Session
9 |
10 | //AbreSessaoComMongo faz a conexao com o Mongo
11 | func AbreSessaoComMongo() (err error) {
12 | err = nil
13 | SessaoMongo, err = mgo.Dial("mongodb://localhost:27017/cursodego")
14 | return
15 | }
16 |
--------------------------------------------------------------------------------
/avancado/banco_mongo/repo/conexaosql.go:
--------------------------------------------------------------------------------
1 | package repo
2 |
3 | import (
4 | "github.com/jmoiron/sqlx"
5 | /*
6 | github.com/go-sql-driver/mysql não é usado diretamente pela aplicação
7 | */
8 | _ "github.com/go-sql-driver/mysql"
9 | )
10 |
11 | //Db armazena a conexão com o banco de dados
12 | var Db *sqlx.DB
13 |
14 | //AbreConexaoComBancoDeDadosSQL funcao que abre a conexao com o banco MYSQL
15 | func AbreConexaoComBancoDeDadosSQL() (err error) {
16 | err = nil
17 | Db, err = sqlx.Open("mysql", "root@tcp(127.0.0.1:3306)/cursodego")
18 | if err != nil {
19 | return
20 | }
21 | err = Db.Ping()
22 | if err != nil {
23 | return
24 | }
25 | return
26 | }
27 |
--------------------------------------------------------------------------------
/avancado/banco_mongo/repo/local.go:
--------------------------------------------------------------------------------
1 | package repo
2 |
3 | import (
4 | "github.com/jeffprestes/cursodego/avancado/banco_mongo/model"
5 | "gopkg.in/mgo.v2/bson"
6 | )
7 |
8 | //ObtemLocal retorna um local do MongoDB
9 | func ObtemLocal(codigoTelefone int) (local model.Local, err error) {
10 | sessao := SessaoMongo.Copy()
11 | defer sessao.Close()
12 | colecao := sessao.DB("cursodego").C("local")
13 | err = colecao.Find(bson.M{"telcode": codigoTelefone}).One(&local)
14 | return
15 | }
16 |
17 | //SalvaLog registra a consulta ao Local
18 | func SalvaLog(reg model.RegistroLog) (err error) {
19 | sessao := SessaoMongo.Copy()
20 | defer sessao.Close()
21 | colecao := sessao.DB("cursodego").C("logvisitas")
22 | err = colecao.Insert(reg)
23 | return
24 | }
25 |
--------------------------------------------------------------------------------
/avancado/banco_sql/html/local.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | Eu amo Go!!
4 |
5 |
6 | {{.Pais}}
7 | {{.Cidade.String}}
8 |
9 |
--------------------------------------------------------------------------------
/avancado/banco_sql/html/ola.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | Eu amo Go!!
4 |
5 |
6 | A hora no mundo de Go é: {{.Hora}}
7 |
8 |
--------------------------------------------------------------------------------
/avancado/banco_sql/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "net/http"
6 |
7 | "github.com/jeffprestes/cursodego/avancado/banco_sql/manipulador"
8 | "github.com/jeffprestes/cursodego/avancado/banco_sql/repo"
9 | )
10 |
11 | func init() {
12 | fmt.Println("Vamos começar a subir o servidor...")
13 | _, err := repo.AbreConexaoComBancoDeDadosSQL()
14 | if err != nil {
15 | fmt.Println("Parando a carga do servidor. Erro ao abrir o banco de dados: ", err.Error())
16 | return
17 | }
18 | }
19 |
20 | func main() {
21 |
22 | http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
23 | fmt.Fprintln(w, "Olá Mundo!")
24 | })
25 | http.HandleFunc("/funcao", manipulador.Funcao)
26 | http.HandleFunc("/ola", manipulador.Ola)
27 | http.HandleFunc("/local/", manipulador.Local)
28 | fmt.Println("Estou escutando, comandante...")
29 | http.ListenAndServe(":8181", nil)
30 | }
31 |
--------------------------------------------------------------------------------
/avancado/banco_sql/manipulador/funcao.go:
--------------------------------------------------------------------------------
1 | package manipulador
2 |
3 | import (
4 | "fmt"
5 | "net/http"
6 | )
7 |
8 | //Funcao é um manipulador de requisição HTTP na rota /funcao
9 | func Funcao(w http.ResponseWriter, r *http.Request) {
10 | fmt.Fprintln(w, "Aqui é um manipulador usando função num pacote")
11 | }
12 |
--------------------------------------------------------------------------------
/avancado/banco_sql/manipulador/local.go:
--------------------------------------------------------------------------------
1 | package manipulador
2 |
3 | import (
4 | "fmt"
5 | "log"
6 | "net/http"
7 | "strconv"
8 | "time"
9 |
10 | "github.com/jeffprestes/cursodego/banco_sql/model"
11 | "github.com/jeffprestes/cursodego/banco_sql/repo"
12 | )
13 |
14 | //Local é o manipulador da requisição de rota /local/
15 | func Local(w http.ResponseWriter, r *http.Request) {
16 |
17 | local := model.Local{}
18 |
19 | codigoTelefone, err := strconv.Atoi(r.URL.Path[7:])
20 | if err != nil {
21 | http.Error(w, "Não foi enviado um numero válido. Verifique.", http.StatusBadRequest)
22 | fmt.Println("[local] erro ao converter o numero enviado: ", err.Error())
23 | return
24 | }
25 |
26 | db, err := repo.GetDBConnection()
27 | if err != nil {
28 | log.Println("[Local] Erro na conexao: ", err.Error())
29 | return
30 | }
31 | sql := "select country, city, telcode from place where telcode = ?"
32 | linha, err := db.Queryx(sql, codigoTelefone)
33 | if err != nil {
34 | http.Error(w, "Não foi possível pesquisar esse numero.", http.StatusInternalServerError)
35 | fmt.Println("[local] nao foi possível executar a query: ", sql, " Erro: ", err.Error())
36 | return
37 | }
38 | for linha.Next() {
39 | err = linha.StructScan(&local)
40 | if err != nil {
41 | http.Error(w, "Não foi possível pesquisar esse numero.", http.StatusInternalServerError)
42 | fmt.Println("[local] nao foi fazer o binding dos dados do banco na struct: ", err.Error())
43 | return
44 | }
45 | }
46 | if err := ModeloLocal.ExecuteTemplate(w, "local.html", local); err != nil {
47 | http.Error(w, "Houve um erro na renderização da página.", http.StatusInternalServerError)
48 | fmt.Println("[local] Erro na execucao do modelo: ", err.Error())
49 | }
50 | sql = "insert into logquery (daterequest) values (?)"
51 | resultado, err := db.Exec(sql, time.Now().Format("02/01/2006 15:04:05"))
52 | if err != nil {
53 | fmt.Println("[local] Erro na inclusao do log: ", sql, " - ", err.Error())
54 | }
55 | linhasAfetadas, err := resultado.RowsAffected()
56 | if err != nil {
57 | fmt.Println("[local] Erro ao pegar o numero de linhas afetadas pelo comando: ", sql, " - ", err.Error())
58 | }
59 | fmt.Println("Sucesso! ", linhasAfetadas, " linha(s) afetada(s)")
60 | }
61 |
--------------------------------------------------------------------------------
/avancado/banco_sql/manipulador/ola.go:
--------------------------------------------------------------------------------
1 | package manipulador
2 |
3 | import (
4 | "fmt"
5 | "net/http"
6 | "time"
7 |
8 | "github.com/jeffprestes/cursodego/servidor_web/model"
9 | )
10 |
11 | //Ola é o manipulador da requisição a rota /ola
12 | func Ola(w http.ResponseWriter, r *http.Request) {
13 | hora := time.Now().Format("15:04:05")
14 | pagina := model.Pagina{}
15 | pagina.Hora = hora
16 | if err := ModeloOla.ExecuteTemplate(w, "ola.html", pagina); err != nil {
17 | http.Error(w, "Houve um erro na renderização da página.", http.StatusInternalServerError)
18 | fmt.Println("[Ola] Erro na execucao do modelo: ", err.Error())
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/avancado/banco_sql/manipulador/variaveis.go:
--------------------------------------------------------------------------------
1 | package manipulador
2 |
3 | import "html/template"
4 |
5 | //ModeloOla armazena o modelo de pagina ola
6 | var ModeloOla = template.Must(template.ParseFiles("html/ola.html"))
7 |
8 | //ModeloLocal armazena o modelos de pagina Local
9 | var ModeloLocal = template.Must(template.ParseFiles("html/local.html"))
10 |
--------------------------------------------------------------------------------
/avancado/banco_sql/model/local.go:
--------------------------------------------------------------------------------
1 | package model
2 |
3 | import "database/sql"
4 |
5 | //Local armazena os dados da localidade pelo seu codigo telefonico
6 | type Local struct {
7 | Pais string `json:"pais" db:"country"`
8 | Cidade sql.NullString `json:"cidade" db:"city"`
9 | CodigoTelefonico int `json:"cod_telefone" db:"telcode"`
10 | }
11 |
--------------------------------------------------------------------------------
/avancado/banco_sql/model/pagina.go:
--------------------------------------------------------------------------------
1 | package model
2 |
3 | //Pagina armazena as informações a serem renderizadas no modelo/template http Go
4 | type Pagina struct {
5 | Hora string
6 | }
7 |
--------------------------------------------------------------------------------
/avancado/banco_sql/repo/conexaosql.go:
--------------------------------------------------------------------------------
1 | package repo
2 |
3 | import (
4 | "log"
5 |
6 | "github.com/jmoiron/sqlx"
7 | /*
8 | github.com/go-sql-driver/mysql não é usado diretamente pela aplicação
9 | */
10 | _ "github.com/go-sql-driver/mysql"
11 | )
12 |
13 | //variavel singleton que armazena a conexao
14 | var db *sqlx.DB
15 |
16 | //AbreConexaoComBancoDeDadosSQL funcao que abre a conexao com o banco MYSQL
17 | func AbreConexaoComBancoDeDadosSQL() (db *sqlx.DB, err error) {
18 | err = nil
19 | db, err = sqlx.Open("mysql", "root@tcp(localhost:3306)/cursodego?parseTime=true")
20 | if err != nil {
21 | log.Println("[AbreConexaoComBancoDeDadosSQL] Erro na conexao: ", err.Error())
22 | return
23 | }
24 | err = db.Ping()
25 | if err != nil {
26 | log.Println("[AbreConexaoComBancoDeDadosSQL] Erro no ping na conexao: ", err.Error())
27 | return
28 | }
29 | return
30 | }
31 |
32 | //GetDBConnection Obtem a conexao com o banco de dados
33 | func GetDBConnection() (localdb *sqlx.DB, err error) {
34 | if db == nil {
35 | db, err = AbreConexaoComBancoDeDadosSQL()
36 | if err != nil {
37 | log.Println("[GetDBConnection] Erro na conexao: ", err.Error())
38 | return
39 | }
40 | }
41 | err = db.Ping()
42 | if err != nil {
43 | log.Println("[GetDBConnection] Erro no ping na conexao: ", err.Error())
44 | return
45 | }
46 | localdb = db
47 | return
48 | }
49 |
--------------------------------------------------------------------------------
/avancado/defer/cidades.csv:
--------------------------------------------------------------------------------
1 | São Paulo/SP,Rio de Janeiro/RJ,João Pessoa/PB,Porto Alegre/RS,Brasília/DF,Cuiabá/MT
--------------------------------------------------------------------------------
/avancado/defer/cidades.json:
--------------------------------------------------------------------------------
1 | [
2 | {"nome":"São Paulo","estado":"SP"},
3 | {"nome":"Rio de Janeiro","estado":"RJ"},
4 | {"nome":"João Pessoa","estado":"PB"},
5 | {"nome":"Porto Alegre","estado":"RS"},
6 | {"nome":"Brasília","estado":"DF"},
7 | {"nome":"Cuiabá","estado":"MT"}
8 | ]
--------------------------------------------------------------------------------
/avancado/defer/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "bufio"
5 | "encoding/csv"
6 | "encoding/json"
7 | "fmt"
8 | "os"
9 | "strings"
10 |
11 | "github.com/jeffprestes/cursodego/defer/model"
12 | )
13 |
14 | func main() {
15 |
16 | arquivo, err := os.Open("cidades.csv")
17 | if err != nil {
18 | fmt.Println("[main] Houve um erro ao abrir o arquivo. Erro: ", err.Error())
19 | return
20 | }
21 | defer arquivo.Close()
22 |
23 | leitorCsv := csv.NewReader(arquivo)
24 | conteudo, err := leitorCsv.ReadAll()
25 | if err != nil {
26 | fmt.Println("[main] Houve um erro ao ler o arquivo com leitor CSV. Erro: ", err.Error())
27 | return
28 | }
29 |
30 | arquivoJSON, err := os.Create("cidades.json")
31 | if err != nil {
32 | fmt.Println("[main] Houve um erro ao criar o arquivo JSON. Erro: ", err.Error())
33 | return
34 | }
35 | defer arquivoJSON.Close()
36 |
37 | escritor := bufio.NewWriter(arquivoJSON)
38 | escritor.WriteString("[\r\n")
39 | for _, linha := range conteudo {
40 | for indiceItem, item := range linha {
41 | dados := strings.Split(item, "/")
42 | cidade := model.Cidade{}
43 | cidade.Nome = dados[0]
44 | cidade.Estado = dados[1]
45 | fmt.Printf("Cidade: %+v\r\n", cidade)
46 | cidadeJSON, err := json.Marshal(cidade)
47 | if err != nil {
48 | fmt.Println("[main] Houve um erro ao gerar o json do item ", item, ". Erro: ", err.Error())
49 | }
50 | escritor.WriteString(" " + string(cidadeJSON))
51 | if (indiceItem + 1) < len(linha) {
52 | escritor.WriteString(",\r\n")
53 | }
54 | }
55 | }
56 | escritor.WriteString("\r\n]")
57 | escritor.Flush()
58 | }
59 |
--------------------------------------------------------------------------------
/avancado/defer/model/cidade.go:
--------------------------------------------------------------------------------
1 | package model
2 |
3 | //Cidade representa a cidade e estado do Brasil
4 | type Cidade struct {
5 | Nome string `json:"nome"`
6 | Estado string `json:"estado"`
7 | }
8 |
--------------------------------------------------------------------------------
/avancado/json_unmarshall/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "encoding/json"
5 | "fmt"
6 | "io/ioutil"
7 | "net/http"
8 | "time"
9 |
10 | "github.com/jeffprestes/cursodego/json_unmarshall/model"
11 | )
12 |
13 | func main() {
14 | cliente := &http.Client{
15 | Timeout: time.Second * 30,
16 | }
17 |
18 | request, err := http.NewRequest("GET", "https://jsonplaceholder.typicode.com/posts/1", nil)
19 | if err != nil {
20 | fmt.Println("[main] Erro ao criar um request para Servidor. Erro: ", err.Error())
21 | return
22 | }
23 | request.SetBasicAuth("teste", "teste")
24 | resposta, err := cliente.Do(request)
25 | if err != nil {
26 | fmt.Println("[main] Erro ao abrir a pagina do Servidor. Erro: ", err.Error())
27 | return
28 | }
29 | defer resposta.Body.Close()
30 |
31 | if resposta.StatusCode == 200 {
32 | corpo, err := ioutil.ReadAll(resposta.Body)
33 | if err != nil {
34 | fmt.Println("[main] Erro ao ler o conteudo da pagina do Servidor. Erro: ", err.Error())
35 | return
36 | }
37 | fmt.Println(" ")
38 | post := model.BlogPost{}
39 | err = json.Unmarshal(corpo, &post)
40 | if err != nil {
41 | fmt.Println("[main] Erro ao converter o retorno JSON do Servidor. Erro: ", err.Error())
42 | return
43 | }
44 | fmt.Printf("Post é: %+v\r\n", post)
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/avancado/json_unmarshall/model/blogpost.go:
--------------------------------------------------------------------------------
1 | package model
2 |
3 | //BlogPost armazena dados de um post no Blog
4 | type BlogPost struct {
5 | UsuarioID int `json:"userId"`
6 | ID int `json:"id"`
7 | Titulo string `json:"title"`
8 | Texto string `json:"body"`
9 | }
10 |
--------------------------------------------------------------------------------
/avancado/servidor_web/html/ola.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | Eu amo Go!!
4 |
5 |
6 | A hora no mundo de Go é: {{.Hora}}
7 |
8 |
--------------------------------------------------------------------------------
/avancado/servidor_web/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "net/http"
6 |
7 | "github.com/jeffprestes/cursodego/servidor_web/manipulador"
8 | )
9 |
10 | func main() {
11 |
12 | http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
13 | fmt.Fprintln(w, "Olá Mundo!")
14 | })
15 | http.HandleFunc("/funcao", manipulador.Funcao)
16 | http.HandleFunc("/ola", manipulador.Ola)
17 | fmt.Println("Estou escutando, comandante...")
18 | http.ListenAndServe(":8181", nil)
19 | }
20 |
--------------------------------------------------------------------------------
/avancado/servidor_web/manipulador/funcao.go:
--------------------------------------------------------------------------------
1 | package manipulador
2 |
3 | import (
4 | "fmt"
5 | "net/http"
6 | )
7 |
8 | //Funcao é um manipulador de requisição HTTP na rota /funcao
9 | func Funcao(w http.ResponseWriter, r *http.Request) {
10 | fmt.Fprintln(w, "Aqui é um manipulador usando função num pacote")
11 | }
12 |
--------------------------------------------------------------------------------
/avancado/servidor_web/manipulador/ola.go:
--------------------------------------------------------------------------------
1 | package manipulador
2 |
3 | import (
4 | "fmt"
5 | "net/http"
6 | "time"
7 |
8 | "github.com/jeffprestes/cursodego/servidor_web/model"
9 | )
10 |
11 | //Ola é o manipulador da requisição a rota /ola
12 | func Ola(w http.ResponseWriter, r *http.Request) {
13 | hora := time.Now().Format("15:04:05")
14 | pagina := model.Pagina{}
15 | pagina.Hora = hora
16 | if err := Modelos.ExecuteTemplate(w, "ola.html", pagina); err != nil {
17 | http.Error(w, "Houve um erro na renderização da página.", http.StatusInternalServerError)
18 | fmt.Println("[Ola] Erro na execucao do modelo: ", err.Error())
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/avancado/servidor_web/manipulador/variaveis.go:
--------------------------------------------------------------------------------
1 | package manipulador
2 |
3 | import "html/template"
4 |
5 | //Modelos armazena os modelos de pagina que serão executados pelos manipuladores
6 | var Modelos = template.Must(template.ParseFiles("html/ola.html"))
7 |
--------------------------------------------------------------------------------
/avancado/servidor_web/model/pagina.go:
--------------------------------------------------------------------------------
1 | package model
2 |
3 | //Pagina armazena as informações a serem renderizadas no modelo/template http Go
4 | type Pagina struct {
5 | Hora string
6 | }
7 |
--------------------------------------------------------------------------------
/avancado/web_get/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "io/ioutil"
6 | "net/http"
7 | "time"
8 | )
9 |
10 | func main() {
11 | cliente := &http.Client{
12 | Timeout: time.Second * 30,
13 | }
14 |
15 | resposta, err := cliente.Get("https://www.google.com.br")
16 | if err != nil {
17 | fmt.Println("[main] Erro ao abrir a pagina do Google Brasil. Erro: ", err.Error())
18 | return
19 | }
20 | defer resposta.Body.Close()
21 |
22 | if resposta.StatusCode == 200 {
23 | corpo, err := ioutil.ReadAll(resposta.Body)
24 | if err != nil {
25 | fmt.Println("[main] Erro ao ler o conteudo da pagina do Google Brasil. Erro: ", err.Error())
26 | return
27 | }
28 | fmt.Println(string(corpo))
29 | }
30 |
31 | request, err := http.NewRequest("GET", "https://www.google.com.br", nil)
32 | if err != nil {
33 | fmt.Println("[main] Erro ao criar um request para o Google Brasil. Erro: ", err.Error())
34 | return
35 | }
36 | request.SetBasicAuth("teste", "teste")
37 | resposta, err = cliente.Do(request)
38 | if err != nil {
39 | fmt.Println("[main] Erro ao abrir a pagina do Google Brasil. Erro: ", err.Error())
40 | return
41 | }
42 | defer resposta.Body.Close()
43 |
44 | if resposta.StatusCode == 200 {
45 | corpo, err := ioutil.ReadAll(resposta.Body)
46 | if err != nil {
47 | fmt.Println("[main] Erro ao ler o conteudo da pagina do Google Brasil. Erro: ", err.Error())
48 | return
49 | }
50 | fmt.Println(" ")
51 | fmt.Println(string(corpo))
52 | }
53 | }
54 |
--------------------------------------------------------------------------------
/avancado/web_post/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "bytes"
5 | "encoding/json"
6 | "fmt"
7 | "io/ioutil"
8 | "net/http"
9 | "time"
10 |
11 | "github.com/jeffprestes/cursodego/web_post/model"
12 | )
13 |
14 | func main() {
15 | cliente := &http.Client{
16 | Timeout: time.Second * 30,
17 | }
18 |
19 | usuario := model.Usuario{}
20 | usuario.ID = 1
21 | usuario.Nome = "Jeff Prestes"
22 |
23 | conteudoEnviar, err := json.Marshal(usuario)
24 | if err != nil {
25 | fmt.Println("[main] Erro ao gerar o JSON do objeto usuario. Erro: ", err.Error())
26 | return
27 | }
28 |
29 | //Visite https://postb.in , crie seu endpoint e altere na linha abaixo
30 | //Obrigado Dalton Corbetta pela sugestão de atualização
31 | request, err := http.NewRequest("POST", "https://postb.in/b/1588883267591-7930491962470", bytes.NewBuffer(conteudoEnviar))
32 | if err != nil {
33 | fmt.Println("[main] Erro ao criar um request para o request bin. Erro: ", err.Error())
34 | return
35 | }
36 | request.SetBasicAuth("fizz", "buzz")
37 | request.Header.Set("content-type", "application/json; charset=utf-8")
38 | resposta, err := cliente.Do(request)
39 | if err != nil {
40 | fmt.Println("[main] Erro ao chamar o servico do request bin. Erro: ", err.Error())
41 | return
42 | }
43 | defer resposta.Body.Close()
44 |
45 | if resposta.StatusCode == 200 {
46 | corpo, err := ioutil.ReadAll(resposta.Body)
47 | if err != nil {
48 | fmt.Println("[main] Erro ao ler o conteudo retornado pelo request bin. Erro: ", err.Error())
49 | return
50 | }
51 | fmt.Println(" ")
52 | fmt.Println(string(corpo))
53 | }
54 | }
55 |
--------------------------------------------------------------------------------
/avancado/web_post/model/usuario.go:
--------------------------------------------------------------------------------
1 | package model
2 |
3 | //Usuario representa um usuario do sistema
4 | type Usuario struct {
5 | ID int `json:"id"`
6 | Nome string `json:"nome"`
7 | }
8 |
--------------------------------------------------------------------------------
/fundamentos/erro/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "encoding/json"
5 | "fmt"
6 |
7 | "github.com/jeffprestes/cursodego/fundamentos/erro/model"
8 | )
9 |
10 | func main() {
11 | casa := model.Imovel{}
12 | casa.Nome = "Casa da Lucy"
13 | casa.X = 17
14 | casa.Y = 29
15 | if err := casa.SetValor(11000000); err != nil {
16 | fmt.Println("[main] Houve um erro na atribuição de valor a casa: ", err.Error())
17 | if err == model.ErrValorDeImovelMuitoAlto {
18 | fmt.Println("Corretor, por favor verifique a sua avaliação")
19 | }
20 | return
21 | }
22 |
23 | fmt.Printf("Casa é: %+v\r\n", casa)
24 |
25 | //objJSON, _ := json.Marshal(casa)
26 | objJSON, err := json.Marshal(casa)
27 | if err != nil {
28 | fmt.Println("[main] Houve um erro na geracao do objeto JSON: ", err.Error())
29 | return
30 | }
31 | fmt.Println("A casa em JSON: ", string(objJSON))
32 | }
33 |
--------------------------------------------------------------------------------
/fundamentos/erro/model/imovel.go:
--------------------------------------------------------------------------------
1 | package model
2 |
3 | import "errors"
4 |
5 | //Imovel representa um imovel
6 | type Imovel struct {
7 | Nome string `json:"nome"`
8 | valor int
9 | X int `json:"coordenada_x"`
10 | Y int `json:"coordenada_y"`
11 | }
12 |
13 | /*
14 | ErrValorDeImovelInvalido é um erro que é apresentado quando é atribuido a imóvel um valor muito baixo
15 | */
16 | var ErrValorDeImovelInvalido = errors.New("O valor informado não é valido para um imovel")
17 |
18 | /*
19 | ErrValorDeImovelMuitoAlto é um erro que é apresentado quando é atribuído ao imóvel um valor muito alto fora do mercado
20 | */
21 | var ErrValorDeImovelMuitoAlto = errors.New("O valor informado é muito alto")
22 |
23 | //GetValor obtem o valor do Imovel
24 | func (i *Imovel) GetValor() int {
25 | return i.valor
26 | }
27 |
28 | //SetValor define o valor do Imovel
29 | func (i *Imovel) SetValor(valor int) (err error) {
30 | err = nil
31 | if valor < 50000 {
32 | err = ErrValorDeImovelInvalido
33 | return
34 | } else if valor > 10000000 {
35 | err = ErrValorDeImovelMuitoAlto
36 | return
37 | }
38 | i.valor = valor
39 | return
40 | }
41 |
--------------------------------------------------------------------------------
/fundamentos/for/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import "fmt"
4 |
5 | func main() {
6 |
7 | for i := 0; i < 10; i++ {
8 | fmt.Println("Qual o valor de i? ", i)
9 | }
10 |
11 | valor := 0
12 | teste := true
13 | for teste {
14 | valor++
15 | if valor%5 == 0 {
16 | teste = false
17 | }
18 | fmt.Println("O numero é: ", valor)
19 | }
20 |
21 | for {
22 | valor--
23 | fmt.Println("O numero é: ", valor)
24 | if valor == 0 {
25 | break
26 | }
27 | }
28 |
29 | texto := "Eu adoro escrever programas usando Go. São ou ção"
30 | for indice, letra := range texto {
31 | fmt.Printf("Texto[%d] = %+v - %s\r\n", indice, letra, string(letra))
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/fundamentos/funcoes_avancado/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import "fmt"
4 | import "github.com/jeffprestes/cursodego/fundamentos/funcoes_avancado/matematica"
5 |
6 | func main() {
7 | resultado := matematica.Calculo(matematica.Multiplicador, 2, 2)
8 | fmt.Printf("O resultado da multiplicacao foi: %d\r\n", resultado)
9 | resultado = matematica.Soma(3, 3)
10 | fmt.Printf("O resultado da soma foi: %d\r\n", resultado)
11 | resultado = matematica.Calculo(matematica.Divisor, 12, 3)
12 | fmt.Printf("O resultado da divisão foi: %d\r\n", resultado)
13 | resultado, resto := matematica.DivisorComResto(12, 5)
14 | fmt.Printf("O resultado da divisão foi: %d e o resto da divisão foi %d\r\n", resultado, resto)
15 | }
16 |
--------------------------------------------------------------------------------
/fundamentos/funcoes_avancado/matematica/generico.go:
--------------------------------------------------------------------------------
1 | package matematica
2 |
3 | /*
4 | Calculo executa qualquer tipo de calculo basta enviar a funcao desejada
5 | */
6 | func Calculo(funcao fnCalculo, numeroA int, numeroB int) int {
7 | return funcao(numeroA, numeroB)
8 | }
9 |
10 | //Multiplicador multiplica x vezes o y
11 | func Multiplicador(x int, y int) int {
12 | return x * y
13 | }
14 |
15 | //Divisor efetua a divisão do numeroA pelo numeroB
16 | func Divisor(numeroA int, numeroB int) (resultado int) {
17 | resultado = numeroA / numeroB
18 | return
19 | }
20 |
21 | //DivisorComResto efetua a divisão do numeroA pelo numeroB
22 | //retorno o resultado e também resto da divisão
23 | func DivisorComResto(numeroA int, numeroB int) (resultado int, resto int) {
24 | resultado = numeroA / numeroB
25 | resto = numeroA % numeroB
26 | return
27 | }
28 |
--------------------------------------------------------------------------------
/fundamentos/funcoes_avancado/matematica/soma.go:
--------------------------------------------------------------------------------
1 | package matematica
2 |
3 | /*
4 | Soma é a soma de dois numeros
5 | */
6 | func Soma(x int, y int) int {
7 | return x + y
8 | }
9 |
--------------------------------------------------------------------------------
/fundamentos/funcoes_avancado/matematica/tipo.go:
--------------------------------------------------------------------------------
1 | package matematica
2 |
3 | //fnCalculo tipo de funcao que realiza um calculo com 2 parametros
4 | //e retorna um resultado
5 | type fnCalculo func(int, int) int
6 |
--------------------------------------------------------------------------------
/fundamentos/funcoes_basico/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | //funcoes_basico
4 |
5 | import "fmt"
6 | import "github.com/jeffprestes/cursodego/fundamentos/funcoes_basico/matematica"
7 |
8 | func main() {
9 |
10 | resultado := matematica.Soma(3, 3)
11 | fmt.Printf("O resultado da soma foi: %d\r\n", resultado)
12 |
13 | resultado = matematica.Calculo(matematica.Multiplicador, 2, 2)
14 | fmt.Printf("O resultado da calculo foi: %d\r\n", resultado)
15 |
16 | resultado = matematica.Calculo(matematica.Soma, 5, 4)
17 | fmt.Printf("O resultado do calculo foi: %d\r\n", resultado)
18 |
19 | }
20 |
--------------------------------------------------------------------------------
/fundamentos/funcoes_basico/matematica/generico.go:
--------------------------------------------------------------------------------
1 | package matematica
2 |
3 | //Multiplicador multiplica x vezes o y
4 | func Multiplicador(x int, y int) int {
5 | return x * y
6 | }
7 |
8 | /*
9 | Calculo executa qualquer tipo de calculo basta enviar a funcao desejada
10 | */
11 | func Calculo(funcao func(int, int) int, numeroA int, numeroB int) int {
12 | return funcao(numeroA, numeroB)
13 | }
14 |
--------------------------------------------------------------------------------
/fundamentos/funcoes_basico/matematica/soma.go:
--------------------------------------------------------------------------------
1 | package matematica
2 |
3 | /*
4 | Soma é a soma de dois numeros
5 | */
6 | func Soma(x int, y int) int {
7 | return x + y
8 | }
9 |
--------------------------------------------------------------------------------
/fundamentos/if/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import "fmt"
4 |
5 | func main() {
6 |
7 | meses := 0
8 | situacao := true
9 | cidade := "Teste"
10 |
11 | //< > != == <= >= && ||
12 | if meses <= 6 {
13 | fmt.Println("Esse credor deve há pouco tempo.")
14 | }
15 |
16 | //if situacao == true {
17 | if situacao {
18 | fmt.Println("Ele esta devendo")
19 | }
20 |
21 | //if situacao == false {
22 | if !situacao {
23 | fmt.Println("Ele esta adimplente")
24 | }
25 |
26 | if cidade == "Teste" {
27 | fmt.Println("O cliente vive no estado Teste")
28 | } else if cidade == "Athenas" {
29 | fmt.Println("O cliente vive em Athenas.")
30 | } else {
31 | fmt.Println("O cliente não vive no estado Teste")
32 | }
33 |
34 | /*
35 | descricao, status := haQuantoTempoEstaDevendo(meses)
36 | if status {
37 |
38 | }
39 | */
40 | if descricao, status := haQuantoTempoEstaDevendo(meses); status {
41 | fmt.Println("Qual a situação do cliente? ", descricao)
42 | return
43 | }
44 |
45 | //A instrucao abaixo não compila
46 | //fmt.Println("Me passa o status?", descricao)
47 |
48 | fmt.Println("Obrigado por nos consultar")
49 |
50 | }
51 |
52 | func haQuantoTempoEstaDevendo(meses int) (descricao string, status bool) {
53 | if meses > 0 {
54 | status = true
55 | descricao = "O cliente esta devendo."
56 | return
57 | }
58 | descricao = "O cliente esta com o carnê em dia."
59 | return
60 | }
61 |
--------------------------------------------------------------------------------
/fundamentos/mapas/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 |
6 | "github.com/jeffprestes/cursodego/fundamentos/mapas/model"
7 | )
8 |
9 | var cache map[string]model.Imovel
10 |
11 | func main() {
12 |
13 | cache = make(map[string]model.Imovel, 0)
14 |
15 | casa := model.Imovel{}
16 | casa.Nome = "Casa Amarela"
17 | casa.X = 18
18 | casa.Y = 25
19 | casa.SetValor(60000)
20 |
21 | cache["Casa Amarela"] = casa
22 |
23 | fmt.Println("Há uma casa amarela no cache?")
24 | imovel, achou := cache["Casa Amarela"]
25 | if achou {
26 | fmt.Printf("Sim, e o que achei foi: %+v\r\n", imovel)
27 | }
28 |
29 | apto := model.Imovel{}
30 | apto.Nome = "Apto Azul"
31 | apto.X = 19
32 | apto.Y = 26
33 | apto.SetValor(70000)
34 |
35 | cache[apto.Nome] = apto
36 |
37 | fmt.Println("Quantos itens há no cache? ", len(cache))
38 |
39 | for chave, imovel := range cache {
40 | fmt.Printf("Chave[%s] = %+v\n\r", chave, imovel)
41 | }
42 |
43 | _, achou = cache["Casa Amarela"]
44 | if achou {
45 | delete(cache, "Casa Amarela")
46 | }
47 |
48 | fmt.Println("Quantos itens há no cache? ", len(cache))
49 | }
50 |
--------------------------------------------------------------------------------
/fundamentos/mapas/model/imovel.go:
--------------------------------------------------------------------------------
1 | package model
2 |
3 | //Imovel representa informações de um imóvel
4 | type Imovel struct {
5 | X int `json:"coordenada_x"`
6 | Y int `json:"coordenada_y"`
7 | Nome string `json:"nome"`
8 | valor int
9 | }
10 |
11 | //SetValor define o valor do imovel
12 | func (i *Imovel) SetValor(valor int) {
13 | i.valor = valor
14 | }
15 |
16 | //GetValor retorna o valor do Imovel
17 | func (i *Imovel) GetValor() int {
18 | return i.valor
19 | }
20 |
--------------------------------------------------------------------------------
/fundamentos/pacotes/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 |
6 | "github.com/jeffprestes/cursodego/pacotes/operadora"
7 | "github.com/jeffprestes/cursodego/pacotes/prefixo"
8 | )
9 |
10 | //NomeDoUsuario é o nome do usuário do sistema
11 | var NomeDoUsuario = "Jeff"
12 |
13 | func main() {
14 | fmt.Printf("Nome do usuario: %s\r\n", NomeDoUsuario)
15 | fmt.Printf("Prefixo da Capital: %d\r\n", prefixo.Capital)
16 | fmt.Printf("Nome da operadora: %s\r\n", operadora.NomeOperadora)
17 | fmt.Printf("Valor de teste: %s\r\n", prefixo.TesteComPrefixo)
18 | }
19 |
--------------------------------------------------------------------------------
/fundamentos/pacotes/operadora/nome.go:
--------------------------------------------------------------------------------
1 | package operadora
2 |
3 | import (
4 | "strconv"
5 |
6 | "github.com/jeffprestes/cursodego/pacotes/prefixo"
7 | )
8 |
9 | //NomeOperadora representa o nome da operadora que se estar a usar
10 | var NomeOperadora = "XPTO Telecom"
11 |
12 | //PrefixoDaCapitalOperadora prefixo mais o nome da operadora
13 | var PrefixoDaCapitalOperadora = strconv.Itoa(prefixo.Capital) + " " + NomeOperadora
14 |
--------------------------------------------------------------------------------
/fundamentos/pacotes/prefixo/numero.go:
--------------------------------------------------------------------------------
1 | package prefixo
2 |
3 | import "strconv"
4 |
5 | //Capital representa o numero do prefixo de telefone da capital de um estado/provincia
6 | var Capital = 11
7 |
8 | var teste = "teste"
9 |
10 | //TesteComPrefixo isto é só um teste
11 | var TesteComPrefixo = teste + " " + strconv.Itoa(Capital)
12 |
--------------------------------------------------------------------------------
/fundamentos/ponteiro/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import "fmt"
4 |
5 | //Imovel é uma struct que armazena dados de um imovel
6 | type Imovel struct {
7 | X int
8 | Y int
9 | Nome string
10 | valor int
11 | }
12 |
13 | func main() {
14 |
15 | casa := new(Imovel)
16 | fmt.Printf("Casa é: %p - %+v\r\n", &casa, casa)
17 |
18 | mudaImovel(casa)
19 | fmt.Printf("casa é: %p - %+v\r\n", casa, casa)
20 |
21 | chacara := Imovel{17, 28, "Chacara Linda", 280000}
22 | fmt.Printf("chacara é: %p - %+v\r\n", &chacara, chacara)
23 |
24 | mudaImovel(&chacara)
25 | fmt.Printf("chacara é: %p - %+v\r\n", &chacara, chacara)
26 |
27 | }
28 |
29 | func mudaImovel(imovel *Imovel) {
30 | imovel.X = imovel.X + 10
31 | imovel.Y = imovel.Y - 5
32 | }
33 |
--------------------------------------------------------------------------------
/fundamentos/structs_avancado/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "encoding/json"
5 | "fmt"
6 |
7 | "github.com/jeffprestes/cursodego/fundamentos/structs_avancado/model"
8 | )
9 |
10 | func main() {
11 |
12 | casa := model.Imovel{}
13 | casa.Nome = "Casa Amarela"
14 | casa.X = 18
15 | casa.Y = 25
16 | casa.SetValor(60000)
17 |
18 | fmt.Printf("Casa é: %+v\r\n", casa)
19 | fmt.Printf("O valor da casa é: %d\r\n", casa.GetValor())
20 | objJSON, _ := json.Marshal(casa)
21 |
22 | fmt.Println("A casa em JSON: ", string(objJSON))
23 |
24 | casa.DobraValor()
25 | fmt.Printf("O valor da casa é: %d\r\n", casa.GetValor())
26 |
27 | model.TriplicaValor(&casa)
28 | fmt.Printf("O valor da casa é: %d\r\n", casa.GetValor())
29 |
30 | casa = model.QuadruplicaValor(casa)
31 |
32 | //Criando um objeto a partir de uma struct mas com a criação
33 | //sendo encapsulada com um metodo New ou Novo
34 | meuMovel := model.NovoMovel(1, 2, 100, "estante")
35 | fmt.Println("Na casa", casa.Nome, " tem um movel chamado", meuMovel.Nome)
36 | }
37 |
--------------------------------------------------------------------------------
/fundamentos/structs_avancado/model/imovel.go:
--------------------------------------------------------------------------------
1 | package model
2 |
3 | //Imovel representa informações de um imóvel
4 | type Imovel struct {
5 | X int `json:"coordenada_x"`
6 | Y int `json:"coordenada_y"`
7 | Nome string `json:"nome"`
8 | valor int
9 | }
10 |
11 | //SetValor define o valor do imovel
12 | func (i *Imovel) SetValor(valor int) {
13 | i.valor = valor
14 | }
15 |
16 | //DobraValor dobra o valor informado
17 | func (i *Imovel) DobraValor() {
18 | i.valor = i.valor * 2
19 | return
20 | }
21 |
22 | //GetValor retorna o valor do Imovel
23 | func (i *Imovel) GetValor() int {
24 | return i.valor
25 | }
26 |
27 | //TriplicaValor triplica valor
28 | func TriplicaValor(i *Imovel) {
29 | i.valor = i.valor * 3
30 | }
31 |
32 | func QuadruplicaValor(i Imovel) (x Imovel) {
33 | x.valor = i.valor * 4
34 | return
35 | }
36 |
--------------------------------------------------------------------------------
/fundamentos/structs_avancado/model/movel.go:
--------------------------------------------------------------------------------
1 | package model
2 |
3 | type movel struct {
4 | X int `json:"coordenada_x"`
5 | Y int `json:"coordenada_y"`
6 | Nome string `json:"nome"`
7 | Valor int
8 | }
9 |
10 | //NovoMovel encapsula a criacao da instancia de novo movel
11 | func NovoMovel(x, y, valor int, nome string) movel {
12 | m := movel{x, y, nome, valor}
13 | return m
14 | }
15 |
--------------------------------------------------------------------------------
/fundamentos/structs_basico/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import "fmt"
4 |
5 | //Imovel é uma struct que armazena dados de um imovel
6 | type Imovel struct {
7 | X int
8 | Y int
9 | Nome string
10 | valor int
11 | }
12 |
13 | func main() {
14 |
15 | casa := Imovel{}
16 | fmt.Printf("A casa é: %+v\r\n", casa)
17 | casa.Nome = "Lar Doce Lar"
18 | casa.valor = 450000
19 | casa.X = 18
20 | casa.Y = 31
21 | fmt.Printf("A casa é: %+v\r\n", casa)
22 |
23 | apartmento := Imovel{17, 56, "Meu AP", 760000}
24 | fmt.Printf("O Apartamento é: %+v\r\n", apartmento)
25 |
26 | chacara := Imovel{
27 | Y: 85,
28 | Nome: "Chacara",
29 | valor: 55,
30 | X: 22,
31 | }
32 | fmt.Printf("A chacara é: %+v\r\n", chacara)
33 | }
34 |
--------------------------------------------------------------------------------
/fundamentos/switch/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "runtime"
6 | "time"
7 | )
8 |
9 | func main() {
10 |
11 | numero := 3
12 | fmt.Print("O numero ", numero, " se escreve assim: ")
13 | switch numero {
14 | case 1:
15 | fmt.Println("um.")
16 | case 2:
17 | fmt.Println("dois.")
18 | case 3:
19 | fmt.Println("três.")
20 | }
21 |
22 | fmt.Println("Você é da família do Unix?")
23 | switch runtime.GOOS {
24 | case "darwin":
25 | fallthrough
26 | case "freebsd":
27 | fallthrough
28 | case "linux":
29 | fmt.Println("Sim!!")
30 | default:
31 | fmt.Println("Deixa essa pergunta para lá...")
32 | }
33 |
34 | switch time.Now().Weekday() {
35 | case time.Saturday, time.Sunday:
36 | fmt.Println("OK, você pode dormir até mais tarde.")
37 | default:
38 | fmt.Println("Vamos lá que é dia de trabalho")
39 | }
40 |
41 | numero = 9
42 | fmt.Println("Este numero cabe num dígito?")
43 | switch {
44 | case numero < 10:
45 | fmt.Println("Sim")
46 | case numero >= 10 && numero < 100:
47 | fmt.Println("Serve dois dígitos...")
48 | case numero >= 100:
49 | fmt.Println("Não dá o numero é muito grande")
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/fundamentos/variaveis/variavel.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import "fmt"
4 |
5 | var (
6 | //Endereco é um valor importante e tem de ser publico
7 | Endereco string
8 | //Telefone é um valor importante para a nossa aula
9 | Telefone string
10 | quantidade, estoque int //quantidade = 0
11 | comprou bool //comprou = false
12 | valor float64 //valor = 0.00
13 | palavras rune
14 | )
15 |
16 | func main() {
17 | teste := "Valor de teste"
18 | fmt.Printf("endereco: %s\r\n", Endereco)
19 | fmt.Printf("quantidade: %d\r\n", quantidade)
20 | fmt.Printf("comprou: %v\r\n", comprou)
21 | fmt.Printf("palavras: %v\r\n", palavras)
22 | fmt.Printf("O valor de teste é: %v\r\n", teste)
23 | }
24 |
--------------------------------------------------------------------------------
/intermediario/array/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import "fmt"
4 |
5 | func main() {
6 |
7 | var teste [3]int
8 | teste[0] = 3
9 | teste[1] = 2
10 | teste[2] = 1
11 | fmt.Println("Qual a capacidade deste array? ", len(teste))
12 |
13 | cantores := [2]string{"Michael Jackson", "John Lennon"}
14 | fmt.Printf("O que há nesse Array? \n\r%v\r\n", cantores)
15 |
16 | capitais := [...]string{"Lisboa", "Brasilia", "Luanda", "Maputo"}
17 | fmt.Println("Qual a capacidade deste array? ", len(capitais))
18 | for indice, cidade := range capitais {
19 | fmt.Printf("Capital[%d] é %s\n\r", indice, cidade)
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/intermediario/channel/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "time"
6 | )
7 |
8 | func pinger(canal chan string) {
9 | for {
10 | canal <- "ping"
11 | }
12 | }
13 |
14 | func ponger(canal chan string) {
15 | for {
16 | canal <- "pong"
17 | }
18 | }
19 |
20 | func impressora(canal chan string) {
21 | for {
22 | msg := <-canal
23 | fmt.Println(msg)
24 | time.Sleep(time.Second * 1)
25 | }
26 | }
27 |
28 | func main() {
29 | var canal chan string
30 | canal = make(chan string)
31 | go pinger(canal)
32 | go ponger(canal)
33 | go impressora(canal)
34 |
35 | var entrada string
36 | fmt.Scanln(&entrada)
37 |
38 | }
39 |
--------------------------------------------------------------------------------
/intermediario/escrever_arquivos/cidades.csv:
--------------------------------------------------------------------------------
1 | São Paulo/SP,Rio de Janeiro/RJ,João Pessoa/PB,Porto Alegre/RS,Brasília/DF,Cuiabá/MT
--------------------------------------------------------------------------------
/intermediario/escrever_arquivos/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "bufio"
5 | "encoding/csv"
6 | "encoding/json"
7 | "fmt"
8 | "os"
9 | "strings"
10 |
11 | "github.com/jeffprestes/cursodego/escrever_arquivos/model"
12 | )
13 |
14 | func main() {
15 |
16 | arquivo, err := os.Open("cidades.csv")
17 | if err != nil {
18 | fmt.Println("[main] Houve um erro ao abrir o arquivo. Erro: ", err.Error())
19 | return
20 | }
21 | defer arquivo.Close()
22 |
23 | leitorCsv := csv.NewReader(arquivo)
24 | conteudo, err := leitorCsv.ReadAll()
25 | if err != nil {
26 | fmt.Println("[main] Houve um erro ao ler o arquivo com leitor CSV. Erro: ", err.Error())
27 | return
28 | }
29 |
30 | arquivoJSON, err := os.Create("cidades.json")
31 | if err != nil {
32 | fmt.Println("[main] Houve um erro ao criar o arquivo JSON. Erro: ", err.Error())
33 | return
34 | }
35 | defer arquivoJSON.Close()
36 |
37 | escritor := bufio.NewWriter(arquivoJSON)
38 | escritor.WriteString("[\r\n")
39 | for _, linha := range conteudo {
40 | for indiceItem, item := range linha {
41 | dados := strings.Split(item, "/")
42 | cidade := model.Cidade{}
43 | cidade.Nome = dados[0]
44 | cidade.Estado = dados[1]
45 | fmt.Printf("Cidade: %+v\r\n", cidade)
46 | cidadeJSON, err := json.Marshal(cidade)
47 | if err != nil {
48 | fmt.Println("[main] Houve um erro ao gerar o json do item ", item, ". Erro: ", err.Error())
49 | }
50 | escritor.WriteString(" " + string(cidadeJSON))
51 | if (indiceItem + 1) < len(linha) {
52 | escritor.WriteString(",\r\n")
53 | }
54 | }
55 | }
56 | escritor.WriteString("\r\n]")
57 | escritor.Flush()
58 | }
59 |
--------------------------------------------------------------------------------
/intermediario/escrever_arquivos/model/cidade.go:
--------------------------------------------------------------------------------
1 | package model
2 |
3 | //Cidade representa a cidade e estado do Brasil
4 | type Cidade struct {
5 | Nome string `json:"nome"`
6 | Estado string `json:"estado"`
7 | }
8 |
--------------------------------------------------------------------------------
/intermediario/gobuild/gobuild:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jeffprestes/cursodego/c5bc6f04dc94e5d36a499711dc65f3a21f5dd94b/intermediario/gobuild/gobuild
--------------------------------------------------------------------------------
/intermediario/gobuild/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "encoding/json"
5 | "fmt"
6 |
7 | "github.com/jeffprestes/cursodego/gobuild/model"
8 | )
9 |
10 | /*
11 | GOOS=windows GOARCH=386 go build -o meuapp.exe
12 | GOOS=linux GOARCH=arm go build -o meuappraspberry -v github.com/jeffprestes/cursodego/gobuild
13 | */
14 | func main() {
15 | casa := model.Imovel{}
16 | casa.Nome = "Casa da Lucy"
17 | casa.X = 17
18 | casa.Y = 29
19 | casa.SetValor(100)
20 |
21 | fmt.Printf("Casa é: %+v\r\n", casa)
22 |
23 | objJSON, _ := json.Marshal(casa)
24 | fmt.Println("A casa em JSON: ", string(objJSON))
25 | }
26 |
--------------------------------------------------------------------------------
/intermediario/gobuild/meuapp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jeffprestes/cursodego/c5bc6f04dc94e5d36a499711dc65f3a21f5dd94b/intermediario/gobuild/meuapp
--------------------------------------------------------------------------------
/intermediario/gobuild/meuappraspberry:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jeffprestes/cursodego/c5bc6f04dc94e5d36a499711dc65f3a21f5dd94b/intermediario/gobuild/meuappraspberry
--------------------------------------------------------------------------------
/intermediario/gobuild/meuappwindows.exe:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jeffprestes/cursodego/c5bc6f04dc94e5d36a499711dc65f3a21f5dd94b/intermediario/gobuild/meuappwindows.exe
--------------------------------------------------------------------------------
/intermediario/gobuild/model/imovel.go:
--------------------------------------------------------------------------------
1 | package model
2 |
3 | //Imovel representa um imovel
4 | type Imovel struct {
5 | Nome string `json:"nome"`
6 | valor int
7 | X int `json:"coordenada_x"`
8 | Y int `json:"coordenada_y"`
9 | }
10 |
11 | //GetValor obtem o valor do Imovel
12 | func (i *Imovel) GetValor() int {
13 | return i.valor
14 | }
15 |
16 | //SetValor define o valor do Imovel
17 | func (i *Imovel) SetValor(valor int) {
18 | i.valor = valor
19 | }
20 |
--------------------------------------------------------------------------------
/intermediario/goroutines-maxprocs/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "runtime"
6 | "time"
7 | )
8 |
9 | func main() {
10 | runtime.GOMAXPROCS(4)
11 | start := time.Now()
12 | go func() {
13 | for i := 0; i < 3; i++ {
14 | fmt.Println(i)
15 | }
16 | }()
17 |
18 | go func() {
19 | for i := 0; i < 3; i++ {
20 | fmt.Println(i)
21 | }
22 | }()
23 |
24 | elapsedTime := time.Since(start)
25 |
26 | fmt.Println("Total Time de Execucao: " + elapsedTime.String())
27 |
28 | time.Sleep(time.Second)
29 | }
30 |
--------------------------------------------------------------------------------
/intermediario/goroutines/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "bufio"
5 | "encoding/csv"
6 | "encoding/json"
7 | "fmt"
8 | "log"
9 | "os"
10 | "strings"
11 | "time"
12 |
13 | "sync"
14 |
15 | "github.com/jeffprestes/cursodego/goroutines/model"
16 | )
17 |
18 | var orquestrador sync.WaitGroup
19 |
20 | func main() {
21 | orquestrador.Add(2)
22 | log.Println("****** Começando...")
23 | go traduzirParaJSON("saopaulo")
24 | go traduzirParaJSON("riodejaneiro")
25 | orquestrador.Wait()
26 | log.Println("****** Acabei! ******")
27 | }
28 |
29 | func traduzirParaJSON(nomeArquivo string) {
30 | fmt.Println(time.Now(), " - Começando a tradução do arquivo: ", nomeArquivo)
31 | arquivo, err := os.Open(nomeArquivo + ".csv")
32 | if err != nil {
33 | fmt.Println("[main] Houve um erro ao abrir o arquivo. Erro: ", err.Error())
34 | return
35 | }
36 | defer arquivo.Close()
37 |
38 | leitorCsv := csv.NewReader(arquivo)
39 | conteudo, err := leitorCsv.ReadAll()
40 | if err != nil {
41 | fmt.Println("[main] Houve um erro ao ler o arquivo com leitor CSV. Erro: ", err.Error())
42 | return
43 | }
44 |
45 | arquivoJSON, err := os.Create(nomeArquivo + ".json")
46 | if err != nil {
47 | fmt.Println("[main] Houve um erro ao criar o arquivo JSON. Erro: ", err.Error())
48 | return
49 | }
50 | defer arquivoJSON.Close()
51 |
52 | escritor := bufio.NewWriter(arquivoJSON)
53 | escritor.WriteString("[\r\n")
54 | for _, linha := range conteudo {
55 | for indiceItem, item := range linha {
56 | dados := strings.Split(item, "/")
57 | if len(dados) > 1 {
58 | cidade := model.Cidade{}
59 | cidade.Nome = dados[0]
60 | cidade.Estado = dados[1]
61 | fmt.Printf("Cidade: %+v\r\n", cidade)
62 | cidadeJSON, err := json.Marshal(cidade)
63 | if err != nil {
64 | fmt.Println("[main] Houve um erro ao gerar o json do item ", item, ". Erro: ", err.Error())
65 | }
66 | escritor.WriteString(" " + string(cidadeJSON))
67 | if (indiceItem + 1) < len(linha) {
68 | escritor.WriteString(",\r\n")
69 | }
70 | } else {
71 | fmt.Println("Erro no nome da cidade: ", dados)
72 | }
73 | }
74 | }
75 | escritor.WriteString("\r\n]")
76 | escritor.Flush()
77 | fmt.Println(time.Now(), " - A tradução do arquivo: ", nomeArquivo, " foi finalizada")
78 | orquestrador.Done()
79 | }
80 |
--------------------------------------------------------------------------------
/intermediario/goroutines/model/cidade.go:
--------------------------------------------------------------------------------
1 | package model
2 |
3 | //Cidade representa a cidade e estado do Brasil
4 | type Cidade struct {
5 | Nome string `json:"nome"`
6 | Estado string `json:"estado"`
7 | }
8 |
--------------------------------------------------------------------------------
/intermediario/goroutines/riodejaneiro.csv:
--------------------------------------------------------------------------------
1 | Rio de Janeiro/RJ,Parati/RJ,Duque de Caxias/RJ,Nova Friburgo/RJ,Campos/RJ,Rezende/RJ,Niterói/RJ,São João do Metiti/RJ,
--------------------------------------------------------------------------------
/intermediario/goroutines/riodejaneiro.json:
--------------------------------------------------------------------------------
1 | [
2 | {"nome":"Rio de Janeiro","estado":"RJ"},
3 | {"nome":"Parati","estado":"RJ"},
4 | {"nome":"Duque de Caxias","estado":"RJ"},
5 | {"nome":"Nova Friburgo","estado":"RJ"},
6 | {"nome":"Campos","estado":"RJ"},
7 | {"nome":"Rezende","estado":"RJ"},
8 | {"nome":"Niterói","estado":"RJ"},
9 | {"nome":"São João do Metiti","estado":"RJ"},
10 |
11 | ]
--------------------------------------------------------------------------------
/intermediario/goroutines/saopaulo.csv:
--------------------------------------------------------------------------------
1 | São Paulo/SP,Andradina/SP,Osasco/SP,Guarujá/SP,Presidente Prudente/SP,Itu/SP,Indaiatuba/SP,Ribeirão Preto/SP,São José dos Campos/SP,Guararema/SP,Ourinhos/SP,Santo André/SP,Mococa/SP,Ribeirão Pires/SP,Santos/SP,Bertioga/SP,Registro/SP,Mongaguá/SP,Bauru/SP,Bragança Paulista/SP
--------------------------------------------------------------------------------
/intermediario/goroutines/saopaulo.json:
--------------------------------------------------------------------------------
1 | [
2 | {"nome":"São Paulo","estado":"SP"},
3 | {"nome":"Andradina","estado":"SP"},
4 | {"nome":"Osasco","estado":"SP"},
5 | {"nome":"Guarujá","estado":"SP"},
6 | {"nome":"Presidente Prudente","estado":"SP"},
7 | {"nome":"Itu","estado":"SP"},
8 | {"nome":"Indaiatuba","estado":"SP"},
9 | {"nome":"Ribeirão Preto","estado":"SP"},
10 | {"nome":"São José dos Campos","estado":"SP"},
11 | {"nome":"Guararema","estado":"SP"},
12 | {"nome":"Ourinhos","estado":"SP"},
13 | {"nome":"Santo André","estado":"SP"},
14 | {"nome":"Mococa","estado":"SP"},
15 | {"nome":"Ribeirão Pires","estado":"SP"},
16 | {"nome":"Santos","estado":"SP"},
17 | {"nome":"Bertioga","estado":"SP"},
18 | {"nome":"Registro","estado":"SP"},
19 | {"nome":"Mongaguá","estado":"SP"},
20 | {"nome":"Bauru","estado":"SP"},
21 | {"nome":"Bragança Paulista","estado":"SP"}
22 | ]
--------------------------------------------------------------------------------
/intermediario/interfaces/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 |
6 | "github.com/jeffprestes/cursodego/interfaces/model"
7 | )
8 |
9 | func queroAcordarComUmCacarejo(g model.Galinha) {
10 | fmt.Println(g.Cacareja())
11 | }
12 |
13 | func queroOuvirUmaPataNoLago(p model.Pata) {
14 | fmt.Println(p.Grasna())
15 | }
16 |
17 | func main() {
18 | jojo := model.Ave{}
19 | jojo.Nome = "Jojo da Silva"
20 |
21 | queroAcordarComUmCacarejo(jojo)
22 | queroOuvirUmaPataNoLago(jojo)
23 | }
24 |
--------------------------------------------------------------------------------
/intermediario/interfaces/model/ave.go:
--------------------------------------------------------------------------------
1 | package model
2 |
3 | //Galinha representa uma ave do tipo galinha
4 | type Galinha interface {
5 | Cacareja() string
6 | }
7 |
8 | //Pata representa uma ave do tipo Pato
9 | type Pata interface {
10 | Grasna() string
11 | }
12 |
13 | //Ave representa um animal
14 | type Ave struct {
15 | Nome string
16 | }
17 |
18 | //Cacareja retorna um som emitido por uma galinha
19 | func (a Ave) Cacareja() string {
20 | return "Cócóricó..."
21 | }
22 |
23 | //Grasna retorna o som emitido por uma pata
24 | func (a Ave) Grasna() string {
25 | return "Quack, quack..."
26 | }
27 |
--------------------------------------------------------------------------------
/intermediario/lerarquivos/cidades.csv:
--------------------------------------------------------------------------------
1 | São Paulo/SP,Rio de Janeiro/RJ,João Pessoa/PB,Porto Alegre/RS,Brasília/DF,Cuiabá/MT
--------------------------------------------------------------------------------
/intermediario/lerarquivos/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "encoding/csv"
5 | "fmt"
6 | "os"
7 | )
8 |
9 | func main() {
10 |
11 | arquivo, err := os.Open("cidades.csv")
12 | if err != nil {
13 | fmt.Println("[main] Houve um erro ao abrir o arquivo. Erro: ", err.Error())
14 | return
15 | }
16 |
17 | // scanner := bufio.NewScanner(arquivo)
18 | // for scanner.Scan() {
19 | // linha := scanner.Text()
20 | // fmt.Println("O conteúdo da linha é: ", linha)
21 | // }
22 |
23 | leitorCsv := csv.NewReader(arquivo)
24 | conteudo, err := leitorCsv.ReadAll()
25 | if err != nil {
26 | fmt.Println("[main] Houve um erro ao ler o arquivo com leitor CSV. Erro: ", err.Error())
27 | return
28 | }
29 | for indiceLinha, linha := range conteudo {
30 | fmt.Printf("Linha[%d] é %s\r\n", indiceLinha, linha)
31 | for indiceItem, item := range linha {
32 | fmt.Printf("Item[%d] é %s\r\n", indiceItem, item)
33 | }
34 | }
35 | arquivo.Close()
36 | }
37 |
--------------------------------------------------------------------------------
/intermediario/select/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "time"
6 | )
7 |
8 | var irc = make(chan string)
9 | var sms = make(chan string)
10 |
11 | func pinger(canal chan string) {
12 | for {
13 | canal <- "ping"
14 | }
15 | }
16 |
17 | func ponger(canal chan string) {
18 | for {
19 | canal <- "pong"
20 | }
21 | }
22 |
23 | func eai(canal chan string) {
24 | for {
25 | canal <- "e ai"
26 | }
27 | }
28 |
29 | func blz(canal chan string) {
30 | for {
31 | canal <- "blz"
32 | }
33 | }
34 |
35 | func impressora() {
36 | var msg string
37 | for {
38 | select {
39 | case msg = <-irc:
40 | fmt.Println(msg)
41 | time.Sleep(time.Second * 1)
42 | case msg = <-sms:
43 | fmt.Println("zzz...zzz ", msg)
44 | }
45 | time.Sleep(time.Second * 1)
46 | }
47 | }
48 |
49 | func main() {
50 | go pinger(irc)
51 | go eai(sms)
52 | go ponger(irc)
53 | go blz(sms)
54 | go impressora()
55 |
56 | var entrada string
57 | fmt.Scanln(&entrada)
58 |
59 | }
60 |
--------------------------------------------------------------------------------
/intermediario/slices_basico/esquema-slice.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jeffprestes/cursodego/c5bc6f04dc94e5d36a499711dc65f3a21f5dd94b/intermediario/slices_basico/esquema-slice.png
--------------------------------------------------------------------------------
/intermediario/slices_basico/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import "fmt"
4 |
5 | func main() {
6 | var nums []int
7 | fmt.Println(nums, len(nums), cap(nums))
8 | nums = make([]int, 5)
9 | fmt.Println(nums, len(nums), cap(nums))
10 | capitais := []string{"Lisboa"}
11 | fmt.Println(capitais, len(capitais), cap(capitais))
12 | capitais = append(capitais, "Brasília")
13 | fmt.Println(capitais, len(capitais), cap(capitais))
14 | capitais[1] = "Buenos Aires"
15 | fmt.Println(capitais, len(capitais), cap(capitais))
16 |
17 | cidades := make([]string, 4)
18 | cidades[0] = "Nova York"
19 | cidades[1] = "Londres"
20 | cidades[2] = "Tokio"
21 | cidades[3] = "Singapura"
22 | fmt.Println(cidades, len(cidades), cap(cidades))
23 |
24 | for indice, cidade := range cidades {
25 | fmt.Printf("Cidade[%d] = %s\n\r", indice, cidade)
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/intermediario/slices_parte2/esquema-slice.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jeffprestes/cursodego/c5bc6f04dc94e5d36a499711dc65f3a21f5dd94b/intermediario/slices_parte2/esquema-slice.png
--------------------------------------------------------------------------------
/intermediario/slices_parte2/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import "fmt"
4 |
5 | func main() {
6 | capitais := []string{"Lisboa"}
7 | //fmt.Println(capitais, len(capitais), cap(capitais))
8 | capitais = append(capitais, "Brasília")
9 | //fmt.Println(capitais, len(capitais), cap(capitais))
10 | cidades := make([]string, 5)
11 | cidades[0] = "Nova York"
12 | cidades[1] = "Londres"
13 | cidades[2] = "Madeira"
14 | cidades[3] = "Tokio"
15 | cidades[4] = "Singapura"
16 | //fmt.Println(cidades, len(cidades), cap(cidades))
17 | capitais[1] = "Brasilia"
18 | fmt.Println(capitais, len(capitais), cap(capitais))
19 | for indice, cidade := range cidades {
20 | fmt.Printf("Cidade[%d] = %s\n\r", indice, cidade)
21 | }
22 | //Primeiro item começa com indice 0
23 | //Segundo item começa com o indice 1
24 | capitaisAsia := cidades[3:5]
25 | fmt.Println("Capitais Asia: ", capitaisAsia)
26 | temp1 := cidades[:2]
27 | fmt.Println("Capitais anglo-saxonicas: ", temp1)
28 | temp2 := cidades[len(cidades)-2:]
29 | fmt.Println("Capitais asiaticas 2: ", temp2)
30 | //Madeira não é anglo-saxonica nem asiatica
31 | //Retirar
32 | indiceDoItemARetirar := 2
33 | temp := cidades[:indiceDoItemARetirar]
34 | temp = append(temp, cidades[indiceDoItemARetirar+1:]...)
35 | cidades = make([]string, len(temp))
36 | copy(cidades, temp)
37 | fmt.Println("Novo slice: ", cidades)
38 | }
39 |
--------------------------------------------------------------------------------