GO语言(六)接口使用

时间:2021-12-01 08:13:14

<music>

  |------<src>

       |-------<library>

            |-------manager.go

            |-------manager_test.go

       |-------<play>

            |-------play.go

            |-------mp3.go

            |-------wav.go

       |--------<music>

            |-------mplayer.go

  |------<pkg>

  |------<bin>

------------------------------------------------------------------------------------

library:音乐库文件所在目录

[manager.go]

 package  library

 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, )}
} func (m *MusicManager) Len() int {
return len(m.musics)
} func (m *MusicManager) Get(index int) (music *MusicEntry, err error) {
if index < || index >= len(m.musics) {
return nil, errors.New("Index out of range.")
}
return &m.musics[index], nil
} func (m *MusicManager) Find(name string) *MusicEntry {
if len(m.musics)== {
return nil
} for _,mm := range m.musics {
if mm.Name == name {
return &mm
}
}
return nil
} func (m *MusicManager)Add(music *MusicEntry) {
m.musics = append(m.musics, *music)
} func (m *MusicManager)Remove(index int) *MusicEntry {
if index< || index >= len(m.musics) {
return nil
} removedMusic := &m.musics[index] if index < len(m.musics)- {
m.musics = append(m.musics[:index-], m.musics[index+:]...)
} else if index == {
m.musics = make([]MusicEntry, )
}else {
m.musics = m.musics[:index-]
}
return removedMusic
}

[manager_test.go]

 package library

 import (
"testing"
) func TestOps(t *testing.T) {
mm := NewMusicManager()
if mm == nil {
t.Error("NewMusicManager() failed.")
}
m0 := &MusicEntry {"", "Cellion Dion", "My Heart Will Go On", "http://qbox.me/24501234", "MP3" }
mm.Add(m0) if mm.Len() != {
t.Error("MusicManager.Add() failed.")
} m := mm.Find(m0.Name) if m == nil {
t.Error("MusicManager.Find() failed.")
} if m.Id != m0.Id || m.Artist != m0.Artist || m.Name != m0.Name || m.Source != m0.Source || m.Type != m0.Type {
t.Error("MusicManager.Find() failed. Found item mismatch.")
} m, err := mm.Get() if m == nil {
t.Error("MusicManager.Get() failed.", err)
} m = mm.Remove()
if m == nil || mm.Len() != {
t.Error("MusicManager.Remove() failed.", err)
}
}

play:各种音乐类型存放库

[play.go]

 package play

 import "fmt"

 type Player interface {
Play(source string)
} func Play(source, mtype string) {
var p Player
switch mtype {
case "MP3":
p = &MP3Player{}
case "WAV":
p = &WAVPlayer{}
default:
fmt.Println("Unsupported music type", mtype)
return
}
p.Play(source)
}

[mp3.go]

 package play

 import (
"fmt"
"time"
) type MP3Player struct {
stat int
progress int
} func (p *MP3Player)Play(source string) {
fmt.Println("Playing MP3 music", source) p.progress = for p.progress < {
time.Sleep(*time.Millisecond)
fmt.Print(".")
p.progress +=
} fmt.Println("\nFinished playing", source)
}

[wav.go]

 package play

 import (
"fmt"
"time"
) type WAVPlayer struct {
stat int
progress int
} func (p *WAVPlayer) Play(source string) {
fmt.Println("Playing WAV music", source) p.progress = for p.progress < {
time.Sleep(*time.Millisecond)
fmt.Print(".")
p.progress +=
} fmt.Println("\nFinished playing", source)
}

music:主程序的放在处

[mplayer.go]

 package main

 import  (
"bufio"
"fmt"
"os"
"strconv"
"strings"
"play"
"library"
) var lib *library.MusicManager
var id int =
var ctrl, signal chan int func handleLibCommands(tokens []string) {
switch tokens[] {
case "list" :
for i:=; i<lib.Len(); i++ {
e,_ := lib.Get(i)
fmt.Println(i+, ":", e.Name, e.Artist, e.Source, e.Type)
}
case "add":
if len(tokens) == {
id++
lib.Add(&library.MusicEntry{string(strconv.Itoa(id)),tokens[],tokens[],tokens[],tokens[]})
}else {
fmt.Println("USAGE: library add <name><artist><source><type>")
}
case "remove":
if len(tokens) == {
lib.Remove() // 有问题
} else {
fmt.Println("USAGE: library remove <name>")
}
default:
fmt.Println("Unrecongnized library command:", tokens[])
}
} func handlePlayCommands(tokens []string) {
if len(tokens) != {
fmt.Println("USAGE: play <name>")
return
} e := lib.Find(tokens[]) if e == nil {
fmt.Println("The music", tokens[], "does not exist.")
return
} play.Play(e.Source, e.Type)
} func main() {
fmt.Println(`
Enter following commands to control the player:
lib add <name><artist><source><type>
lib remove <name>
play <name>
`) lib = library.NewMusicManager() r := bufio.NewReader(os.Stdin) for {
fmt.Println("Enter command->") rawLine,_,_ := r.ReadLine() line := string(rawLine) if line == "q" || line == "e" {
break
} tokens := strings.Split(line, " ") if tokens[] == "lib" {
handleLibCommands(tokens)
}else if tokens[] == "play" {
handlePlayCommands(tokens)
}else {
fmt.Println("Unrecongnized command:", tokens[])
}
}
}

;之后,返回到music目录节点,执行如下命令:

go build library

go build play

