zoukankan      html  css  js  c++  java
  • go 接口案例,音乐播放器

    manager.go
    //package main
    package mlib
    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(t_name string) *MusicEntry{
        if len(m.musics) ==0 {
            return nil
        }
        for _,value := range m.musics{
            if value.Name == t_name{
                return &value
            }
        }
        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
        }
    
        removeMusic := &m.musics[index]
    
        m.musics =append ( m.musics[:index],  m.musics[index+1:]...)
        return removeMusic
    }

    type MusicEntry struct {
        Id string
        Name string
        Artist string
        Source string
        Type string
    }

    首先我们先设计一个结构体用来存储歌曲的结构,上面的musicentry就是,id代表唯一比那好,剩下的故名之意,type是便是类型.mp3.avw

    我们接下来通过musicmanager以一种数组切片的方式进行管理

    上面的各个函数的功能就是正常的add增减remove删除,get(index),获得第index首歌曲,len求长度,list列出所有的歌曲

    mp3.go
    package mp
    import "fmt"
    import "time"
    
    type MP3player struct{
        stat int
        pro int
    }
    
    
    func (p *MP3player )Play(source string){
        
    
        p.pro=0;
        fmt.Println("MPS PLAY IS BEGINING")
    
        for p.pro<=100 {
            time.Sleep(100* time.Millisecond)
            fmt.Print(".")
            p.pro+=10    
        }
        fmt.Println("player os ending ",source)
    }
    
    
    
    play.go
    package  mp
    
    import "fmt"
    
    type Player interface{
        Play(source string)
    }
    
    func Play(source ,m_type string){
        var p Player
        switch m_type{
            case "MP3":
                p=&MP3player{}
    
            default :
                fmt.Println("the m_tye is not exits")
                return 
        }
        p.Play(source)
    }

    type MP3player struct{
        stat int
        pro int
    }

    这里我们使用interface接口的形式,我们可以使用一个接口才处理多种类型的音乐,根据不同的类型的音乐,去实现不同的接口就可以了

    case "MP3":
                p=&MP3player{}

    像上面那样去赋值,下面通过p.play就可以调用了,至于paly,这里不能实现真正的paly,只不过是一种形式罢了

    package main
    
    import "fmt"
    import "bufio"
    import "os"
    
    
    import "smp/mlib"
    import "strings"
    import "strconv"
    
    import "smp/mp"
    
    var lib *mlib.MusicManager
    var id int=1
    var ctrl,signal chan int
    func set(tokens[]string){
        switch tokens[1]{
            case "list":
                for i:=0; i<lib.Len();i++{
                    e,_ :=lib.Get(i)
                    fmt.Println(e.Name,e.Artist,e.Source)
                }
            case  "add":
                id++
                if len(tokens)==6{
                    id++
                    lib.Add(&mlib.MusicEntry{strconv.Itoa(id),tokens[2],tokens[3],tokens[4],tokens[5]})
                }else{
                    fmt.Println("tokens number is error")
                }
            default :
                fmt.Println("tokens[1] is error")
        }
    }
    
    
    func musicplay(tokens [] string){
        e :=lib.Find(tokens[1])    
        if e==nil{
            fmt.Println("find failed")
            return 
        }
        mp.Play(e.Source,e.Type)
    }
    
    func main(){
        fmt.Println("***************************************************being*******************************************************")
        lib =mlib.NewMusicManager()
        
        r :=bufio.NewReader(os.Stdin)    
        fmt.Println("forof")
        for {
            rawline,_,_ :=r.ReadLine()
    
            line :=string(rawline)
    
            if line == "q" ||line =="e"{
                break
            }
            fmt.Println("wozhi")
            fmt.Println(len(line))
            fmt.Println(line)
            tokens :=strings.Split(line ," ")
            fmt.Println(tokens)
            if tokens[0] == "lib" {
                set(tokens)
            } else if tokens[0] == "play"{
                musicplay(tokens)
            }else{
                fmt.Println("this is any this stdin")
            }
            
        }
    
    }


    上面就是主控制流程,我们这里主要就有两个函数,一个是set主要的功能就是添加歌曲,另一个主要的功能就是播放,这两个功能都是调用前面的几个模块,我们通过import已经导入了

    我们从终端输出,通过readline读取,并进行string强转,split就行分割,提取argv,之后我们就可以正常处理了

    下面是这个小程序的整体结构

    下面是运行的情况

     

  • 相关阅读:
    如何在Google Map中处理大量标记(ASP.NET)(转)
    MapXtreme在asp.net中的使用之加载地图(转)
    Oracle数据类型与.NET中的对应关系(转)
    GIS-开发例程、源代码、MapXtreme、Map (转)
    Win7 64位系统上配置使用32位的Eclipse(转)
    视频会议十大开源项目排行(转)
    RTMP流媒体播放过程(转)
    python中如何将生成等差数列和等比数列
    python中type dtype astype 的用法
    python类库numpy中常见函数的用法
  • 原文地址:https://www.cnblogs.com/13224ACMer/p/7050420.html
Copyright © 2011-2022 走看看