前言:
前面敲了那么多,其实并没有什么帮助,一切以实践为主,有一些东西,理解是需要很长时间的,我们要先熟悉再了解。这一篇是完成一个音乐播放器程序(流程).PS:非原创教程,来自于《Go语言编程》,我只是照着边理解边整理。
(1)音乐库功能,使用者可以查看,添加和删除里面的音乐曲目;
(2)播放音乐;
(3)支持mp3和WAV,当然也可以扩展其他音乐类型
正文:
音乐库:
我们首先定义音乐库需要的信息(结构体)
type Music struct{
Id string
Name string
Artist string
Source string
Type sting
}
接下来实现这个音乐库的管理,用一个切片数组用作基础储存结构。
其他操作都是对这个数组切片的包装。
package library
import "errors"
type Music 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 .")
}
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) {
return nil
}
removedMusic := &m.music[index]
//从数组切片中删除元素
if index < len(m.musics)-1 { //中间元素
m.musics = append(m.musics[:index-1], m.musics[index+1:]...)
} else if index == 0 { //删除仅有的一个元素
m.musics = make([]MusicEntry, 0)
} else {
m.musics = m.musics[:index-1]
}
return removedMusic
}
//测试单元部分
package library
import(
"testing"
)
func TestOps(t *testing.T){
mm := NewMusicManager()
if mm==nil {
t.Error("NewMusicManager failed .")
}
if mm.Len() != 0 {
t.Error("NewMusicManager failed,not empty. ")
}
m0 :=&MusicEntry{
"1","My Heart Will Go On","Celion Dion",Pop,"http://qbox.me/262223",MP3
}
mm.Add(m0)
if mm.len() != 1{
t.Error("MusicManager.Add() failed .")
}
m :=mm.Find(m0.Name)
if m == nil{
t.Error("MusicManager.Find() failed .")
}
if m.Id !=m0.Id || m.Artist!=m0.Artist ||m.Name != m0.Name || m.Source !=m0.Source ||m.Type!=m0.Type {
t.Error("MusicManager.Find() failed Found item mismath.")
}
m,err := mm.Get(0)
if m==Remove(0)
if m==nil || mm.len()!=0 {
t.Error("MusicManager.Remove() failed.",err)
}
}
之前,有点小坑写的例子没有跑起来,这次多谢同学帮助,给了我一份代码,看着撸。(PS:好别扭的感觉)。基本功能都能实现。这里我直接发源码连接了。
http://note.youdao.com/yws/public/redirect/share?id=8eca721947f6eceb755946c328953014&type=true
