您的位置:首页 > 编程语言 > Go语言

go语言编程音乐库代码

2016-01-18 11:01 495 查看
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)

}


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

本文出自 “Goooood” 博客,请务必保留此出处http://goooood.blog.51cto.com/5060201/1736072
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: