├── 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 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 | --------------------------------------------------------------------------------