go语言编程书上有一些代码有误和遗漏的地方,这里就行了修改与加如了一小段代码。
---开始,我也搜个百度,大多都是一样的,而且在remove代码块还是有些问题(不能是传name)。
好吧!!不多说了.下面展示所有的代码。
------------------------------------------------------------------------------------------------------
先贴入口文件.
mplayer.go
package main import ( "bufio" "fmt" "os" "strconv" "strings" "mplayer/library" //这里是目录结构哦,别放做了,src下的mplayer目录下的library目录 "mplayer/mp" //src下的mplayer目录下的mp目录 ) func handleLibCommands(tokens []string) { if len(tokens) < 2 { fmt.Println(` Enter following commands to control the player: lib list -- View the existing music lib lib add <name><artist><source><type> -- Add a music to the music lib lib remove 序号 -- Remove the specified music from the lib `) return } switch tokens[1] { case "list": fmt.Println("序号 MP3_id 名字 作者 路径 类型") for i := 0; i < lib.Len(); i++ { e, _ := lib.Get(i) fmt.Printf("%-4d %-8s %-10s %-12s %-20s %-5s\n", i+1, e.Id, e.Name, e.Artist, e.Source, e.Type) //fmt.Println(" ", i+1, ":", " ", e.Id, " ", e.Name, " ", e.Artist, " ", e.Source, " ", e.Type) } case "add": { if len(tokens) == 6 { id++ lib.Add(&library.MusicEntry{strconv.Itoa(id), tokens[2], tokens[3], tokens[4], tokens[5]}) } else { fmt.Println("USAGE: lib add <name><artist><source><type>") } } case "remove": if len(tokens) == 3 { index, _ := strconv.Atoi(tokens[2]) //fmt.Println(index) lib.Remove(index) fmt.Println("序号 MP3_id 名字 作者 路径 类型") for i := 0; i < lib.Len(); i++ { e, _ := lib.Get(i) fmt.Printf("%-4d %-8s %-10s %-12s %-20s %-5s\n", i+1, e.Id, e.Name, e.Artist, e.Source, e.Type) } } else { fmt.Println("USAGE: lib remove <id>") } default: fmt.Println("Unrecognized lib command:", tokens[1]) } } func handlePlayCommand(tokens []string) { if len(tokens) != 2 { fmt.Println("USAGE: play <name>") return } e := lib.Find(tokens[1]) if e == nil { fmt.Println("The music", tokens[1], "does not exist.") return } mp.Play(e.Source, e.Type) } var lib *library.MusicManager var id int = 0 func main() { lib = library.NewMusicManager() fmt.Println(` Enter following commands to control the player: lib list -- View the existing music lib lib add <name><artist><source><type> -- Add a music to the music lib lib remove <序号> -- Remove the specified music from the lib play <name> -- Play the specified music q | e -- quit | exit `) r := bufio.NewReader(os.Stdin) for { fmt.Print("Enter command-> ") rawLine, _, _ := r.ReadLine() line := string(rawLine) if line == "q" || line == "e" { break } tokens := strings.Split(line, " ") if tokens[0] == "lib" { handleLibCommands(tokens) } else if tokens[0] == "play" { handlePlayCommand(tokens) } else { fmt.Println("Unrecognized command:", tokens[0]) } } }
manager.go //在mplayer目录下的library目录下
package library import ( "errors" "fmt" ) type MusicEntry struct { Id string Name string Artist string Source string Type string } type MusicManager struct { musics []MusicEntry } func NewMusicManager() *MusicManager { return &MusicManager{make([]MusicEntry, 0)} } func (m *MusicManager) Len() int { return len(m.musics) } func (m *MusicManager) Get(index int) (music *MusicEntry, err error) { if index < 0 || index >= len(m.musics) { return nil, errors.New("Index out of range.") } //fmt.Println(m) return &m.musics[index], nil } func (m *MusicManager) Find(name string) *MusicEntry { if len(m.musics) == 0 { return nil } for _, m := range m.musics { if m.Name == name { return &m } } return nil } func (m *MusicManager) Add(music *MusicEntry) { m.musics = append(m.musics, *music) } func (m *MusicManager) Remove(index int) *MusicEntry { if index < 0 || index > len(m.musics) { fmt.Println("请重新选择删除的序号..") return nil } removedMusic := &m.musics[index-1] // 从数组切片中删除元素 if index < len(m.musics) { // 中间元素 m.musics = append(m.musics[:index-1], m.musics[index:]...) } else { // 删除的是最后一个元素 //fmt.Println("删除最后一个") m.musics = m.musics[:index-1] } return removedMusic }
mp3.go //mplayer 目录下的mp目录
package mp import ( "fmt" "time" ) type MP3Player struct { stat int progress int } type WAVPlayer struct { stat int progress int } func (p *MP3Player) Play(source string) { fmt.Println("Playing MP3 music", source) p.progress = 0 for p.progress < 100 { time.Sleep(100 * time.Millisecond) // 假装正在播放 fmt.Print(".") p.progress += 10 } fmt.Println("\nFinished playing", source) } func (p *WAVPlayer) Play(source string) { fmt.Println("Playing WAV music", source) p.progress = 0 for p.progress < 100 { time.Sleep(100 * time.Millisecond) // 假装正在播放 fmt.Print(".") p.progress += 10 } fmt.Println("\nFinished playing", source) }
play.go //mplayer目录下的mp目录下
package mp import "fmt" type Player interface { Play(source string) } func Play(source, mtype string) { var p Player switch mtype { case "MP3": p = &MP3Player{} case "WAV": p = &WAVPlayer{} default: fmt.Println("Unsupported music type", mtype) return } p.Play(source) }
-----------------------------------------------------------------------------------------------------
如上面有所遗漏或代码有误,请留言。欢迎勘误指正。