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 }
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列出所有的歌曲
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接口的形式,我們可以使用一個(gè)接口才處理多種類型的音樂,根據(jù)不同的類型的音樂,去實(shí)現(xiàn)不同的接口就可以了
case "MP3":
p=&MP3player{}
像上面那樣去賦值,下面通過p.play就可以調(diào)用了,至于paly,這里不能實(shí)現(xiàn)真正的paly,只不過是一種形式罷了
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") } } }
上面就是主控制流程,我們這里主要就有兩個(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)
下面是運(yùn)行的情況
http://www.cnblogs.com/13224ACMer/p/7050420.html