struct e função

108 views
Skip to first unread message

Charles tenorio

unread,
Jun 19, 2016, 6:55:32 AM6/19/16
to Golang Brasil
bom dia! 
tenho três  structs

type Times []struct {
Id     string
Nome   string
Estado string
Pais   string
}

type Campeonatos []struct {
Id        string `json:"id"`
Nome      string `json:"Nome"`
Local     string `json:"Local"`
Temporada string `json:"Temporada"`
}

type Rodadas []struct {
Id              string `json:"id"`
NomeMandante    string `json:"NomeMandante"`
NomeVisitante   string `json:"NomeVisitante"`
Data            string `json:"Data"`
PlacarMandante  string `json:PlacarMandante`
PlacarVisitante string `json:PlacarVisitante`
PeriodoAtual    string `json:PeriodoAtual`
}
ai acesso um webservice preencho elas e salvo no banco de dados. o processo e pegar a url especifica ler jogar nas struct e salvar no banco
gostaria de criar um func e passa como paramento essas struct como faço?

Everton Marques

unread,
Jun 20, 2016, 10:48:21 AM6/20/16
to golang...@googlegroups.com
Por que não uma função similar à seguinte?

func saveIntoDatabase(t Times, c Campeonatos, r Rodadas) error {
// FIXME WRITEME: write into db

return nil // no error
}


--

---
Você recebeu essa mensagem porque está inscrito no grupo "Golang Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para golang-brasi...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

George Moura

unread,
Jun 20, 2016, 11:42:20 AM6/20/16
to golang-brasil
Charles, use um orm para trabalhar com persistência em banco de dados. Eu achei um bem simples que é o gorm - https://github.com/jinzhu/gorm

Uma dica monte suas structs em singular, pq aí tu usa elas como modelos em uma aplicação


George Moura
(71) 98788-6089
Desenvolvedor Web e Mobile

Charles tenorio

unread,
Jun 20, 2016, 4:52:58 PM6/20/16
to Golang Brasil
Everton eu gostaria de passar um dos struct dependendo do que for ser usando tem como?

Arnaldo Mendonça

unread,
Jun 20, 2016, 9:27:19 PM6/20/16
to Golang Brasil
Para salvar em banco, é melhor usar um orm mesmo, mas se vc quiser que uma função possa receber qualquer um dos structs então o parâmetro deve ser do tipo interface{}. Alguma coisa tipo
func functionName(data interface{}) {
...
}

Provavelmente em algum ponto precisará verificar o tipo do "data", nesse caso pode usar type assertion (https://golang.org/doc/effective_go.html#interface_conversions):

campeonato, ok := data.(Campeonato)
if ok {
    fmt.Println(campeonato.Nome)
}

Arnaldo Mendonça Filho

Josue Hennemann

unread,
Jun 22, 2016, 7:06:13 AM6/22/16
to Golang Brasil

Bom dia Charles,

Você pode utilizar uma interface
Onde todas as structs implementam as funções dessas interface

Segue um exemplo no play

https://play.golang.org/p/cafFfi3bcJ


Em domingo, 19 de junho de 2016 07:55:32 UTC-3, Charles tenorio escreveu:

Charles tenorio

unread,
Jun 22, 2016, 8:38:33 AM6/22/16
to Golang Brasil
conseguir obrigado pessoal, 
meu problema agora e outro seguinte

tenho essa struct 

type Campeonatos []struct {
Id        string `json:"id"`
Nome      string `json:"Nome"`
Local     string `json:"Local"`
Temporada string `json:"Temporada"`
}

e essa função

func apiCampeonatos() {

client := &http.Client{}
req, err := http.NewRequest("GET", urlCampeonatos, nil)
if err != nil {
log.Fatalln(err)
}
req.Header.Add("Accept", "application/json")
resp, err := client.Do(req)
if err != nil {
log.Fatalln(err)
}
defer resp.Body.Close()
decoder := json.NewDecoder(resp.Body)
v := new(Campeonatos)
err = decoder.Decode(&v)
if err != nil {
log.Fatalln(err)
}
log.Println(v.Id, v.Nome, v.Estado, v.Pais)
}

da esse erro 
./api.go:88: v.id undefined (type *Campeonatos has no field or method Id)
./api.go:88: v.Nome undefined (type *Campeonatos has no field or method Nome)
./api.go:88: v.Estado undefined (type *Campeonatos has no field or method Estado)
./api.go:88: v.Pais undefined (type *Campeonatos has no field or method Pais)

a gora se eu colocar assim  log.Println(v) funciona! o problema e que preciso pegar os campos pois preciso da um insert em DB. 

Arnaldo Mendonça

unread,
Jun 22, 2016, 9:02:48 AM6/22/16
to Golang Brasil
Então Charles, o tipo que vc definiu é um slice de structs (eu acho), olha a diferença nesse exemplo https://play.golang.org/p/jqci2rnJ7J

Arnaldo Mendonça Filho

--

Charles tenorio

unread,
Jun 22, 2016, 9:11:31 AM6/22/16
to Golang Brasil
sim e um silice de struct gostaria de saber como acessar os valores individualmente.


Em domingo, 19 de junho de 2016 07:55:32 UTC-3, Charles tenorio escreveu:

Arnaldo Mendonça

unread,
Jun 22, 2016, 9:33:11 AM6/22/16
to Golang Brasil
Bom, para resolver o problema é só deferir o ponteiro... (*v)[0].Id, (*v)[0].Name

Mas talvez definir um struct e depois criar um slice desse struct seja uma saída mais elegante

type Campeonato struct{
Nome string
}
str := `[{"Nome": "teste"},{"Nome": "teste2"}]`
json.Unmarshal([]byte(str), &c1)

Arnaldo Mendonça Filho

Charles tenorio

unread,
Jun 22, 2016, 10:26:15 AM6/22/16
to Golang Brasil
opa Arnaldo eu fiz o que vc disse (fmt.Println((*v)[0].Id, (*v)[0].Name, (*v)[0].Estado, (*v)[0].Pais))_ mas tá dando esse erro :
 invalid indirect of v (type Campeonatos)


Em domingo, 19 de junho de 2016 07:55:32 UTC-3, Charles tenorio escreveu:

George Moura

unread,
Jun 22, 2016, 11:58:47 AM6/22/16
to Golang Brasil

Charles coloca suas structs no singular e faz como o Arnaldo falou. Fica mais prático e fácil para usar as structs


--

---
Você recebeu essa mensagem porque está inscrito no grupo "Golang Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para golang-brasi...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.
--
George Moura
(71) 8788-6089

Charles tenorio

unread,
Jun 24, 2016, 5:53:34 PM6/24/16
to Golang Brasil
conseguir assim deu certo

for _, c := range v {
_, err = stmtIns.Exec(c.Id, c.Nome, "2016-01-01", "2016-12-30", "iniciado", 1)
if err != nil {
panic(err.Error())
}

Em domingo, 19 de junho de 2016 07:55:32 UTC-3, Charles tenorio escreveu:

Charles tenorio

unread,
Jun 24, 2016, 5:57:49 PM6/24/16
to Golang Brasil
conseguir assim deu certo

for _, c := range v {
_, err = stmtIns.Exec(c.Id, c.Nome, "2016-01-01", "2016-12-30", "iniciado", 1) // Insert tuples (i, i^2)
if err != nil {
panic(err.Error())
}

Em domingo, 19 de junho de 2016 07:55:32 UTC-3, Charles tenorio escreveu:
Reply all
Reply to author
Forward
0 new messages