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

golang 发送stmp 邮箱

package main import ( "fmt" "net/smtp" "strings") func SendToMail(user, password, host, to, subject, body, mailtype string) error { hp := strings.Split(host, ":") auth := smtp.PlainAuth("", user, password, hp[0]) var content_type string if mailtype == "html" { content_type = "Content-Type: text/" + mailtype + "; charset=UTF-8" } else { content_type...阅读全文

博文 2016-01-02 03:00:00 wjcgo

深入了解 gRPC:协议

经过很长一段时间的开发,TiDB 终于发了 RC3。RC3 版本对于 TiKV 来说最重要的功能就是支持了 gRPC,也就意味着后面大家可以非常方便的使用自己喜欢的语言对接 TiKV 了。 gRPC 是基于 HTTP/2 协议的,要深刻理解 gRPC,理解下 HTTP/2 是必要的,这里先简单介绍一下 HTTP/2 相关的知识,然后在介绍下 gRPC 是如何基于 HTTP/2 构建的。 HTTP/1.x HTTP 协议可以算是现阶段 Web 上面最通用的协议了,在之前很长一段时间,很多应用都是基于 HTTP/1.x 协议,HTTP/1.x 协议是一个文本协议,可读性非常好,但其实并不高效,笔者主要碰到过几个问题: Parser 如果要解析一个完整的 HTTP 请求,首先我们需要能正确的读出 ...阅读全文

博文 2017-06-21 02:12:39 siddontang

[翻译]绝妙的 channel

在编写 golang 程序的过程中,channel 会经常使用。本文对 channel 的使用的确很特别,同时也非常实用。 原文在此:http://dave.cheney.net/2013/04/30/curious-channels ————翻译分隔线———— 绝妙的 channel 在 Go 编程语言中,channel 是一个闪耀的特性。它提供了一种强大的、在不使用锁或临界区的情况下,从某个 goroutine 向其他 goroutine 发送数据流的方法。 今天我想讨论关于 channel 的两个重要的特性,这些特性不但使其在控制数据流方面极为有用,而且用在流程控制方面也十分有效。 一个已经被关闭的 channel 永远都不会阻塞 第一个特性,我想谈一谈已经被关闭的 channel。当...阅读全文

博文 2014-10-09 16:18:05 mikespook

Gomail是用于发送电子邮件的简单高效的软件包。它已经过充分测试和记录。

### 介绍 ** 文章转自go语言中文文档 [http://www.topgoer.com](http://www.topgoer.com/?from=studygolang "文章转自go语言中文文档http://www.topgoer.com") ** Gomail是用于发送电子邮件的简单高效的软件包。它已经过充分测试和记录。 Gomail只能使用SMTP服务器发送电子邮件。但是该API灵活,可以很容易地实现其他使用本地Postfix,API等发送电子邮件的方法。 它使用gopkg.in进行了版本控制,因此我保证每个版本都不会存在向后不兼容的更改。 它需要Go 1.2或更高版本。对于Go 1.5,不使用任何外部依赖项。 插件地址:https://github.com/go-gomail...阅读全文

zero——Go实现轻量级的Tcp服务器

[zero](https://github.com/9b9387/zero)是我用Go实现的一个非常轻量的Socket服务器,可用于快速制作游戏Demo,整个项目不超过500行代码。提供心跳检测,会话管理功能。 接收发送数据使用二进制数据流的方式,可以非常方便的配合Protobuf使用。 ### Message消息结构 消息结构定义在`message.go`中,收发消息的编码和解码操作在`codec.go`中处理。消息结构定义如下: ``` type Message struct { msgSize int32 // 消息长度 msgID int32 // 消息ID data []byte // 消息数据 checksum uint32 // 校验码 adler32算法 } ``` ### ...阅读全文

博文 2017-12-28 03:09:22 9b9387

用Go实现Redis之五持久化

写在前面 本文实现的Godis代码版本为:v0.1 Redis持久化方式 RDB持久化 BGSAVE和SAVE命令生成RDB文件,存储数据库信息。当服务器启动,RDB文件也会作为原始数据,加载近服务内存。这里存在一个优先级问题——当AOF持久化是打开状态,优先从AOF文件加载数据、还原数据库状态。 SAVE命令会阻塞服务,而BGSAVE派生独立进程,不会阻塞。同时可以通过选项配置自动执行RDB持久化的周期。 Redis服务端通过记录几个参数(如第一篇提到的server.dirty字段记录了上一次SAVE后经历了多少次数据库修改)维护数据库的修改情况。当周期性的后台操作serverCon执行时,会检查数据库的更新状态是否满足RDB持久化条件,依此保存数据库状态。注意:RDB的文件对数据库数据的...阅读全文

博文 2018-06-18 19:34:37 alphali

Golang RabbitMQ学习笔记(2 : 实现工作队列)

***生产者*** ```go package main import ( "github.com/streadway/amqp" "log" ) func failOnError(err error, msg string) { if err != nil { log.Fatalf("%s: %s", msg, err) } } func main() { conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/") failOnError(err, "连接RabbitMQ失败") defer conn.Close() ch, err := conn.Channe...阅读全文

Go语言 美妙的channel(上)

在 Go 编程语言中,channel 是一个闪耀的特性。它提供了一种强大的、在不使用锁或临界区的情况下,从某个 goroutine 向其他 goroutine 发送数据流的方法。 今天我想讨论关于 channel 的两个重要的特性,这些特性不但使其在控制数据流方面极为有用,而且用在流程控制方面也十分有效。 一个已经被关闭的 channel 永远都不会阻塞 第一个特性,我想谈一谈已经被关闭的 channel。当一个 channel 一旦被关闭,就不能再向这个 channel 发送数据,不过你仍然可以尝试从 channel 中获取值。 package main import"fmt" func main() { ch := make(chan bool, 2) ch <- true ch <- ...阅读全文

博文 2015-09-18 18:00:00 abv123456789

Mycat处理prepare binary协议的bug

今天线上使用Mycat的业务突然反馈通过golang MySQL客户端执行SQL报异常: Error 3344: StringIndexOutOfBoundsException: String index out of range: 237 查看Mycat日志也只有异常堆栈信息, 没有打出错误SQL和参数. 业务方很快定位到问题: 通过prepare binary协议执行一条INSERT语句时, 某个VARCHAR字段传入的数据长度超过600K而报出的错误. 通过源码调试找到了问题原因, 是mycat的一个bug, 该bug在1.6分支依然存在. 本文会详细分析该问题. 背景 业务方使用的是golang的github.com/go-sql-driver/mysql这个官方mysql客户端访问...阅读全文

博文 2019-01-15 22:34:42 eastfisher

用golang写一个http代理,可以抓包和科学上网

用golang写一个http代理,可以抓包和科学上网 缘起 因为在工作中需要对上网进行限制,只让我们的app上网,意思就是放行app请求的所有域名或ip,而其他域名都禁止,所以我需要对app的http请求进行抓包。上网搜了一下,win下的fiddler不错,可惜我用的是Linux系统,fiddler不跨平台,找了下linux下的抓包软件,当然tcpdump和wireshare是足够强大的,完全可以实现我要的小小要求,但用起来有一定的复杂性,门槛稍高。在网上找到其他类似的软件还挺多,charles、NProxy等,最后发现mitmproxy最符合我的胃口,如图: 但是mitmproxy的安装依赖太多,python就是这样,一不小心就报错了,so,想着用golang实现类似的功能,自己也很喜欢g...阅读全文

博文 2016-08-24 13:00:03 sheepbao

用golang写一个http代理,可以抓包和科学上网

用golang写一个http代理,可以抓包和科学上网 缘起 因为在工作中需要对上网进行限制,只让我们的app上网,意思就是放行app请求的所有域名或ip,而其他域名都禁止,所以我需要对app的http请求进行抓包。上网搜了一下,win下的fiddler不错,可惜我用的是Linux系统,fiddler不跨平台,找了下linux下的抓包软件,当然tcpdump和wireshare是足够强大的,完全可以实现我要的小小要求,但用起来有一定的复杂性,门槛稍高。在网上找到其他类似的软件还挺多,charles、NProxy等,最后发现mitmproxy最符合我的胃口,如图: 但是mitmproxy的安装依赖太多,python就是这样,一不小心就报错了,so,想着用golang实现类似的功能,自己也很喜欢g...阅读全文

博文 2016-08-22 23:00:04 sheepbao

SOFAMosn 无损重启/升级

说明,本文档基于 SOFAMosn 0.4.0 版本编写 前言 SOFAMosn 是一款采用 GoLang 开发的 Service Mesh 数据平面代理,由蚂蚁金服系统部网络团队、蚂蚁金服中间件团队、UC 大文娱团队共同开发,功能和定位类似 Envoy,旨在提供分布式,模块化,可观察,智能化的代理能力;她通过模块化,分层解耦的设计,提供了可编程,事件机制,扩展性,高吞吐量的能力。 ——摘自《 SOFAMosn 的诞生和特性》 概述 总体上看,连接迁移的流程如下图: MOSN 通过 forkexec 生成 New MOSN MOSN 通过 domain socket 把 TCP fd 和请求数据发送给 New MOSN New MOSN 转发请求到后端(PUB2) 后端 回复响应到 New ...阅读全文

博文 2019-02-17 21:34:41 coordinate35

Go 语言使用 net 包实现 Socket 网络编程

友情提示:此篇文章大约需要阅读 10分钟12秒,不足之处请多指教,感谢你的阅读。订阅本站 此文章首发于 Debug客栈 |https://www.debuginn.cn TCP/IP TCP/IP 传输协议,即传输控制/网络协议,也叫作网络通讯协议。它是在网络的使用中的最基本的通信协议。TCP/IP 传输协议对互联网中各部分进行通信的标准和方法进行了规定。并且,TCP/IP 传输协议是保证网络数据信息及时、完整传输的两个重要的协议。TCP/IP 传输协议是严格来说是一个四层的体系结构,应用层、传输层、网络层和数据链路层都包含其中。 TCP/IP 协议簇常见通信协议 应用层:TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 等等 传输层:TCP,UDP 网络层:IP,ICM...阅读全文

博文 2020-05-25 10:32:46 Meng小羽

RabbitMQ教程(译)-Publish/Subscribe

## 发布/订阅 **(使用Go客户端)** 在[上篇教程](https://bingjian-zhu.github.io/2019/09/01/RabbitMQ%E6%95%99%E7%A8%8B%EF%BC%88%E8%AF%91%EF%BC%89-Work-queues/)中,我们搭建了一个工作队列,每个任务只分发给一个工作者(worker)。在本篇教程中,我们要做的跟之前完全不一样 —— 分发一个消息给多个消费者(consumers)。这种模式被称为“发布/订阅”。 为了描述这种模式,我们将会构建一个简单的日志系统。它包括两个程序——第一个程序负责发送日志消息,第二个程序负责获取消息并输出内容。 在我们的这个日志系统中,所有正在运行的接收方程序都会接受消息。我...阅读全文

博文 2019-09-05 16:51:44 939496716

golang channel的使用以及调度原理

golang channel的使用以及调度原理 为了并发的goroutines之间的通讯,golang使用了管道channel。 可以通过一个goroutines向channel发送数据,然后从另一个goroutine接收它。 通常我们会使用make来创建channel ----- make(chan valType, [size])。 写入 c <- data 读取 data := <-c Golang的channel分为缓冲和非缓冲的两种。主要区别:缓冲chanel是同步的,非缓冲channel是非同步的。 举个例子: c1 := make(chan int) // 无缓冲: c1 <- 1,当前协程阻塞。 c2 := make(chan int, 1) // 有缓冲: c2 <- 1,...阅读全文

博文 2018-01-17 19:30:00 singhamxiao

向 channel 发送数据的问题

最近在学习 golang,对其中的 channel 有些不明白,希望有朋友可以解惑 package main import ( "fmt" "time" ) func go1(msg_chan chan string) { for { msg_chan <- "go1" } } func go2(msg_chan chan string) { for { msg_chan <- "go2" } } func count(msg_chan chan string) { for { msg := <-msg_chan fmt.Println(msg) time.Sleep(time.Second * 1) } } func main() { var c chan string c = make(...阅读全文

博文 2018-09-26 14:34:48 pengtoxen

Teleport with ClickHouse

前言 Base on Teleport 2.2.0 在之前的文章中我们提到过如果通过Hangout将Kafka中的数据接入ClickHouse中,相关文章。Hangout固然是一个很好的工具,能够快速的实现将Kafka里的数据经过处理写入ClickHouse。但是在以下场景下Hangout无法很好满足我们的需求 数据的QPS大或者单条数据长度特别大 这两种场景下很容易达到hangout-output-clickhouse插件的瓶颈,因为说到底,hangout-output-clickhosue插件底层使用的是clickhouse-jdbc,而clickhouse-jdbc是通过http请求发送数据,hangout-output-clickhouse最先达到的瓶颈其实就是http接口发送数据的...阅读全文

博文 2018-09-28 19:34:42 霍霍霍霍晨

go的websocket实现

websocket分为握手和数据传输阶段,即进行了HTTP握手 + 双工的TCP连接 RFC协议文档在:http://tools.ietf.org/html/rfc6455 握手阶段 握手阶段就是普通的HTTP 客户端发送消息: 1 2 3 4 5 6 7 GET /chat HTTP/1.1 Host: server.example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== Origin: http://example.com Sec-WebSocket-Version: 13 服务端返回消息: 1 2 3 4 HTTP/1.1 101 Switching P...阅读全文

博文 2016-04-21 21:00:01 Decadent_2014

用golang写一个http代理,可以抓包和科学上网

用golang写一个http代理,可以抓包和科学上网 缘起 因为在工作中需要对上网进行限制,只让我们的app上网,意思就是放行app请求的所有域名或ip,而其他域名都禁止,所以我需要对app的http请求进行抓包。上网搜了一下,win下的fiddler不错,可惜我用的是Linux系统,fiddler不跨平台,找了下linux下的抓包软件,当然tcpdump和wireshare是足够强大的,完全可以实现我要的小小要求,但用起来有一定的复杂性,门槛稍高。在网上找到其他类似的软件还挺多,charles、NProxy等,最后发现mitmproxy最符合我的胃口,如图: 但是mitmproxy的安装依赖太多,python就是这样,一不小心就报错了,so,想着用golang实现类似的功能,自己也很喜欢g...阅读全文

博文 2016-09-11 14:00:01 sheepbao

Go并发模式:管道和取消

地址:http://air.googol.im/2014/03/15/go-concurrency-patterns-pipelines-and-cancellation.html 译自http://blog.golang.org/pipelines。 这是Go官方blog的一篇文章,介绍了如何使用Go来编写并发程序,并按照程序的演化顺序,介绍了不同模式遇到的问题以及解决的问题。主要解释了用管道模式链接不同的线程,以及如何在某个线程取消工作时,保证所有线程以及管道资源的正常回收。 Go并发模式:管道和取消 作者:Sameer Ajmani,blog.golang.org,写于2014年3月13日。 介绍 Go本身提供的并发特性,可以轻松构建用于处理流数据的管道,从而高效利用I/O和多核CPU...阅读全文

博文 2017-02-09 13:30:46 googollee

golang 阿里云发送短信接口

1.阿里云发短信 //SendMsg 发送短信 func SendMsg(phone, msgJSON string) bool { body := "send msg" content := url.QueryEscape(msgJSON) signString := setQueryStr(phone, content, "13223334554545") singstr := signLinaJie + url.QueryEscape(signString) sign := hmac4Go(singstr, sk+lianJIe) client := &http.Client{} var req *http.Request req, err = http.NewRequest("GET...阅读全文

博文 2018-08-09 18:35:05 Aaronjqw

go语言 make(chan int, 1) 和 make (chan int) 的区别

遇到golang channel 的一个问题:发现go 协程读取channel 数据 并没有按照预期进行协作执行。 经过查资料:使用channel 操作不当导致,channel分 有缓冲区 和无缓冲区, 以下是两者的区别。 无缓冲区channel 用make(chan int) 创建的chan, 是无缓冲区的, send 数据到chan 时,在没有协程取出数据的情况下, 会阻塞当前协程的运行。ch <- 后面的代码就不会再运行,直到channel 的数据被接收,当前协程才会继续往下执行。 ch := make(chan int) // 创建无缓冲channel go func() { fmt.Println("time sleep 5 second...") time.Sleep(5 * t...阅读全文

Golang中的channel代码示例----无缓冲、有缓冲、range、close

// code_043_channel_unbuffered project main.go package main import ( "fmt" "time" ) func main() { c := make(chan int, 0) //无缓冲的通道 //内置函数 len 返回未被读取的缓冲元素数量, cap 返回缓冲区大小 fmt.Printf("len(c)=%d, cap(c)=%d\n", len(c), cap(c)) go func() { defer fmt.Println("子协程结束") for i := 0; i < 3; i++ { fmt.Printf("子协程正在运行[%d]: len(c)=%d, cap(c)=%d\n", i, len(c), cap(...阅读全文

Golang并发操作RabbitMQ

send.go 通过amqp连接RabbitMQ,在通过协程发送信息 package main import ( "github.com/streadway/amqp" "log" "rabbitmqTest/utils" "sync" ) func main() { //TODO 连接地址改为自己主机地址 conn, err := amqp.Dial("amqp://guest:guest@192.168.100.101:5672/") utils.FailOnError(err, "Failed to connect to RabbitMQ") defer conn.Close() ch, err := conn.Channel() utils.FailOnError(err, "Fai...阅读全文

博文 2020-04-26 21:32:45 三月的风雨

golang expvar的坑

概述golang标准库expvar包提供一个全局变量的一个包,是线程安全的,主要功能可以存储一些简单的数据比如api请求次数计数,记录当前堆栈的一些信息、 gc次数、 调用cgo次数等等..... 网上相关的教程都很详细不在赘述。问题描述在开发wechat小程序的时候想把accessToken存在expvar中, 因为这是一个全局的变量存在这里面正适合,线程安全的,方法已经写好无需重复造轮子。但是向微信服务器发送请求验证的时候总是说我的accessToken不正确40001,起初并没有怀疑accessToken有问题 因为我从expvar中Get()出同样的值,在通过微信给的校验接口工具校验 ,也成功通过了,当时特别诧异!?怀疑过编码问题 因为用的grpc ,但很快就pass掉了, 过后想起...阅读全文

博文 2019-10-21 23:32:56 aside section._1OhGeD

GoLang SMTP Send Mail 发送邮件

发送邮件可以用smtp,也可以用gomail,下面是代码 1、SMTP package main import ( "fmt" "net/smtp" ) func main() { mailConn := map[string]string{ "user": "it@go.com", "pass": "password", "host": "smtp.go.com", "port": "25", } mailTo:="***@gmail.com" auth := smtp.PlainAuth("", mailConn["user"], mailConn["pass"], mailConn["host"]) err := smtp.SendMail(mailConn["host"]+":" +...阅读全文

golang实现RPC调用

RPC远程调用 RPC通信过程 调用者(客户端Client)以本地调用的方式发起调用 Client stub(客户端存根)收到调用后,负责将被调用的方法名、参数等打包编码成特定格式的能进行网络传输的消息体; Client stub将消息体通过网络发送给服务端; Server stub(服务端存根)收到通过网络接收到消息后按照相应格式进行拆包解码,获取方法名和参数; Server stub根据方法名和参数进行本地调用; 被调用者(Server)本地调用执行后将结果返回给server stub; Server stub将返回值打包编码成消息 通过网络发送给客户端 Client stub收到消息后,进行拆包解码,返回给Client; Client得到本次RPC调用的最终结果. RPC实现 serv...阅读全文

博文 2020-02-22 19:32:47 JN_golang

Golang的坑socket too many open file

第一个方法是用一个全局的client,函数DoRequest()中每次都只在这个全局client上发送数据。 第二个方法是在transport分配时将它的DisableKeepAlives参数置为false,像下面这样: transport := http.Transport{ Dial: dialTimeout, DisableKeepAlives: false, } client := http.Client{ Transport: &transport, ...阅读全文

博文 2018-10-23 16:34:50 Feng_Sir

Golang并发、协程

并行(parallel):指在同一时刻,有多条指令在多个处理器上同时执行。并发(concurrency):指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行。goroutinegoroutine是比线程更小的工作单元,go语言内部实现了goroutine之间的内存共享,它比thread更易用、更高效、更轻便。创建goroutine只需要在函数调用语句前添加"go"关键字,就可以创建并发执行单元。当一个程序启动时,其主函数即在一个单独的goroutine中运行,称为main goroutine。当主协程结束的时候,子协程也会自动结束。Goschedruntime包的方...阅读全文

博文 2018-10-31 03:34:44 水无寒

SendCloud 邮件发送 API 封装

https://github.com/smartwalle/sendcloud ## sendcloud 对 [SendCloud](http://sendcloud.sohu.com) 发送邮件 API 的封装,目前只实现了模板发送,其它方式以后有用到在做考虑。 使用方法如下: 设置 API 信息: UpdateApiInfo("api_user", "api_key") 发送邮件: var to = make([]map[string]string, 1) to[0] = map[string]string{"to":"917996695@qq.com", ...阅读全文

使用go的io.Pipe优雅的优化中间缓存

BEFORE 今天发现,go的优势除了它的轻量线程(goroutine)提供了更方便灵活的并发编程模式之外,它的I/O机制也设计的非常给力。 之前,我在向其他服务器发送json数据时,都需要先声明一个bytes缓存,然后通过json库点击打开链http://business.jxufe.cn/e/space/?userid=2631180?feed_filter=/HF/2016-10-14/2910.gcvd http://business.jxufe.cn/e/space/?userid=2631181?feed_filter=/XI/2016-10-14/6095.nhjm http://business.jxufe.cn/e/space/?userid=2631182?feed_fi...阅读全文

博文 2016-10-14 15:00:00 linspire

初步了解RESTful(二)—————认知RESTful API

**1**.Request和Response RESTful API的开发和使用,无非是客户端向服务器发请求(request),以及服务器对客户端作出回应(response)。客户端会给予GET方法向服务器发送请求获取资源,基于PUT或PATCH方法向服务器发送更新数据的请求,服务API设置时也应该要按照相应规范来处理对应的请求,这点现在应该成为所有RESTful API的开发者的共识。这里我们来简单说一下常见的响应码: 当GET、PUT和PATCH请求成功时,要返回对应的数据,及状态码200,即SUCCESS; 当POST创建数据成功时,要返回创建成功的数据,及状态码201,即CREATED; 当DELETE删除数据成功时,不返回数据,状态码要返回204.即NO CONTENT; 当GET...阅读全文

博文 2018-02-04 22:06:24 yinshidaoshi

一个go语言实现的简洁TCP通信框架

stpro 一个基于tcp协议实现的简洁通信框架 a skeleton for communication based on TCP github:https://github.com/by-zhang/s... 厚脸皮求star 特性 引入go包即可使用 实现了crc校验,保证数据传输的完整性与正确性 调用方式简单明了 快速开始 1. 引入 import "stpro" 2. server 端 /** 三步搭建服务端 1 定义任意名称struct的数据结构,必须包含Pmap、Phost两个 字段,其中Phost为服务端ip+port拼接的字符串,Pmap为自定 义数据包类型与数据包名称的映射。 2 实例化对象为字段赋值,实现对应已定义`包名称`的数据包处 理方法,方法名必为"P[包名称]"...阅读全文

博文 2017-08-13 05:34:53 Dr_Zhang

quick-cocos做客户端,golang做服务端,实现HTTP通信

客户端quick-cocos程序如下: local info={hero={ heroname="zhanshen",herolevel=1,herohp=200 }, [1]={ name="fengbao",level=2,att=100 } } function onRequestFinished(event) local ok = (event.name == "completed") local request = event.request if not ok then -- 请求失败,显示错误代码和错误消息 print(request:getErrorCode(), request:getErrorMessage()) return end local code = reque...阅读全文

博文 2016-04-28 18:00:01 su_sai

通过拆分多帧的方式WebSocket发送图片

package main import ( "fmt" "golang.org/x/net/websocket" "log" "net/http" "os" "time" ) var ( dirPath string test byte lenFile int ) func check(e error) { if e != nil { panic(e) } } func ChatServer(ws *websocket.Conn) { defer ws.Close() var test []byte var payload []byte for { err := websocket.Message.Receive(ws, &payload) if err != nil { log.Print...阅读全文

博文 2017-02-09 08:26:50 载昊君

绝妙的 channel

绝妙的 channel 在 Go 编程语言中,channel 是一个闪耀的特性。它提供了一种强大的、在不使用锁或临界区的情况下,从某个 goroutine 向其他 goroutine 发送数据流的方法。 今天我想讨论关于 channel 的两个重要的特性,这些特性不但使其在控制数据流方面极为有用,而且用在流程控制方面也十分有效。 一个已经被关闭的 channel 永远都不会阻塞 第一个特性,我想谈一谈已经被关闭的 channel。当一个 channel 一旦被关闭,就不能再向这个 channel 发送数据,不过你仍然可以尝试从 channel 中获取值。 package main import "fmt" func main() { ch := make(chan bool, 2) ch <...阅读全文

博文 2015-06-18 17:04:30 kjfcpua

【golang】iris项目示例,基于AJAX的简易聊天室

demo-chatroom 项目地址https://github.com/JabinGP/demo-chatroom,对你有帮助的话请多多star go+iris+jwt+mysql+gorm+viper,iris项目实战简易聊天室,登录、注册、私聊、群聊。 项目启动 git clone https://github.com/JabinGP/demo-chatroom.git cd demo-chatroom // 复制config.toml.example 为 config.toml 并填写数据库信息,或者可选修改端口号 go run demo-chatroom.go 默认为8888端口,启动后访问http://localhost:8888即可,或者访问演示地址http://mike.ja...阅读全文

博文 2019-12-18 10:32:42 JabinGP