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)
}
-----------------------------------------------------------------------------------------------------
如上面有所遗漏或代码有误,请留言。欢迎勘误指正。
©著作权归作者所有:来自51CTO博客作者lpx312的原创作品,如需转载,请注明出处,否则将追究法律责任
g