一个用go写的模拟mp3文字界面播放程序
2024-08-27 14:08:39
这里的技巧在于学习如何定义数据结构,更新数据结构,在哪里用指针或是地址来更新。
manger.go
package library import "errors" 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.") } 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.musics[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 } func (m *MusicManager) RemoveByName(name string) *MusicEntry { if len(m.musics) == 0 { return nil } for _, m := range m.musics { if m.Name == name { return &m } } return nil }
play.go
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) }
mp3.go
package mp import ( "fmt" "time" ) type MP3Player 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) }
mplayer.go
// SMP project main.go package main import ( "bufio" "fmt" "os" "strconv" "strings" "SMP/mlib" "SMP/mp" ) var lib *library.MusicManager var id int = 1 var ctrl, signal chan int func handleLibCommands(tokens []string) { switch tokens[1] { case "list": for i := 0; i < lib.Len(); i++ { e, _ := lib.Get(i) fmt.Println(i+1, ":", 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 { lib.RemoveByName(tokens[2]) } else { fmt.Println("USAGE: lib remove <name>") } 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) } func main() { 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 <name> -- Remove the specified music from the lib play <name> -- Play the specified music `) lib = library.NewMusicManager() 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]) } } }
最新文章
- web前端面试总结
- WebLogic 中的基本概念
- C++智能指针简单剖析
- 上传文件到hdfs注意事项
- RST_n的问题
- Fork一个仓库
- 实用的透明背景mark图标
- java.util.List org.apache.struts2.components.Form.getValidators(java.lang.String) threw an exception
- Android 开发笔记 “Sqlite数据库删除”
- PHP 14:类的实例
- mosquitto MQTT message broker on ubuntu/debian built from source
- Fortran与C混合编程(转自Ubuntu)
- 《NoSQL精粹》读书笔记
- SpringMvc+Spring+MyBatis 基于注解整合
- Android初级教程理论知识(第七章服务)
- Django1.10 release notes摘编
- java判断一个字符串是否为空,isEmpty和isBlank的区别
- Python入门-用户登录程序升级版
- 关于iframe的相关操作
- 【PAT】B1052 卖个萌(20 分)