• GO语言练习:第二个工程--模拟音乐播放器


    1、代码

    2、编译及运行


    1、目录结构

      1.1)

     1 $ tree
     2 .
     3 ├── mplayer.go
     4 └── src
     5     ├── mlib
     6     │   ├── manager.go
     7     │   └── manager_test.go
     8     └── mp
     9         ├── mp3.go
    10         └── play.go

      1.2)mlib库的代码

        1.2.1)manager.go代码

     1 package library
     2 
     3 import "errors"
     4 
     5 type MusicEntry struct {
     6     Id        string
     7     Name    string
     8     Artist    string
     9     Genre    string
    10     Source    string
    11     Type    string
    12 }
    13 
    14 type MusicManager struct {
    15     musics []MusicEntry
    16 }
    17 
    18 func NewMusicManager() * MusicManager {
    19     return &MusicManager {make( []MusicEntry, 0)}
    20 }
    21 
    22 func (m * MusicManager) Len() int {
    23     return len(m.musics);
    24 }
    25 
    26 func (m* MusicManager ) Get(index int) (music * MusicEntry, err error) {
    27     if index < 0 || index >= len(m.musics) {
    28         return nil, errors.New("Index out of range.")
    29     }
    30 
    31     return &m.musics[index], nil
    32 }
    33 
    34 func (m * MusicManager) Find (name string) * MusicEntry {
    35     if len(m.musics) == 0 {
    36         return nil
    37     }
    38 
    39     for _,m := range m.musics {
    40         if m.Name == name {
    41             return &m
    42         }
    43     }
    44     return nil
    45 }
    46 
    47 func (m * MusicManager) Add (music * MusicEntry) {
    48     m.musics = append(m.musics, * music)
    49 }
    50 
    51 func (m * MusicManager) Remove (index int) * MusicEntry {
    52     if index < 0 || index >= len(m.musics) {
    53         return nil
    54     }
    55     removedMusic := &m.musics[index]
    56 
    57     if index < len(m.musics) - 1 {
    58         m.musics = append(m.musics[:index - 1], m.musics[index + 1:]...)
    59     }else if index == 0 {
    60         m.musics = make([]MusicEntry, 0)
    61     } else {
    62         m.musics = m.musics[:index - 1]
    63     }
    64 
    65     return removedMusic
    66 }
    67 
    68 func (m * MusicManager) RemoveByName (name string) * MusicEntry {
    69     var removedMusic * MusicEntry = nil
    70     var iPos int = -1
    71     for i := 0; i < m.Len(); i++ {
    72         if m.musics[i].Name == name {
    73             iPos = i
    74             break
    75         }
    76     }
    77 
    78     if iPos < 0 {
    79         return nil
    80     }
    81 
    82     removedMusic = m.Remove(iPos)
    83 
    84     return removedMusic
    85 }

      1.2.2)manager.go的测试代码manager_test.go

     1 package library
     2 
     3 import (
     4     "testing"
     5 )
     6 
     7 func TestOps(t * testing.T) {
     8     mm := NewMusicManager()
     9     if mm == nil {
    10         t.Error("NewMusicManager faild.");
    11     }
    12     if mm.Len() != 0 {
    13         t.Error("NewMusicManager faild, not empty")
    14     }
    15     m0 := &MusicEntry { "1", "My Heart Will Go On", "Celion Dion", "Pop", "http://qbox.me/24501234", "MP3" }
    16     mm.Add(m0)
    17 
    18     if mm.Len() != 1 {
    19         t.Error("MusicManager.Add faild.")
    20     }
    21 
    22     m := mm.Find(m0.Name)
    23     if m == nil {
    24         t.Error("MusicManager.Find faild")
    25     }
    26 
    27     if    m.Id != m0.Id ||
    28         m.Name != m0.Name ||
    29         m.Artist != m0.Artist ||
    30         m.Genre != m0.Genre ||
    31         m.Source != m0.Source ||
    32         m.Type != m0.Type {
    33             t.Error("MusicManager.Find() faild. Found item mismatch.")
    34     }
    35 
    36     m, err := mm.Get(0)
    37     if m == nil {
    38         t.Error("MusicManager.Get() faild.", err)
    39     }
    40 
    41     m = mm.Remove(0)
    42     if m == nil || mm.Len() != 0 {
    43         t.Error("MusicManager.Remove() faild.", err)
    44     }
    45 }

      1.3)mp库代码

        1.3.1)src/mp/mp3.go代码

     1 package mp
     2 
     3 import (
     4     "fmt"
     5     "time"
     6 )
     7 
     8 type MP3Player struct {
     9     stat int
    10     progress int
    11 }
    12 
    13 type WAVPlayer struct {
    14     stat int
    15     progress int
    16 }
    17 
    18 func (p * MP3Player) Play (source string) {
    19     fmt.Println("Playing MP3 music", source)
    20 
    21     p.progress = 0
    22 
    23     for p.progress < 100 {
    24         time.Sleep(100 * time.Millisecond)
    25         fmt.Print(".")
    26         p.progress += 10
    27     }
    28     fmt.Println("
    Finished playing", source)
    29 }
    30 
    31 func (p * WAVPlayer) Play (source string) {
    32     fmt.Println("Playing WAV music", source)
    33 
    34     p.progress = 0
    35 
    36     for p.progress < 100 {
    37         time.Sleep(100 * time.Millisecond)
    38         fmt.Print(".")
    39         p.progress += 10
    40     }
    41     fmt.Println("
    Finished playing", source)
    42 }

        1.3.2)src/mp/play.go代码

     1 package mp
     2 
     3 import "fmt"
     4 
     5 type Player interface {
     6     Play(source string)
     7 }
     8 
     9 func Play(source, mtype string) {
    10     var p Player
    11 
    12     switch mtype {
    13     case "MP3" :
    14         p = &MP3Player{}
    15     case "WAV" :
    16         p = &WAVPlayer{}
    17         default :
    18         fmt.Println("Unsupported music type", mtype)
    19         return
    20     }
    21     p.Play(source)
    22 }

      1.4)main package模块代码mplayer.go

     1 package main
     2 
     3 import (
     4     "bufio"
     5     "fmt"
     6     "os"
     7     "strconv"
     8     "strings"
     9 
    10     "mlib"
    11     "mp"
    12 )
    13 
    14 var lib * library.MusicManager
    15 var id int = 1
    16 var ctrl, signal chan int
    17 
    18 func handleLibCommands(tokens []string) {
    19     switch tokens[1] {
    20     case "list" :
    21         for i := 0; i < lib.Len(); i++ {
    22             e, _ := lib.Get(i)
    23             fmt.Println(i + 1, ":", e.Name, e.Artist, e.Source, e.Type)
    24         }
    25     case "add" :
    26         if len(tokens) == 7 {
    27             id++
    28             lib.Add(&library.MusicEntry { strconv.Itoa(id), tokens[2], tokens[3], tokens[4], tokens[5], tokens[6] })
    29         } else {
    30             fmt.Println("USAGE : lib add <name><artist><genre><source><type> (7 argv)")
    31         }
    32     case "remove" :
    33         if len(tokens) == 3 {
    34             lib.RemoveByName(tokens[2])
    35         } else {
    36             fmt.Println("USAGE: lib remove <name>")
    37         }
    38         default :
    39         fmt.Println("Unrecogized lib command: ", tokens[1])
    40     }
    41 }
    42 
    43 func handlePlayCommands(tokens []string) {
    44     if len(tokens) != 2 {
    45         fmt.Println("USAGE : play <name>")
    46         return
    47     }
    48 
    49     e := lib.Find(tokens[1])
    50     if e == nil {
    51         fmt.Println("The music", tokens[1], "does not exist.")
    52         return
    53     }
    54 
    55     mp.Play(e.Source, e.Type)
    56 }
    57 
    58 func main() {
    59     fmt.Println(`
    60     Enter following commands to control the player:
    61     lib list --View the existing music lib
    62     lib add <name><artist><genre><source><type> -- Add a music to the music lib
    63     lib remove <name> --Remove the specified music from the lib
    64     play <name> -- Play the specified music
    65     `)
    66     lib = library.NewMusicManager()
    67 
    68     r := bufio.NewReader(os.Stdin)
    69 
    70     for i := 0; i <= 100; i++ {
    71         fmt.Print("Enter command-> ")
    72         rawLine, _, _ := r.ReadLine()
    73 
    74         line := string(rawLine)
    75         if line == "q" || line == "e" {
    76             break
    77         }
    78         tokens := strings.Split(line, " ")
    79 
    80         if tokens[0] == "lib" {
    81             handleLibCommands(tokens)
    82         } else if tokens[0] == "play" {
    83             handlePlayCommands(tokens)
    84         } else {
    85             fmt.Println("Unrecognized command :", tokens[0])
    86         }
    87     }
    88 }

      2)编译及运行

        2.1)设置环境GOPATH

    $ export GOPATH="/home/normal/musicplayer"

        2.2)编译

    1 $ go build

        2.3)查看编译后的目录结构

     1 .
     2 ├── mplayer.go
     3 ├── musicplayer
     4 └── src
     5     ├── mlib
     6     │   ├── manager.go
     7     │   └── manager_test.go
     8     └── mp
     9         ├── mp3.go
    10         └── play.go

        2.4)运行

    $ ./musicplayer 
    
        Enter following commands to control the player:
        lib list --View the existing music lib
        lib add <name><artist><genre><source><type> -- Add a music to the music lib
        lib remove <name> --Remove the specified music from the lib
        play <name> -- Play the specified music
        
    Enter command-> lib add a b c d e
    Enter command-> lib list
    1 : a b d e
    Enter command-> play a
    Unsupported music type e
    Enter command-> lib remove a
    Enter command-> lib add a b c d e MP3
    USAGE : lib add <name><artist><genre><source><type> (7 argv)
    Enter command-> lib add a b c d MP3
    Enter command-> lib list
    1 : a b d MP3
    Enter command-> play a
    Playing MP3 music d
    ..........
    Finished playing d
    Enter command-> q

    注:代码来源《Go语言编程》第三章,代码结构与原书有差别

  • 相关阅读:
    数组
    2017.3.20for
    PHP基础2
    php基础1
    触发器
    SQL储存过程
    范式
    时间戳
    主键和外键
    15 大图轮播
  • 原文地址:https://www.cnblogs.com/fengbohello/p/4642376.html
Copyright © 2020-2023  润新知