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)

}

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

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

时间: 2024-11-05 12:34:08

go语言编程音乐库代码的相关文章

C语言编程规范--------10 代码编辑、编译、审查

(1)打开编译器的所有告警开关对程序进行编译. (2)在产品软件(项目组)中,要统一编译开关选项. (3)通过代码走读及审查方式对代码进行检查.代码走读主要是对程序的编程风格如注释.命名等以及编程时易出错的内容进行检查,可由开发人员自己或开发人员交叉的方式进行:代码审查主要是对程序实现的功能及程序的稳定性.安全性.可靠性等进行检查及评审,可通过自审.交叉审核或指定部门抽查等方式进行. (4)测试部测试产品之前,应对代码进行抽查及评审. (5)编写代码时要注意随时保存,并定期备份,防止由于断电.硬

linux下C语言编程动态库so的编写及调用

//test_so.h #include <stdio.h> void test_a(); void test_b(); //test_a.c #include "so_test.h" void test_a() { printf("this is in test_a...\n"); } //test_b.c #include "so_test.h" void test_b() { printf("this is in te

UNIX下C语言编程静态库的生成

1.设计库源码 pr1.c 1 void print1() 2 { 3 printf("This is the first lib src \n"); 4 } pr2.c 1 void print2() 2 { 3 printf("This is the second lib src \n"); 4 } 2.编绎.o文件 gcc -O -c pr1.c pr2.c 3.链接静态库 ar -rsv libpr.a pr1.o pr2.o

UNIX下C语言编程静态库的应用模型

接上篇 (1)调用库函数代码 1 void main() 2 { 3 print1(); 4 print2(); 5 } (2)编绎链接选项 1 gcc -O -o main main.c -L./ -lpr (3)执行目标程序 ./main

C语言编程规范--------11 代码测试、维护

(1)单元测试要求至少达到语句覆盖. (2)单元测试开始要跟踪每一条语句,并观察数据流及变量的变化. (3)清理.整理或优化后的代码要经过审查及测试. (4)代码版本升级要经过严格测试. (5)使用工具软件对代码版本进行维护. (6)正式版本上软件的任何修改都应有详细的文档记录. (7)发现错误立即修改,并且要记录下来. (8)关键的代码在汇编级跟踪. (9)仔细设计并分析测试用例,使测试用例覆盖尽可能多的情况,以提高测试用例的效率. (10)尽可能模拟出程序的各种出错情况,对出错处理代码进行充

《Go语言编程》【2.6.2 defer】章节的代码错误

<Go语言编程>[2.6.2 defer]章节函数CopyFile代码有误,变量dstName并未声明,按照上下文推测应当是笔误,书中代码样式如下: 将dstName改成dst就正确了.

LINUX下C语言编程调用其他函数、链接头文件以及库文件

LINUX下C语言编程经常需要链接其他函数,而其他函数一般都放在另外.c文件中,或者打包放在一个库文件里面,我需要在main函数中调用这些函数,主要有如下几种方法: 1.当需要调用函数的个数比较少时,可以直接在main函数中包含该文件,比如一个文件夹下包含add.c和main.c文件: 方法一: 文件add.c定义两个整数相加的函数,code如下: #include <stdio.h> #include <math.h> int add(int a,int b) { int z;

《Go语言编程》【1.5 工程管理】calc.go的代码错误

最近看由人民邮电出版社许式伟 吕桂华等编著<Go语言编程>[第1章 初识Go语言][1.5 工程管理]时,发现了示例代码calc.go有几处错误,args := os.Args数组变量args[0]代表程序自身,3个if语句len(args)条件判断右值也都小了1,按照书本编写代码运行时将会一直执行Usage()指向的匿名函数,显示如下: USAGE: calc command [arguments] ... The commands are:         add     Addition

C语言开发过程中目标代码文件、可执行文件和库

一.C程序开发的一般流程 1:定义程序的目标,明确程序的功能,明确程序中需要哪些信息.计算和控制,明确程序中应该报告什么信息,不会设计到具体的计算机语言,对于问题的描述一般用的是术语: 2:设计程序,考虑如何通过程序实现程序的目标,具体一点说,需要考虑的可以有用户界面的设计.程序的组织.目标用户的确定以及程序开发时间计划,除了这些,好需要确定是在程序中(也有可能是在辅助文件中)数据的表示形式以及数据的处理方法.这个阶段,不会用到具体的代码.问题的描述用的是一般术语,但是不排除某些决策会和具体的语