• 2.11 Go音乐播放器


    2.11 Go音乐播放器

    使用Go语言设计一个音乐播放器(不带GUI界面)

    实现功能:

    • 音乐库功能,使用者可以查看、添加和删除里面的音乐曲目;

    • 播放音乐;

    • 支持MP3WAV,但也能随时扩展以支持更多的音乐类型;

    • 退出程序。

    程序在运行后进入一个循环,用于监听命令输入的状态。该程序将接受以下命令。

    • 音乐库管理命令:lib,包括list/add/remove命令。

    • 播放管理:play命令,play后带歌曲名参数。

    • 退出程序:q命令。

    设计音乐库类型

    五个属性:

    • 唯一的 ID;

    • 音乐名;

    • 艺术家名;

    • 音乐位置;

    • 音乐文件类型(MP3 和 WAV 等)。

    /* 构建音乐类型结构体 */
    type Music struct {
       Id string
       Name string
       Artist string
       Source string
       Type string
    }

    开始实现音乐库的管理类型模块:

    /*
    使用了一个数组切片作为基础存储结构,其他的操作其实都只是对这个数组切片的包装
    */
    package main

    import "errors"

    /* 构建音乐类型结构体 */
    type Music struct {
       Id string
       Name string
       Artist string
       Source string
       Type string
    }

    //type MusicEntry []string

    /* 实现音乐库的管理类型 */
    /*
    使用了一个数组切片作为基础存储结构,其他的操作其实都只是对这个数组切片的包装
    */
    type MusicManager struct {
       musics []Music
    }

    // 创建音乐库对象
    func NewMusicManager() *MusicManager {
       return &MusicManager{make([]Music, 0)}
    }

    /* 定义音乐库类型下的函数 */
    // 获取音乐库类型下的函数
    func (m *MusicManager) Len() int {
       return len(m.musics)
    }

    // 根据索引获取音乐
    func (m *MusicManager) Get(index int) (music *Music, err error) {
       // 判断形参,手动返回错误内容
       if index < 0 || index >= len(m.musics) {
           return nil, errors.New("索引超过音乐库下标值!")
      }

       // 返回正常的索引结果
       return &m.musics[index], nil
    }

    // 根据名称查找音乐
    func (m *MusicManager) Find(name string) *Music {
       // 判断音乐库是否为空,如果为空则直接返回空
       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 *Music) {
       m.musics = append(m.musics, *music)
    }

    // 删除音乐库中音乐
    func (m *MusicManager) Remove(index int) *Music {
       // 判断索引
       if index < 0 || index > len(m.musics) {
           return nil
      }

       // 根据索引创建删除对象
       removedMusic := &m.musics[index]

       // 从数组切片当中删除
       /*
       1、删除中间元素
       2、删除仅有的一个元素
       3、删除最后一个元素
        */
       if index < len(m.musics)-1 {
           // 中间元素
           m.musics = append(m.musics[:index-1], m.musics[index+1:]...)
      }else if index == 0 {
           // 仅有一个元素
           m.musics = make([]Music, 0)
      }else {
           // 删除最后一个元素
           m.musics = m.musics[:index-1]
      }

       return removedMusic
    }

    音乐播放

    设计并实现音乐播放模块:

    /* 设计一个简单的播放接口 */
    type Player interface {
       Play(source string)
    }

    // 设置一个MP3Player结构体
    type MP3Player struct {
       stat int
       progress int // 进度
    }

    // 设置mp3player实现player接口下的函数
    func (p *MP3Player) Play(source string) {
       fmt.Println("听MP3音乐", source)
       // 设置音乐进度
       p.progress = 0
       // 模拟正在播放
       for p.progress < 100 {
           time.Sleep(100 * time.Millisecond)
           fmt.Println(".")
           p.progress += 10
      }

       fmt.Println("\n结束播放", source)
    }

    // 声明play函数
    func Play(source, mtype string) {
       // 声明一个player类型的变量
       var p Player
       // 设置断言
       switch mtype {
       case "MP3":
           p = &MP3Player{}
       default:
           fmt.Println("未知类型!", mtype)
           return
      }

       // 播放音乐
       p.Play(source)
    }

    主程序

    一个命令行交互程序,用户可以通过输入命令来控制播放过程以及获取播放信息

    func main() {
       fmt.Scanln()
    }

     

  • 相关阅读:
    bootstrap-table 数据表格行内修改
    java文件上传(单文件 多文件)与删除
    bootstrap-table之通用方法( 时间控件,导出,动态下拉框, 表单验证 ,选中与获取信息)
    bootstrap-table 大量字段整体表单上传之时间处理
    Java实习问题记录
    Playbook剧本初识
    自动化运维工具-Ansible基础
    性能优化概述
    Rewrite基本概述
    Nginx常见问题
  • 原文地址:https://www.cnblogs.com/JunkingBoy/p/15944343.html
Copyright © 2020-2023  润新知