Go语言中文网 为您找到相关结果 55

golang select 退出结束goroutine

开启了多个协程 其中一个协程满足条件后终止select, 原以为其他的协程会在后台系统中继续悄悄运行 直到主进程关闭而关闭 。 做一实验发现select 监听退出 会关闭所有监听的goroutine package main import ( "fmt" "time" ) var stop bool = false func main() { ch := make(chan int, 0) ch2 := make(chan int, 0) defer func() { close(ch) close(ch2) }() go func() { ch <- 1 }() for i := 0; i <= 20; i++ { go func(ch2 chan int) { for { fmt.Pri...阅读全文

博文 2015-01-22 13:00:01 wangxusummer

golang 监听端口

package main import ( "fmt" "log" "net" "bufio" "io" ) func handleConnection(conn net.Conn) { br := bufio.NewReader(conn) for{ data, err := br.ReadString('\n') if err == io.EOF{ break } fmt.Printf("%s", data) fmt.Fprintf(conn, "OK\n") } conn.Close() } func main() { ln, err := net.Listen("tcp", ":8092") if err != nil { panic(err) } for { conn, err :...阅读全文

博文 2015-06-17 20:17:47 cauckfgf

golang中os/signal包的使用

os/signal包实现对信号的处理 golang中对信号的处理主要使用os/signal包中的两个方法:一个是notify方法用来监听收到的信号;一个是 stop方法用来取消监听。 func Notify(c chan<- os.Signal, sig ...os.Signal) func Notify(c chan<- os.Signal, sig ...os.Signal)第一个参数表示接收信号的channel, 第二个及后面的参数表示设置要监听的信号,如果不设置表示监听所有的信号。 func main() { c := make(chan os.Signal, 0) signal.Notify(c) // Block until a signal is received. s := ...阅读全文

博文 2015-06-17 20:03:59 chenbaoke

Golang-设置系统时间

// 接收UDP时间广播,并设置系统时间 func (sl *Slaver) masTimeSync(ch chan int) { // 开始监听广播时间 log.Printf("time sync listen [%s]", sl.Node.Port.PortUdpSlaTimeSync) for { (func() { // 监听 mas 发来的同步时间 lis, err := socket.NewListen("", sl.Node.Port.PortUdpSlaTimeSync, 3).ListenUDP() // 判断监听是否建立成功 if err != nil { // 异常抛出 log.Fatalln(err) } // 保证监听正常关闭 defer lis.Close() /...阅读全文

博文 2015-03-03 21:41:22 nulijiabei

beego中https监听端口冲突的问题

在开发的项目中因为安全性,需要支持https,所以在conf中增加了如下设置: EnableHttpTLS = true HttpsPort = 8888 HttpCertFile = ./server.crt HttpKeyFile = ./server.key 运行后发现第一次可以顺利运行,后面就会发生错误 [C] ListenAndServeTLS: %!(EXTRA *net.OpError=listen tcp :8888: bind: address already in use) 从错误提示来看,是端口被占用了 这个错误不知道怎么破了,或者还有参数需要设置? 哪位大大指点一下...阅读全文

关于Go语言daemon启动的方法.

昨天搞了个文件共享的小程序,遇见了意见蛋疼的事,就是启动之后终端不能关闭,不然程序也会随着关闭. 我的解决方法: nohup ./httpserver & nohup这个命令可以把程序放后台运行,顺便通过1>和2>把标准输出和标准错误重定向到文件,这样程序崩溃时才会有记录可查,这两者和程序的日志最好是分开,混在一起没办法判断轻重缓急: nohup ./server 1> server.out 2> server.err 进程启动时候记录下自己的pid: if pid := syscall.Getpid(); pid != 1 { ioutil.WriteFile("server.pid", []byte(strconv.Itoa(pid)), 0777) defer os.Remove("s...阅读全文

博文 2016-01-05 20:00:00 fyxichen

golang信号signal的处理

在实际项目中我们修改了配置文件后,希望在不重启进程的情况下重新加载配置文件,这时候就需要通过信号传递来进行处理了。golang中对信号的处理主要使用os/signal包中的两个方法:一个是notify方法用来监听收到的信号;一个是 stop方法用来取消监听。下面给一个些示例。 监听信号 notify方法原型 func Notify(c chan<- os.Signal, sig ...os.Signal) 第一个参数表示接收信号的管道 第二个及后面的参数表示设置要监听的信号,如果不设置表示监听所有的信号。 package main import ( "fmt" "os" "os/signal" //"syscall" ) func main() { c := make(chan os.Sig...阅读全文

博文 2015-10-14 14:27:22 陈杰斌

基于go+protobuf实现的多种持久化方案的mq框架:kiteq

基于go+protobuf实现的多种持久化方案的mq框架:kiteq gitlab上发现一个比较好的开源项目,特此介绍: 简介 * 基于zk维护发送方、订阅方、broker订阅发送关系、支持水平、垂直方面的扩展 * 基于与topic以及第二级messageType订阅消息 * 基于mysql、文件存储方式多重持久层消息存储 * 保证可靠异步投递 * 支持两阶段提交分布式事务 工程结构 kiteq/ ├── README.md ├── binding 订阅关系管理处理跟ZK的交互 ├── build.sh 安装脚本 ├── client KiteQ的客户端 ├── doc 文档 ├── handler KiteQ所需要的处理Handler ├── kite_benchmark.go KiteQ...阅读全文

博文 2015-06-18 09:02:12 chenglinhust

GO ZK WATCH监听

package main import ( "fmt" "github.com/samuel/go-zookeeper/zk" "strings" "time" ) func must(err error) { if err != nil { panic(err) } } func connect() *zk.Conn { servers := strings.Split("127.0.0.1:2181", ",") conn, _, err := zk.Connect(servers, time.Second) must(err) return conn } func mirror(conn *zk.Conn, path string) (chan []string, chan error...阅读全文

博文 2016-07-13 13:00:06 mingzhehaolove

go 是怎么运行web服务的?

我现在电脑上已经有一个apache了,在网上看了一下视频 ,go运行web服务在本地也是localhost ,那么不是已经和我的apache有冲突了,不知道这个问题要怎么解决,难道是要修改监听的端口吗?刚刚开始学习go的开发,还不是很了解, 麻烦各位高手指定一下,或者是提示一下,我应该去看那一方面的资料,谢谢了,,,...阅读全文

golang 关于 select,for cpu 100%

for 如果for循环体一直处于繁忙状态,则cpu被一直抢占,而cpu居高不下,如果循环体有io等待则会出让cpu,不会一直抢占 select 监听各case的io事件,各case必须都是 chan,一旦有一个case触发io则执行case块 如果没有default,则select会被一直阻塞,如果有default,则在没有io事件时,直接执行default块,退出select for select 在有default的情况下,很容易造成类似for死循环 抢占cpu的情...阅读全文

博文 2016-03-30 10:00:06 wolgame

Golang——net/http

构建一个web 在浏览器输入http://localhost:8080 import ( "net/http" "fmt" "log" ) func sayhelloGolang(w http.ResponseWriter, r *http.Request) { r.ParseForm() //解析参数,默认是不会解析的 fmt.Println("path", r.URL.Path) w.Write([]byte("Hello Golang")) } func main() { http.HandleFunc("/", sayhelloGolang) //设置访问的路由 err := http.ListenAndServe(":8080", nil) //设置监听的端口 if err != ...阅读全文

博文 2018-08-23 21:34:58 巴翔

javaer to go之TCP Socket与Goroutine

1、前言 其实我前面一篇笔记的例子就是socket的一个例子,但是由于大部分的笔记说明都是在整理基础的东西,所以socket的笔记单独列在这里。 server.go package socket import ( "fmt" "net" ) func StartServer() { service := ":3338" tcpAddr, err := net.ResolveTCPAddr("tcp4", service) checkError(err) listener, err := net.ListenTCP("tcp", tcpAddr) checkError(err) for { conn, err := listener.Accept() if err != nil { conti...阅读全文

博文 2016-05-31 17:00:00 p_3er

golang版本的通用时间轮 Timewheel

一个通用的timewheel工具类 通用粗精度的timewheel,只启动一个timer,可监听任意多的到期时间,放入的用户数据可以是任何类型。 接口说明: 1. Start: 开始一个timewheel ; 2. SetCallback: 设置时间到期时的回调函数,回调函数中不可作过于耗时的操作,以免卡住timewheel的正常运行; 3. Add: 添加需要监控的对象,务必在Start调用后再调用此接口; 4. Stop: 停止此timewhee...阅读全文

iOS中键值编码KVC及键值监听KVO的操作方法

![one_20140630080614003.jpg](http://studygolang.qiniudn.com/151225/d6447da995f86fff419b50ed0237d7dd.jpg) 在iOS开发中,我们常常用到键值编码KVC和键值监听KVO两个东东,今天小编和大家分享的就是这两个东东在应用开发中的具体用法。下面是小编在网上看到的一位大牛写的,灰常不错的有关KVC和KVO 的介绍,既然大牛都写得这么详细了,我们就直接借鉴借鉴吧。 键值编码KVC KVC的操作方法由NSKeyValueCoding协议提供,而NSObject就实现了这个协议,也就是说objective-c语言中几乎所有的对象都支持KVC操作,常用的KVC操作方法如下: 1、动态...阅读全文

golang select 小结

select 介绍 从不同并发执行的协程中,获取数据可以用select来完成。select监听的多个通道,也可以用通道发送数值。 select { // 接收数据 case u:= <- ch1: ... // 发送数据 case v:= <- ch2: ... ... default: // no value ready to be received ... } select 基本用法 1、如果多个通道都阻塞了,会等待知道其中一个通道可以处理。 2、如果多个通道都可以处理,随机选取一个处理。 3、如果没有通道操作可以操作并且写了default语句,会执行:default(永远是可以运行的) 4、如果防止select堵塞,可以写default来确保发送不被堵塞,没有case的select就会...阅读全文

关于select的无法退出的问题

想实现一个主程序在监听多个channel的练习。如下,我理解只输出一次就会退出,但是实际上,似乎跑了个死循环,问题出在哪里? ```golang package main import ( "fmt" "time" ) func put(c chan<- string, msg string) { time.Sleep(time.Second * 1) //for i := 1; i < 10; i++ { c <- msg //} close(c) } func main() { c1 := make(chan strin...阅读全文

静态博客生成器CHCA

一个使用 golang 开发的博客生成器。 chca init 用于初始化博客,会自动生成config.yml 初始化以后需要在config.yml文件同目录下创建theme文件夹用于存放模板文件 模板文件夹结构 blog 模版文件夹 -- assets 资源文件夹 -- -- css -- -- js -- layout 布局文件夹 -- -- main.html 公共布局 -- -- index.html 主页 -- -- post.html 文章页 -- -- archive.html 导航导航页 -- -- category.html 分类导航页 -- -- tag.html 标签导航页 -- -- page.html 标签、导航和分类列表页面 新建m...阅读全文

用于保护 tcp 流量的安全隧道shadowtunnel

shadowtunnel 是一款可以在你本地机器和远程服务直接建立安全的加密隧道,保护你的 tcp 流量,能高效压缩传输,流量无特征。 local machine <----> shadowtunnel <---> service on remote. 1.http 代理 假设有一个 vps,它的 IP 是 2.2.2.2 首先在 2.2.2.2 启动一个 http 代理 然后下载 http 代理程序,使用 root 权限在 vps 上执行下面的命令: `wget https://github.com/snail007/goproxy/releases/download/v4.9/proxy-linux-amd64.tar.gz &&...阅读全文

开源项目 2018-06-19 16:30:00 网友

golang中net包用法

func Listen(net, laddr string) (Listener, error) //返回在一个本地网络地址laddr上监听的Listener。网络类型参数net必须是面向流的网络:"tcp"、"tcp4"、"tcp6"、"unix"或"unixpacket"。具体参见Dial函数获取laddr的语法。 type Listener //Listener是一个用于面向流的网络协议的公用的网络监听器接口。多个线程可能会同时调用一个Listener的方法。 type Listener interface { Accept() (c Conn, err error)//等待并返回下一个连接到该连接的连接 Close() error //关闭listener,关闭后,任何阻塞accep...阅读全文

博文 2016-09-10 17:00:01 hellochenlu

golang同时监听TCP、HTTP端口提供服务

项目入口 main.go 中,之前是监听 TCP 连接,代码大致如下: package main import ( "fmt" "net" "net/http" ) func main() { http.HandleFunc("/hi", Router) go http.ListenAndServe("127.0.0.1:8080", nil) server, err := net.Listen("tcp", "127.0.0.1:9090") if err != nil { panic(err) } defer server.Close() for { conn, err := server.Accept() if err != nil { continue } go handleConn...阅读全文

博文 2019-04-14 22:34:42 faunjoe

CHAOS-简单实用的后门生成工具

CHAOS是一款非常简单实用的后门生成和监听工具,GitHub传送门 由于CHAOS是用Go语言编写的,因此第一步要安装Golang和UPX package,后者可以自动给生成的后门程序加上UPX的壳 root权限运行 apt install golang upx-ucl -y 拉取项目到本地 git clone https://github.com/tiagorlampert/CHAOS.git 运行 cd CHAOS/ go run CHAOS.go 进入下面的界面 可以看到有五个参数,第一个是本机IP地址,第二个是监听的端口,第三个是后门的名字,第四个询问是否加UPX壳,建议加上,有利于免杀,最后是询问是否现在开始监听,选择Y 可以看到开始监听,此时我们将CHAOS目录中的backdo...阅读全文

博文 2018-09-15 01:34:40 TryHard3r

Go 程序热编译工具gowatch

Go 程序热编译工具,提升开发效率 通过监听当前目录下的相关文件变动,进行实时编译 安装完成之后,即可使用`gowatch`命令,在当前文件执行 大部分情况下,不需要更改配置,直接执行`gowatch`命令就能满足的大部分的需要,但是也提供了一些配置用于自定义,在执行目录下创建`gowatch.yml`文件,支持的配置如下...阅读全文

Go语言备忘录(3):net/http包的使用模式和源码解析

本文是晚辈对net/http包的一点浅显的理解,文中如有错误的地方请前辈们指出,以免误导! 转摘本文也请注明出处:Go语言备忘录(3):net/http包的使用模式和源码解析,多谢! 目录: 一、http包的3个关键类型 二、HTTP服务器的使用模式 三、HTTP服务器的执行过程 四、重定向 五、客户端的实现 一、http包的3个关键类型:Handler接口:所有请求的处理器、路由ServeMux都满足该接口; type Handler interface { ServeHTTP(ResponseWriter, *Request) } ServeMux结构体:HTTP请求的多路转接器(路由),它负责将每一个接收到的请求的URL与一个注册模式的列表进行匹配,并调用和URL最匹配的模式的处理器。...阅读全文

博文 2017-10-20 08:07:53 susufufu

如何优雅的关闭net.Listeners

使用golang做网络应用时,创建网络服务器时需要用到net.Listeners生成一个监听器,阻塞处理连接到服务器的请求,如下所示: func main(){ ln, err := net.Listen("tcp", fmt.Sprintf("0.0.0.0:%d", 1234)) if err != nil { log.Fatal(err) } log.Println("server start...") for { conn, err := ln.Accept() if err != nil { log.Fatal(err) } handle(conn) } } 但是ln.Accept()是一个阻塞函数,我们无法在某时刻通知并令其退出(处于一个for循环之中),并且有时我们需要在关闭监...阅读全文

博文 2017-07-18 09:06:25 qinxiuchen

Golang实现简单好用的EventDispatcher

events源代码 package ax_events import "fmt" // 事件类型基类 type Event struct { //事件触发实例 Target IEventDispatcher //事件类型 Type string //事件携带数据源 Object interface{} } // 事件调度器基类 type EventDispatcher struct { savers []*EventSaver } // 事件调度器中存放的单元 type EventSaver struct { Type string Listeners []*EventListener } // 监听器 type EventListener struct { Handler EventHan...阅读全文

博文 2017-09-28 13:34:48 gofounder

Golang自带的http包的路由规则问题

1、调用下面的方法开启一个http监听服务http.HandleFunc("/hello/", helloHandler)err := http.ListenAndServe(":8080", nil)if err= nil { log.Fatal("ListenAndServe: ", err.Error())}2、路由规则中新增了"/hello"和"/hello/"两个key对应的handler(helloHandler)3、跟踪http\server.go源码查看到路由匹配规则中,通过高亮的代码可以让我们分析出来,假如我们请求路由"/hello/beijing",那么"/hello/"会被匹配到,但是这个通常不是我们想要的,如果使用原生的http包路由规则为了避免这种情况,在注册路由的...阅读全文

博文 2017-11-03 20:00:01 cythical-l-zc

Go实现的事件管理、调度工具库

Go 实现的轻量级的事件管理、调度工具库 [gookit/event](https://github.com/gookit/event) - 支持自定义定义事件对象 - 支持对一个事件添加多个监听器 - 支持设置事件监听器的优先级,优先级越高越先触发 - 支持根据事件名称前缀 `PREFIX.` 来进行一组事件监听. - 注册`app.*` 事件的监听,触发 `app.run` `app.end` 时,都将同时会触发 `app.*` 事件 - 支持使用通配符 `*` 来监听全部事件的触发 - 完善的单元测试,单元覆盖率 `> 95%` > Github [gookit/event](https://github.com/gookit/event...阅读全文

golang 指针类型引起的神奇 bug

下面是使用的结构体接口抽象定义,其实就是将结构体存进一个 map里。由于是读写都比较频繁,我加了读写锁。 // add progress listener. func (upload *UploaderGateway) AddProgress(key string, v ProgressListener) { upload.mutex.Lock() defer upload.mutex.Unlock() upload.ProgressMap[key] = v } //get progress listener. func (upload *UploaderGateway) GetProgress(key string) (v ProgressListener, err error) { up...阅读全文

博文 2019-05-26 03:34:41 kenuo

select I/O多路复用

select golang的并发模型和linux select类似 golang提供了select关键字,实现I/O的多路复用 linux select的模型大致是以下这样 : while (true) { init_select_fd(); //初始化监听的fd int ret = select(); //select阻塞式监听 if (...) { //if有fd被触发 ...//处理fd的事件 } } golang select模型有类似的结构 监听的是管道 while (true) { switch { case variable := <-chan1 : ...//处理管道1事件 break; case variable := <-chan1 : ...//处理管道2事件 brea...阅读全文

博文 2018-12-03 01:34:44 sakura3zz

golang---信号signal

golang中os/signal包的使用 chenbaoke · 2015-06-17 20:03:59 · 2748 次点击 · 预计阅读时间 1 分钟 · 不到1分钟之前 开始浏览 这是一个创建于 2015-06-17 20:03:59 的文章,其中的信息可能已经有所发展或是发生改变。 os/signal包实现对信号的处理 golang中对信号的处理主要使用os/signal包中的两个方法:一个是notify方法用来监听收到的信号;一个是 stop方法用来取消监听。 func Notify(c chan<- os.Signal, sig ...os.Signal) func Notify(c chan<- os.Signal, sig ...os.Signal) 第一个参数表示接收信号的...阅读全文

博文 2018-01-21 08:30:02 yaowen

如何用 Go 实现热重启

热重启 热重启(Zero Downtime),指新老进程无缝切换,在替换过程中可保持对 client 的服务。 原理 父进程监听重启信号 在收到重启信号后,父进程调用 fork ,同时传递 socket 描述符给子进程 子进程接收并监听父进程传递的 socket 描述符 在子进程启动成功之后,父进程停止接收新连接,同时等待旧连接处理完成(或超时) 父进程退出,热重启完成 实现 package main import ( "context" "errors" "flag" "log" "net" "net/http" "os" "os/exec" "os/signal" "syscall" "time" ) var ( server *http.Server listener net.List...阅读全文

博文 2019-07-17 16:03:49 Jiahonzheng

Golang程序中如何监听并处理信号?

Golang程序中如何监听并处理信号? 当运行一个终端程序或守护(daemon)进程时,经常需要响应来自用户或系统的信号来实现诸如:退出/重启/清理(clean up) 等工作,又或者利用信号通知机制实现一些业务功能,如:更新缓存、发送通知。。。 以下例子将会演示在 golang 中如何监听并处理信号: package main import ( "fmt" "os" "os/signal" "syscall" "time" ) const FILENAME = "go-example.txt" func main() { SignalHandler() CreateFile() for { fmt.Println("- Sleeping") time.Sleep(10 * time.Sec...阅读全文

博文 2018-09-21 09:34:40 字节幂

Go http.server实战

``` package main import ( "fmt" "net/http" ) func main() { //监听协议 http.HandleFunc("/",HelloWorldHandler) http.HandleFunc("/user/login",UserLoginHandler) //监听服务 err := http.ListenAndServe("0.0.0.0:8880",nil) if err != nil { fmt.Println("服务器错误") } } func HelloWorldHandler(w http.ResponseWriter,r *http.Request) { fmt.Println("r.Method = ", r.Method) f...阅读全文

博文 2019-05-07 13:12:35 commanding

Go语言中处理 HTTP 服务器

## 1 概述 包 `net/http` 提供了HTTP服务器端和客户端的实现。本文说明关于服务器端的部分。 快速开始: ```go package main import ( "log" "net/http" ) func main() { // 设置 路由 http.HandleFunc("/", IndexAction) // 开启监听 log.Fatal(http.ListenAndServe(":8888", nil)) } func IndexAction(w http.ResponseWriter, r *http.Request) { w.Write([]byte(`

来自小韩说课的问候

`)) } ``` 运行程序,在浏览器上请求...阅读全文

博文 2018-11-12 22:20:51 hanzkering

DockOne微信分享(一一五):基于Neutron的Kubernetes SDN实践经验之谈

【编者的话】本次分享将给大家介绍Kubernetes的网络通信原理,并介绍几种典型的Kubernetes网络实现方案。最后分享下我们公司ECP容器管理平台的在Neutron基础上为Kubernetes实现的SDN方案(Skynet)实践经验和演进。 【深圳站|3天烧脑式Kubernetes训练营】培训内容包括:Kubernetes概述和架构、部署和核心机制分析、进阶篇——Kubernetes调工作原理及源码分析等。 首先,向大家科普下Kubernetes所选择的CNI网络接口,简单介绍下网络实现的背景。 CNI即Container Network Interface,是一套容器网络的定义规范,包括方法规范、参数规范、响应规范等等。CNI只要求在容器创建时为容器分配网络资源、删除容器时释放网络...阅读全文

博文 2017-06-25 16:25:36 swordboy

golang 指针类型引起的神奇 bug

下面是使用的结构体接口抽象定义,其实就是将结构体存进一个 map里。由于是读写都比较频繁,我加了读写锁。 // add progress listener. func (upload *UploaderGateway) AddProgress(key string, v ProgressListener) { upload.mutex.Lock() defer upload.mutex.Unlock() upload.ProgressMap[key] = v } //get progress listener. func (upload *UploaderGateway) GetProgress(key string) (v ProgressListener, err error) { up...阅读全文

博文 2019-06-03 23:34:19 张高元

异步通讯

epoll的作用 监听io流的变化,返回事件。 epoll 操作 创建: epoll_create 注册: epoll_ctl 获取通知事件: epoll_wait golang的服务器库 支持异步通讯; linux下基于socket的异步通讯方式 select的使用介绍 epoll相关的概念介绍 epoll的使用 select与epoll的使用 select与epoll的简单对比 select与epoll的详细对...阅读全文

博文 2019-04-08 01:34:39 Kinvo

基于2PC和延迟更新完成分布式消息队列多条事务Golang版本

背景 分布式多消息事务问题 在消息队列使用场景中,有时需要同时下发多条消息,但现在的消息队列比如kafka只支持单条消息的事务保证,不能保证多条消息,今天说的这个方案就时kafka内部的一个子项目中基于2PC和延迟更新来实现分布式事务 2PC 2PC俗称两阶段提交,通过将一个操作分为两个阶段:准备阶段和提交阶段来尽可能保证操作的原子执行(实际上不可能,大家有个概念先) 延迟更新 延迟更新其实是一个很常用的技术手段,简单来说,当某个操作条件不满足时,通过一定手段将数据暂存,等条件满足时在进行执行 基于2PC和延迟队列的分布式事务实现 系统架构 实现也蛮简单的, 在原来的业务消息之后再添加一条事务消息(事务消息可以通过类似唯一ID来关联到之前提交的消息), worker未消费到事物提交的消息,就...阅读全文

博文 2019-05-18 11:34:37 仔仔

gof23行为类模式(golang版)

命令模式 image 命令模式是一个高内聚的模式,其定义:将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排除或者记录请求日志,可以提供命令的撤销和恢复功能。 命令模式包含如下角色: Command: 抽象命令类 需要执行的所有命令得出在这里声明。 ConcreteCommand: 具体命令类 负责实现在Command角色中定义的接口 Invoker: 调用者 开始执行命令的角色,它会调用在Command角色中定义的接口。 Receiver: 接收者 该角色就是干活的角色,命令传递到这里是应该被执行的 命令模式的优点 类间解耦 调用者角色与接收者角色之间没有任何依赖关系,调用者实现功能时只须调用Command抽象类的execute方法就可以,不需要了解到底是哪个接收者执...阅读全文

博文 2018-12-08 23:35:40 五月花号区块链联盟