大家好,学习Go语言的实用代码项音乐播放器相信很多的网友都不是很明白,包括也是一样,不过没有关系,接下来就来为大家分享关于学习Go语言的实用代码项音乐播放器和的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!
主要功能查看、添加和删除里面的音乐曲目播放音乐支持MP3和WAV 可扩展更多音频格式退出程序程序结构
所有源代码都在src 文件夹中。 mplayer中是主程序,mlib中是播放器的控制逻辑,mp中是播放操作的逻辑。
在代码实现中,
代码实现
按照程序结构分为三部分:
主程序增删改查逻辑操作逻辑主程序
主程序中有1个主要功能点:
命令行交互func main() {fmt.Println(‘输入以下命令控制播放器:’ +’lib list — 查看现有音乐库lib add nameartistsourcetype — 添加音乐到音乐库’)lib=mlib. NewMusicManager()r :=bufio.NewReader(os.Stdin) //接收命令行输入for {fmt.Print(‘Enter command- ‘)rawLine, _, _ :=r.ReadLine() //接收命令行输入行:=字符串(rawLine)如果行==’q’ || line==’e’ { //解析命令break}tokens :=strings.Split(line, ‘ ‘)if tokens[0]==’lib ‘ { //解析命令handleLibCommands(tokens)} else if tokens[ 0]==’play’ { //解析命令handleLibCommand(tokens)} else { //解析命令fmt.Println(‘Unrecognized command:’, tokens[0 ])}}} 当是lib 命令时,通过解析第一个参数来确定下一步的增删改查。
func handleLibCommands(tokens []string) {switch tokens[1] {case ‘list’: //列出i:=0 的所有列表; ilib.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(mlib.MusicEntry{strconv.Itoa(id), tokens[2], tokens[3], tokens[4], tokens[5]})} else {fmt.Println(‘USAGE: lib add nameartistsourcetype’)} 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 handleLibCommand(tokens []string) {if len(tokens) !=2 {fmt.Println(‘USAGE: 播放名称’)return}e :=lib.Find(tokens[1])if e==nil {fmt. Println(‘音乐’, tokens[1], ‘不存在。’)return}mp.Play(e.Source, e.Type)}增删改查逻辑
增删改查的逻辑由mlib.MusicManager实现。它由2 部分组成:
成员变量、成员方法、成员变量包含MusicEntry类型的变量
musics []MusicEntryMusicEntry记录了歌曲的一些基本信息。
type MusicEntry struct {Id stringName stringArtist stringSource stringType string}成员方法定义了一系列增删改查的方法:
func (m *MusicManager) Len() int {return len(m.musics)}func (m *MusicManager) Get(index int) (music *MusicEntry, err error) {如果索引0 || index=len(m.musics) {return nil, error.New(‘索引超出范围。’)}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=附加(m.musics, *music)}func (m *MusicManager) 删除(index int) *MusicEntry{如果索引0 ||索引=len(m.musics) {return nil}removedMusic :=m.musics[index] m.musics=附加(m.musics[:index], m.musics[index+1:].) 返回removedMusic} At同时定义了MusicManager的构造函数,其中MusicEntry变量被初始化为0。
func NewMusicManager() *MusicManager {return MusicManager{make([]MusicEntry, 0)}} 操作逻辑由mp.Play实现,其中Player定义了一个接口Play(source string)
type Player 接口{Play(source string)}mp.mp3 和mp.wav 分别完全实现所有Player 接口。因此,Player是继承的。
package mpimport (‘fmt”time’)type MP3Player struct {stat intprogress int}func (p *MP3Player) Play(source string) {fmt.Println(‘播放MP3 音乐’, source)p.progress=0for p.progress 100 {time.Sleep(100 * time.Microsecond)fmt.Println(‘.’)p.progress +=10}fmt.Println(‘\n 播放完毕’, source)}
package mpimport (‘fmt”time’)type WAVPlayer struct {stat intprogress int}func (w *WAVPlayer) Play(source string) {fmt.Println(‘播放WAV音乐’, source)w.progress=0for w.progress 100 {time.Sleep(100 * time.Microsecond)fmt.Println(‘.’)w.progress +=10}fmt.Println(‘\n 播放完毕’, source)}播放器类型变量在mp.Play 时调用Play函数被调用,会按照设置的类型执行。
package mpimport ‘fmt’type 播放器接口{Play(source string)}func Play(source, mtype string) {var p Playerswitch mtype { case ‘MP3’:p=MP3Player{}case ‘WAV’:p=WAVPlayer{}default:fmt.Println (‘不支持的音乐类型’, mtype)return}p.Play(source)}
构建执行
使用go run 执行构建过程:
go run mplayer.go 时会出现命令行交互窗口,提示您按照指定的命令格式操作播放。
原创文章,作者:小su,如若转载,请注明出处:https://www.sudun.com/ask/173563.html
用户评论
如你所愿
这篇文章太棒了!一直想学Go语言,但是总找不到好的入门资源。这个音乐播放器项目真是太好了,边实践边学习,感觉可操作性很强!
有6位网友表示赞同!
陌上花
对这种实战项目很棒!平时看书学习总觉得死板,像这样动手实现实际应用场景的项目,能让人更快掌握Go语言的基础知识和常用库。
有12位网友表示赞同!
揉乱头发
这个音乐播放器项目看起来很有意思啊!我以前用过一些其他语言开发简单的播放器,这次想去尝试一下Go语言的体验。作者写的代码逻辑清晰,注释也很详细,上手应该不难。
有10位网友表示赞同!
可儿
Go语言学习确实需要实践!只是觉得文章略嫌描述简单,缺少一些更深入的技术细节解释。比如对于音频处理和播放库的选择,希望能提供更多建议
有15位网友表示赞同!
羁绊你
做项目太耗时间了~感觉自己一直沉浸在基础概念中都没时间去实践。不过这个音乐播放器项目看着挺不错的,如果能把资源链接放上来直接就能下载使用的话就更好了。
有7位网友表示赞同!
玻璃渣子
Go语言适合这类实战开发,性能强大,而且语法简单易懂!期待看到更多作者分享的Go语言代码案例,可以学习一下它们的架构设计和解决问题的思路。
有5位网友表示赞同!
念旧情i
我也学了点Go语言,做过一些测试用例和小工具。音乐播放器这个项目感觉难度系数有点高,需要用到很多外部库和系统调用,对新人来说可能有些挑战
有16位网友表示赞同!
瑾澜
看了下项目的 GitHub 地址,代码逻辑清晰,而且文档也很完善。我觉得这篇文章很有价值,不仅介绍了Go语言的基本语法,还结合实际项目展示了它的应用场景。
有13位网友表示赞同!
〆mè村姑
其实我更喜欢用Python编写音频处理程序,因为库和插件都非常丰富,开发效率更高。不过也承认Go语言是优秀的系统级编程语言,尤其适合需要高性能的应用场景
有17位网友表示赞同!
涐们的幸福像流星丶
这个音乐播放器项目挺不错啊!感觉可以用来学习一下网络通信和文件操作等知识,还能锻炼自己的编码能力。希望能看到作者更新更多功能,比如增加歌曲列表和播放控制台!
有18位网友表示赞同!
哭着哭着就萌了°
代码注释写的太少了吧?虽然代码逻辑不难理解,但对于一些关键逻辑细节或者算法的实现原理,缺少解释还是会给学习者带来困扰。
有13位网友表示赞同!
在哪跌倒こ就在哪躺下
Go语言确实越来越热门了,特别是随着云计算和容器技术的崛起,它在构建高性能、分布式应用方面表现出色。这个项目可以帮助大家更直观地理解Go语言的特点和优势
有13位网友表示赞同!
醉枫染墨
我觉得这种学习方法非常棒!理论知识只能提供基础框架,只有通过实战项目才能真正掌握编程技巧。这个音乐播放器项目就是一个很好的例子
有17位网友表示赞同!
墨染殇雪
文章写的比较浅显,缺乏对Go语言的核心概念的深入探讨。比如 goroutine 和 channel 的使用场景和特点,希望能有更详细的讲解
有9位网友表示赞同!
雪花ミ飞舞
我一直在寻找适合入门Go语言的实战项目,这个音乐播放器真是太棒了!感谢作者分享这份资源,期待后续能看到更多基于Go语言的精彩代码案例!
有11位网友表示赞同!
孤者何惧
我觉得学习编程语言最重要的还是要注重实践!这个音乐播放器项目看起来很有挑战性,如果能够跟其他人一起合作完成的话,还能锻炼团队协作能力和沟通技巧
有11位网友表示赞同!
像从了良
我比较喜欢用其他语言开发音频应用,因为它们的生态系统更加成熟,工具和库也更为丰富。不过这篇博文让我对Go语言有了更深入的了解,或许以后有机会去尝试它开发一些简单的小项目
有14位网友表示赞同!
妄灸
如果能增加一些声音格式支持以及播放列表的功能的话,这个音乐播放器就更完美了!作者可以考虑在未来的更新中加入这些功能,让项目变得更加实用
有15位网友表示赞同!