go语言编程音乐库代码

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)

}

—————————————————————————————————–

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

原创文章,作者:WOMYN,如若转载,请注明出处:https://www.beidanyezhu.com/a/26700.html

(0)
WOMYN的头像WOMYN
上一篇 2025-01-04 19:32:05
下一篇 2025-01-05 11:49:23

相关推荐

  • go语言可以用哪些框架

    go语言使用的框架有:1、Beego框架;2、Buffalo框架;3、Echo框架;4、Gin框架;5、Iris框架;6、Revel框架。 6款好用的go语言web框架: Beeg…

  • go语言怎么引入包

    go语言引入包的方法:可以直接使用【import "包名"】来引入一个包。如果需要同时引入多个包,可以使用【import {"包名" &qu…

    2025-01-07
  • go语言有什么开发工具

    go语言开发工具有:1、GoLand;2、LiteIDE;3、Eclipse。LiteIDE是一款开源、跨平台的轻量级Go语言集成开发环境。 开发工具介绍: 1、GoLand Go…

    2025-01-07
  • yum如何安装go语言

    yum安装go语言的方法:首先执行【yum -y install golang】命令安装go;然后编辑profile文件,配置环境变量;最后执行【source /etc/profi…

  • vscode如何配置go语言开发环境

    Golang 环境配置 1) 首先下载适合你系统的安装包 2)下载完成安装到指定目录即可。我这里是(D:\Go)。 3)配置Glang环境变量 进入我的电脑->高级设置-&g…

    2025-01-07
  • go语言defer怎么用

    go语言defer的用法:1、defer语句在函数返回之前或函数中的return语句之后执行;2、多个defer语句的执行顺序是逆序执行;3、在panic语句后的defer语句不执…

  • windows下如何搭建go语言开发环境

    windows下搭建go语言开发环境的方法:1、在官网下载go语言开发包;2、安装go语言开发包;3、设置GOPATH环境变量;4、测试go开发包是否安装成功。 具体步骤如下: 一…

    2025-01-07
  • go语言的7大优势是什么

    go语言的优势有:1、学习曲线容易;2、开发效率和运行效率高;3、自由高效;4、拥有强大的标准库;5、部署方便;6、高度支持并发性;7、稳定性高。 go语言的优势: 1、学习曲线容…

  • go语言指的是什么

    go语言是一种静态强类型、编译型语言,它的语法与C语言相近。go语言规定每行程序结束后不需要撰写分号,大括号不能够换行放置,if判断式和for循环不需要以小括号包裹。 详细介绍: …

  • go语言适合于什么领域

    go语言适用的领域有:1、服务器编程;2、分布式系统;3、网络编程;4、内存数据库;5、云平台;6、游戏服务端的开发。go语言是一种静态强类型、编译型语言。 Go(又称 Golan…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

分享本页
返回顶部