Jako początkujący użytkownik Go, mam problemy ze zrozumieniem io.Writer
.io.Writer in Go - początkujący próbuje je zrozumieć
Mój cel: weź strukturę i zapisz ją w pliku json.
Podejście:
- użyj encoding/json.Marshal
przekonwertować struct w bajtach
- nakarmić te bajty do os.File
Writer
To jak mam to działa:
package main
import (
"os"
"encoding/json"
)
type Person struct {
Name string
Age uint
Occupation []string
}
func MakeBytes(p Person) []byte {
b, _ := json.Marshal(p)
return b
}
func main() {
gandalf := Person{
"Gandalf",
56,
[]string{"sourcerer", "foo fighter"},
}
myFile, err := os.Create("output1.json")
if err != nil {
panic(err)
}
myBytes := MakeBytes(gandalf)
myFile.Write(myBytes)
}
Po przeczytaniu this article, Zmieniłem program na:
package main
import (
"io"
"os"
"encoding/json"
)
type Person struct {
Name string
Age uint
Occupation []string
}
// Correct name for this function would be simply Write
// but I use WriteToFile for my understanding
func (p *Person) WriteToFile(w io.Writer) {
b, _ := json.Marshal(*p)
w.Write(b)
}
func main() {
gandalf := Person{
"Gandalf",
56,
[]string{"sourcerer", "foo fighter"},
}
myFile, err := os.Create("output2.json")
if err != nil {
panic(err)
}
gandalf.WriteToFile(myFile)
}
Moim zdaniem, pierwszy przykład jest prostszy i łatwiejszy do zrozumienia dla początkującego ... ale mam wrażenie, że drugim przykładem jest idiomatyczny sposób osiągnięcia celu.
Pytania:
1. Czy powyższe założenie jest poprawne (ta druga opcja to Idiomatyczna)?
2. Czy jest różnica w powyższych opcjach? Która opcja jest lepsza?
3. inne sposoby osiągnięcia tego samego celu?
Dziękuję
WM