learning_go/book_with_bridge/tabwriter/main.go
2025-12-30 21:55:12 +03:00

80 lines
1.6 KiB
Go

package main
import (
"fmt"
"html/template"
// "log"
"os"
"sort"
"text/tabwriter"
"time"
)
type Track struct {
Title string
Artist string
Album string
Year int
Length time.Duration
}
var tracks = []*Track{
{"Go", "Delilah", "From the Roots Up", 2012, length("3m38s")},
{"Go", "Moby", "Moby", 1992, length("3m37s")},
{"Go Ahead", "Alicia Keys", "As I Am", 2007, length("4m36s")},
{"Ready 2 Go", "Martin Solveig", "Smash", 2011, length("4m24s")},
}
var issueList = template.Must(template.New("tracklist").Parse(`
<table>
<tr style='text-align: left'>
<th>#</th>
<th>Title</th>
<th>Artist</th>
<th>Album</th>
</tr>
{{range .}}
<tr>
<td>{{.Title}}</td>
<td>{{.Artist}}</td>
<td>{{.Album}}</td>
</tr>
{{end}}
</table>
`))
func length(s string) time.Duration {
d, err := time.ParseDuration(s)
if err != nil {
panic(s)
}
return d
}
func PrintTracks(tracks []*Track) {
const format = "%v\t%v\t%v\t%v\t%v\n"
tw := tabwriter.NewWriter(os.Stdout,0,8,2,' ',0)
fmt.Fprintf(tw,format,"Title","Artist","Album","Year","Length")
fmt.Fprintf(tw, format, "-----", "------", "-----", "----", "------")
for _, t := range tracks {
fmt.Fprintf(tw,format,t.Title,t.Artist,t.Album,t.Year,t.Length)
}
tw.Flush()
}
type byArtists []*Track
func (x byArtists) Len() int {return len(x)}
func (x byArtists) Less(i,j int) bool {return x[i].Artist < x[j].Artist}
func (x byArtists) Swap(i,j int) { x[i],x[j] = x[j],x[i]}
func main() {
PrintTracks(tracks)
fmt.Println()
sort.Sort(byArtists(tracks))
PrintTracks(tracks)
// if err := issueList.Execute(os.Stdout,tracks); err != nil {
// log.Fatal(err)
// }
}