go build music

go test library

go install library

go install play

go install music

--------------------------------------------------------------------

接口使用的感受:

  1、类似于C++中虚基类的作用,作为一个消费者的接口,用于接收生产者设计的方法;

  2、生产者设计也简单,只需要实现接口中的方法就算设计了接口【无需如C++的,还需要继承】;

  3、使用简单,设计也简单;

GO语言(六)接口使用的更多相关文章

  1. R语言数据接口

    R语言数据接口 R语言处理的数据一般从外部导入,因此需要数据接口来读取各种格式化的数据 CSV # 获得data是一个数据帧 data = read.csv("input.csv" ...

  2. &lbrack;日常&rsqb; Go语言圣经--接口约定习题

    Go语言圣经-接口1.接口类型是对其它类型行为的抽象和概括2.Go语言中接口类型的独特之处在于它是满足隐式实现的3.Go语言中还存在着另外一种类型:接口类型.接口类型是一种抽象的类型4.一个类型可以自 ...

  3. FFI (语言交互接口&lpar;Foreign Function Interface&rpar;)

    FFI(Foreign Function Interface)是用来与其它语言交互的接口, 在有些语言里面称为语言绑定(language bindings), Java 里面一般称为 JNI(Java ...

  4. python语言&lpar;六&rpar;mock接口开发、发邮件、写日志、新Excel操作

    一.urllib模块 urllib模块是一个标准模块,直接import urllib即可,在python3里面只有urllib模块,在python2里面有urllib模块和urllib2模块. url ...

  5. C语言原子接口与实现

    原子是一个指向唯一的.不可变的0个或任意多个字节序列的指针,大多数原子都是指向以空字符结束的字符串,但是任何一个指向任意字节序列的指针都可以使原子.任何原子只能出现一次.如果两个原子指向同一个内存单元 ...

  6. c语言调试接口

    http://blog.chinaunix.net/uid-10106787-id-2985587.html 在C语言程序设计中,常会出现各种各样的bug:段错误.参数异常等等.我们需要尽快定位错误, ...

  7. Java语言Socket接口用法详解

    Socket接口用法详解   在Java中,基于TCP协议实现网络通信的类有两个,在客户端的Socket类和在服务器端的ServerSocket类,ServerSocket类的功能是建立一个Serve ...

  8. Go语言的接口

    一.接口的定义和好处 我们都知道接口给类提供了一种多态的机制,什么是多态,多态就是系统根据类型的具体实现完成不同的行为. 以下代码简单说明了接口的作用 package main import ( &q ...

  9. go语言学习-接口

    Go语言中虽然没有传统面向对象语言中类.集成的概念,不过提供了接口的支持,可以使用接口来使用一些面向对象的特性. 在 go 语言中,的接口有下面几个特点: 可以包含0个或多个方法的签名 只定义方法的签 ...

  10. Go语言的接口interface、struct和组合、继承

    Go语言的interface概念相对于C++中的基类,通过interface来实现多态功能. 在C++中,当需要实现多态功能时,步骤是首先定义一个基类,该基类使用虚函数或者纯虚函数抽象了所有子类会用到 ...

随机推荐

  1. hive中的一种假NULL现象

    使用hive时,我们偶尔会遇到这样的问题,当你将结果输出到屏幕时,查出的数据往往显示为null,但是当你将结果输出到文本时,却显示为空(即未填充),这是为什么呢? 在hive中有一种假NULL,它看起 ...

  2. POJ1154

    LETTERS Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 8119   Accepted: 3661 Descripti ...

  3. &lbrack;poj 3261&rsqb;Milk Patterns

    后缀数组搞一下就可以了喵~ 其实这道题的第一个想法是 SAM ,建完后缀自动机后拓扑排序跑一遍统计下每个子串的出现次数就 O(N) 就妥妥过掉了 后缀树也是 O(N) 的,统计一下每个节点对应的子树中 ...

  4. 黑金开发板上开发的PWM

    /*自己做的PWM程序*2014-01-09*/module pwm(clk,rst,led);input clk,rst;output [7:0] led;parameter T=31'd20000 ...

  5. 微软开发者大会:VS 2019 Preview 发布;Windows UX 主要技术开源

    美国当地时间12月4日,微软正式举行 Microsoft Connect(); 2018 开发者大会,本次大会的 slogan 是"Build the apps of tomorrow, t ...

  6. Cheat Engine(简称CE)初体验

    经常玩一些单机游戏,如CS.植物大战僵尸,,这几天刚好网上看到有人用CE修改内存,直接修改内存数据. 之前没有玩过此类东西,激动不已,于是自己也动手写了几行代码, 实现了CS子弹无限制,血量无限,阳光 ...

  7. duilib窗口从任务栏恢复问题

    关闭.最大最小化和恢复等消息由WM_SYSCOMMAND和OnSysCommand()进行处理,需要在HandleMessage()中添加处理.

  8. (转)HashMap底层实现原理&sol;HashMap与HashTable区别&sol;HashMap与HashSet区别

    ①HashMap的工作原理 HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象.当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算h ...

  9. vue:一个vue可以使用的视频插件

    网址:https://www.jianshu.com/p/e8e747e33ef0 1:安装依赖 npm install vue-video-player -S 2:引入配置(main.js) imp ...

  10. JS自学大全

    JS是从上往下执行的 console.log();输出语句console.warn();错误提示语句 黄色三角形感叹号console.error();错误提示 红色圆Xalert();弹窗docume ...