平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開發(fā),動(dòng)畫培訓(xùn)

manager.go//package mainpackage 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
}

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開發(fā),動(dòng)畫培訓(xùn)

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

首先我們先設(shè)計(jì)一個(gè)結(jié)構(gòu)體用來存儲(chǔ)歌曲的結(jié)構(gòu),上面的musicentry就是,id代表唯一比那好,剩下的故名之意,type是便是類型.mp3.avw

我們接下來通過musicmanager以一種數(shù)組切片的方式進(jìn)行管理

上面的各個(gè)函數(shù)的功能就是正常的add增減remove刪除,get(index),獲得第index首歌曲,len求長度,list列出所有的歌曲

 

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開發(fā),動(dòng)畫培訓(xùn)

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)
}

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開發(fā),動(dòng)畫培訓(xùn)

 

type MP3player struct{
    stat int
    pro int
}

這里我們使用interface接口的形式,我們可以使用一個(gè)接口才處理多種類型的音樂,根據(jù)不同的類型的音樂,去實(shí)現(xiàn)不同的接口就可以了

case "MP3":
            p=&MP3player{}

像上面那樣去賦值,下面通過p.play就可以調(diào)用了,至于paly,這里不能實(shí)現(xiàn)真正的paly,只不過是一種形式罷了

 

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開發(fā),動(dòng)畫培訓(xùn)

package main

import "fmt"import "bufio"import "os"import "smp/mlib"import "strings"import "strconv"import "smp/mp"var lib *mlib.MusicManagervar id int=1var ctrl,signal chan intfunc 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")
        }
        
    }

}

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開發(fā),動(dòng)畫培訓(xùn)

 


上面就是主控制流程,我們這里主要就有兩個(gè)函數(shù),一個(gè)是set主要的功能就是添加歌曲,另一個(gè)主要的功能就是播放,這兩個(gè)功能都是調(diào)用前面的幾個(gè)模塊,我們通過import已經(jīng)導(dǎo)入了

我們從終端輸出,通過readline讀取,并進(jìn)行string強(qiáng)轉(zhuǎn),split就行分割,提取argv,之后我們就可以正常處理了

 

 

下面是這個(gè)小程序的整體結(jié)構(gòu)

 

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開發(fā),動(dòng)畫培訓(xùn)

 

下面是運(yùn)行的情況

 平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開發(fā),動(dòng)畫培訓(xùn)

 http://www.cnblogs.com/13224ACMer/p/7050420.html