go语言编程书上有一些代码有误和遗漏的地方,这里就行了修改与加如了一小段代码。

---开始,我也搜个百度,大多都是一样的,而且在remove代码块还是有些问题(不能是传name)。

好吧!!不多说了.下面展示所有的代码。

------------------------------------------------------------------------------------------------------

先贴入口文件.

mplayer.go

package mainimport (    "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 
 -- 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 
")            }        }    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 
")        }    default:        fmt.Println("Unrecognized lib command:", tokens[1])    }}func handlePlayCommand(tokens []string) {    if len(tokens) != 2 {        fmt.Println("USAGE: play 
")        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.MusicManagervar id int = 0func main() {    lib = library.NewMusicManager()    fmt.Println(`       Enter following commands to control the player:       lib list -- View the existing music lib       lib add 
 -- Add a music to the music lib       lib remove 
<序号>
 -- Remove the specified music from the lib       play 
 -- 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 libraryimport (    "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 mpimport (    "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 mpimport "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)}

-----------------------------------------------------------------------------------------------------

如上面有所遗漏或代码有误,请留言。欢迎勘误指正。