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

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

Golang使用gomail发送邮件

使用gomail发送邮件 下载gomail包:go get gopkg.in/gomail.v2 import ( "gopkg.in/gomail.v2" ) const ( // 邮件服务器地址 MAIL_HOST = "smtp.126.com" // 端口 MAIL_PORT = 465 // 发送邮件用户账号 MAIL_USER = "username@126.com" // 授权密码 MAIL_PWD = "" ) func SendMail(mailAddress []string, subject string, body string) error { m := gomail.NewMessage() // 这种方式可以添加别名,即“126 mail”, 也可以直接用阅读全文

博文 2020-04-07 15:32:45 是个懒人

GO错误

SQL Server 应用程序可将多条 Transact-SQL 语句作为一个批处理发给 SQL Server 去执行。在此批处理中的语句编译成一个执行计划。程序员在 SQL Server 实用工具中执行特定语句,或生成 Transact-SQL 语句脚本在 SQL Server 实用工具中运行,用 GO 来标识批处理的结束。 如果基于 DB-Library、ODBC 或 OLE DB APIs 的应用程序试图执行 GO 命令时会收到语法错误。SQL Server 实用工具永远不会向服务器发送 GO 命令...阅读全文

ETCD探索-Watch

ETCD探索-Watch 梗概 watch是mvcc包中的一个功能,之所以拿出来说,是因为它确实有很重的逻辑。watch是监听一个或一组key,key的任何变化都会发出消息。某种意义上讲,这就是发布订阅模式。 对比 既然Watch机制就是发布订阅模式,我们通过对比Kafka,来更深入了解Watch。首先说明结论: ETCD没有消费者组的概念,所以不能代替Kafka 对比其他方面呢: ETCD Kafka 消费方式 监听一个Key 订阅一个Topic 生产方式 Put(Key, Value) Produce(Topic, Message) 历史消息是否保留 保留 保留 能否从指定位置消费 可以从指定Revision消费 可以从指定offset消费 能否保证消息不重放 不能 消费者会主动上报of...阅读全文

博文 2020-02-19 17:32:44 HammerMax

golang 实现tcp转发代理

package main import ( "flag" "fmt" "io" "net" "os" "strings" "sync" ) var lock sync.Mutex var trueList []string var ip string var list string func main() { flag.StringVar(&ip, "l", ":9897", "-l=0.0.0.0:9897 指定服务监听的端口") flag.StringVar(&list, "d", "127.0.0.1:1789,127.0.0.1:1788", "-d=127.0.0.1:1789,127.0.0.1:1788 指定后端的IP和端口,多个用','隔开") flag.Parse() tr...阅读全文

博文 2016-08-22 22:00:02 fyxichen

如何优雅的关闭Go Channel【译】

*Channel关闭原则* 不要在消费端关闭channel,不要在有多个并行的生产者时对channel执行关闭操作。 也就是说应该只在[唯一的或者最后唯一剩下]的生产者协程中关闭channel,来通知消费者已经没有值可以继续读了。只要坚持这个原则,就可以确保向一个已经关闭的channel发送数据的情况不可能发生。 *暴力关闭channel的正确方法* 如果想要在消费端关闭channel,或者在多个生产者端关闭channel,可以使用recover机制来上个保险,避免程序因为panic而崩溃。 func SafeClose ( ch chan T ) ( justClosed bool ) { defer func () { if recover () != nil { justClosed ...阅读全文

博文 2018-02-27 15:04:03 钱文品

Golang的socket编程(二):简单client

一、概述上一篇介绍了基本的函数和结构类型,这里就可以开始写服务端和客户端通信小程序了,通信的基本的流程如下: 如果服务端使用Listen 来监听,那么可以不用ResolveTCPAddr 函数。 现在我们就来写一个server和client,实现功能:client发送数据到server,server将数据转成大写后返回。 二、服务端实现12345678910111213141516171819202122232425262728293031323334package mainimport ( "net" "fmt" "strings")func main(){ tcpAddr, err := net.ResolveTCPAddr("tcp4", "localhost:8080") //创建一...阅读全文

博文 2018-05-17 09:28:30 server | 马谦的博客

架构学习之路(四)-- IM系统初探

之前学习HTTP和TCP请求的时候经常看到一个名词就是长连接,之前一直很好奇怎么去实现,最近偶尔看到一篇文章写的IM系统,想转载学习一下。 IM系统,那么必然需要TCP长连接来维持,由于Golang本身的基础库和外部依赖库非常之多,我们可以简单引用基础net网络库,来建立TCP server。一般的TCP Server端的模型,可以有一个协程【或者线程】去独立执行accept,并且是for循环一直accept新的连接,如果有新连接过来,那么建立连接并且执行Connect,由于Golang里面协程的开销非常之小,因此,TCP server端还可以一个连接一个goroutine去循环读取各自连接链路上的数据并处理。当然, 这个在C++语言的TCP Server模型中,一般会通过EPoll模型来建...阅读全文

博文 2018-09-03 08:34:43 魔改谢馒头

golang 发送邮件(不带附件)

package main import ( "log" "net/smtp" "flag" "fmt" "strings" ) var ( subject = flag.String("s","","subject of the mail") body = flag.String("b", "", "body of email") reciMail = flag.String("m","","recipient mail address") ) func main(){ flag.Parse() sub := fmt.Sprintf("subject: %s\r\n\r\n",*subject) content := *body mailList := strings.Split(*reci...阅读全文

博文 2015-12-22 05:00:01 u011363248

golang的channel剖析

概述 为了并发的goroutines之间的通讯,golang使用了管道channel。你可以通过一个goroutines向channel发送数据,然后从另一个goroutine接收它 通常我们会使用make来创建channel ----- make(chan valType , [size])。 写入 channel c<- 读取channel <-c 分类 一 无缓冲 make创建时忽略第二个参数即可创建无缓冲channel实例如下: // csdnTest.go package main import ( "fmt" "time" ) func main() { messages := make(chan string) go func() { messages <- "hello" }...阅读全文

博文 2016-11-22 04:00:06 wslzwps00321

Golang 并发Groutine详解

概述 1、并行和并发 并行(parallel):指在同一时刻,有多条指令在多个处理器上同时执行。 并发(concurrency):指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行。 并行是两个队列同时使用两台咖啡机 并发是两个队列交替使用一台咖啡机 2、go并发优势 有人把Go比作21世纪的C语言,第一是因为Go语言设计简单;第二,21世纪最重要的就是并发程序设计,而Go从语言层面就支持了并发。同时,并发程序的内存管理有时候是非常复杂的,而Go语言提供了自动垃圾回收机制。 Go语言为并发编程而内置的上层API基于CSP(communication sequenti...阅读全文

博文 2018-08-02 12:30:01 liuzhongchao

【go网络编程】-Socket编程

什么是socket 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。Socket的英文原义是“孔”或“插座”。作为BSD UNIX的进程通信机制,取后一种意思。通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。Socket正如其英文...阅读全文

博文 2018-09-25 15:34:45 jincheng828

绝妙的 channel

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

博文 2015-06-17 20:15:59 Creak_Phone

go调用其它C库,若采用命令行方式,不支持重定向的输出解决;smp协议未打开,发送信息到对方,没人响应

很多时候要学会站在巨人的肩膀上,该用别人 现有的东东一定要用,只要是开源合法的 go调用其它C库,一般两种方式,1,查看是否有接口,采用cgo方式编写;2.采用命令行直接执行,前提必须被调用的C库已经安装运行在该机器上 为了高效处理gif文件,采用gifsicle工具 http://download.csdn.net/detail/u010026901/7711469 重定向符合 > 在代码中会出错,所以在代码中实现重定向代替命令行重定向 package main import ( // "encoding/json" // "fmt" "log" "os" "os/exec" ) func main() { f, _ := os.Create("out") cmd := exec.Comm...阅读全文

博文 2016-02-22 12:00:06 u010026901

GO语言学习--tcp服务器、客户机的通信

一、服务器设计 1. 注册端口; 2. 监听端口 —— ListenTCP( ); 3. 接收请求 —— Accept( ); 4. 接收数据 或 发送数据 —— Read( ) 或 Write( ); 二、客户端设计 1. 获取地址; 2. 发送请求; 3. 接收数据 或 发送数据 —— Read( ) 或 Write( ); 4. 关闭连接 —— Close( )...阅读全文

Go学习笔记- 如何优雅的关闭Go Channel【译】

通道关闭原则 不要在消费端关闭信道,不要在有多个并行的生产者时对信道执行关闭操作。 也就是说应该只在[唯一的或者最后唯一剩下]的生产者协程中关闭信道,来通知消费者已经没有值可以继续读了。只要坚持这个原则,就可以确保向一个已经关闭的信道发送数据的情况不可能发生。 暴力关闭信道的正确方法 如果想要在消费端关闭信道,或者在多个生产者端关闭信道,可以使用恢复机制来上个保险,避免程序因为恐慌而崩溃。 func SafeClose(ch chan T) (justClosed bool) { defer func() { if recover() != nil { justClosed = false } }() // assume ch != nil here. close(ch) // panic ...阅读全文

博文 2019-05-31 13:34:42 赵客缦胡缨v吴钩霜雪明

go tcp 编程

代码示例 服务端: package main import ( "fmt" "net" "strings" ) // 读取数据 func handleConnection(conn net.Conn) { for { buf := make([]byte, 1024) if _,err := conn.Read(buf);err == nil { result := strings.Replace(string(buf),"\n","",1) fmt.Println(result) }else{ fmt.Println(err) } } } func main() { /* Listen: 返回在一个本地网络地址laddr上监听的Listener。网络类型参数net必须是面向流的网络: "t...阅读全文

博文 2019-08-01 20:32:39 战神悟空

16 Go语言并发2——Channel

Go语言并发2——Channel 1、什么是channel channel 是一种架设在goroutine之间进行 通信的管道,类似队列。channel是引用类型,类型为chan,可以通过make关键字进行创建指定类型的channel。channel存在的意义是让goroutine通过通信来共享内存,一个往通道发送数据,一个从通道获取数据,来实现数据同步。 2、channel的创建和传递 声明通道时,需要指定将要被共享的数据的类型。可以通过通道共享内置类型、命名类型、结构类型和引用类型的值或者指针。 2.1 make关键字创建 ch:=make(chan int) //创建一个int类型的channel,所以这个channel只能发送接收int型的数据 ch1:=make(chan int ...阅读全文

golang(os/signal)阅读

golang(os/signal)阅读信号和信号函数在unix-like系统中,我们要经常用到信号和信号处理函数。我们在linux编程中,经常要处理程序接收到的函数。比如: signal(SIGINT, SignalHandler)上面的函数注册SIGINT的信号处理函数SignalHandler,当程序运行中,当收到SIGINT信号,程序相应的执行SignalHandler函数。 信号的分类特殊信号SIGKILL和SIGSTOP不能被程序修改。 SIGKILL 杀死一个程序SIGSTOP 暂停一个程序//运行一个程序for { time.Sleep(1 * time.Second) } //程序是个死循环// 使用SIGINT 退出^Csignal: interrupt// 程序退出// ...阅读全文

博文 2019-04-29 10:34:45 今生路人甲

基于websocket单台机器支持百万连接分布式聊天(IM)系统

基于websocket单台机器支持百万连接分布式聊天(IM)系统 本文将介绍如何实现一个基于websocket分布式聊天(IM)系统。 使用golang实现websocket通讯,单机可以支持百万连接,使用gin框架、nginx负载、可以水平部署、程序内部相互通讯、使用grpc通讯协议。 本文内容比较长,如果直接想clone项目体验直接进入项目体验 goWebSocket项目下载 ,文本从介绍webSocket是什么开始,然后开始介绍这个项目,以及在Nginx中配置域名做webSocket的转发,然后介绍如何搭建一个分布式系统。 目录 1、项目说明 1.1 goWebSocket 1.2 项目体验 2、介绍webSocket 2.1 webSocket 是什么 2.2 webSocket的兼...阅读全文

博文 2019-08-12 17:07:15 link1st

golang channel通讯

基于channel的通讯,对于无缓存的channel 发送的成功之时,接收者已经收到了。 接收,发生在发送者成功之前。 为什么会这样呢,如果我们靠记忆,就会怎么样,终究没有忘记快。可是如果我们能够从原理上来理解,也许就不容易忘记了。Golang的协程是协作式的,所以呢,如果发送者发送,那接收者存在一个何时运行的问题,如果发送成功之后,接收者才运行,不是说不可以,总少了那么一点点的协同的味道了。所以,如果换你来实现,一定也是发送者发送,送到接收者,唤起接收者运行(这时,发送者挂起了),然后到发送者重新回来运行的时候,接收者已经接收到了。 再扩展一下,对于带缓存的怎么办呢?这时候,其实就要看是谁,在什么 情况下阻塞了。总之,不能够自己一直运行下去,得给对方(你亲爱的合作方)运行的机会...阅读全文

土拨鼠 select语句与chan的使用

1 go的select配合chan 使用使用方式和switch 相似.要求是case 后面的操作必须是chan的读取 //下面这个select会选择default.因为前两个都走不通 //如果没有default 会一直循环case从上到下知道有通道 能读写. var ch1 chan int var ch2 chan int var ch3 []chan int =[] chan int{ch1,ch2} var numbers=[]int{1,2,3,4,5} func main(){ select { case getchan(0)<-getnumber(0): //向未被初始化的通道发送数据会造成当前的g永久的阻塞 fmt.Println("哈哈") case getchan(1)<-...阅读全文

博文 2019-08-30 11:41:27 blackdinosuar

GoLang邮件发送Demo(继上篇msmtp)

GoLang越来越被看好,流行只是时间的问题了,闲暇时间玩玩Go。 下面是发送邮件的demo,替换自己的邮箱,完全可以正常跑起来,用的是net/smtp包: 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_t...阅读全文

博文 2017-11-07 01:00:01 purelightme

Go Channel 源码剖析

0. 引言这篇文章介绍一下 Golang channel 的内部实现,包括 channel 的数据结构以及相关操作的代码实现。代码版本 go1.9rc1,部分无关代码直接略去,比如 race detect,对应的代码中的 raceenabled。 1. hchan structchannel 的底层数据结果是 hchan struct。 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748type hchan struct { qcount uint // 队列中数据个数 dataqsiz uint // channel 大小 buf unsafe.Pointer // ...阅读全文

博文 2017-08-08 02:30:16 Tao Kelu

Go基础系列:双层channel用法示例

Go channel系列: channel入门 为select设置超时时间 nil channel用法示例 双层channel用法示例 指定goroutine的执行顺序 双层通道的解释见Go的双层通道 以下是一个双层通道的使用示例。注意下面的示例中使用了"信号通道"(Signal channel),但这里的信号通道是多余的,仅仅只是为了介绍。 信号通道不用来传递数据,而是用来传递消息,用来产生可读、可写的事件,以便让select选中某个分支。产生消息事件的方式有多种,比如直接关闭通道、发送false/true布尔值等等。 package main import ( "fmt" "time" ) func main() { // 定义双层通道cc cc := make(chan chan in...阅读全文

博文 2018-11-23 09:12:13 f-ck-need-u

深入了解 gRPC:协议

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 请求,首先我们需要能正确的读出 HTTP header。HTTP header 各个...阅读全文

博文 2017-07-20 05:04:54 PingCAP

Go语言(十九)日志采集项目之logagent开发(一)

日志采集项目之logagent开发(一) 项目结构 项目分为如下部分: logagent conf: 配置文件 kafka: kafka集成模块 tailf: 日志读取模块 main.go: 程序入口 xlog: 日志打印模块,参考https://blog.51cto.com/13812615/2490744 oconfig: 配置文件解析模块,参考:https://blog.51cto.com/13812615/2492150 logCollect/ ├── logagent │ ├── conf │ │ └── config.ini │ ├── kafka │ │ └── kafka.go │ ├── logs │ │ └── logagent.log │ ├── main.go │ └...阅读全文

博文 2020-05-04 23:33:16 wx5b285b48ed74e

LollipopGo开源游戏服务器框架--网络基础模块源码

大家好,我是彬哥,本节给大家讲下LollipopGo游戏服务器NetBase.go,抛砖引玉了,主要是针对Go语言游戏服务器网络处理。 package main import ( "encoding/json" "fmt" "Proto" "Proto/Proto2" "code.google.com/p/go.net/websocket" ) func wwwGolangLtd(ws *websocket.Conn) { // fmt.Println("Golang语言社区 欢迎您!", ws) // data = json{} data := ws.Request().URL.Query().Get("data") fmt.Println("data:", data) NetDataCo...阅读全文

博文 2019-01-04 07:34:43 Golang语言社区

Golang对接Appsflyer

AppsFlyer:官方文档 我的代码: Appsflyer-go golang请求Appslfyer的接口 常量定义 const ( AppID = "com.your_appid" // 在AppsFlyer上的产品名称 AppsFlyerDevKey = "your_appsflyer_devkey" // AppsFlyer的devKey AppsFlyerUrlFormat = "https://api2.appsflyer.com/inappevent/%s" // Appslfyer事件的url AppsFlyerTimeFormat = "2006-01-02 15:04:05.000" // utc时间格式 ) Event,存储事件相关信息 type Event struc...阅读全文

博文 2019-06-04 21:32:38 GUIN蚂蚁

用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-23 00:00:02 sheepbao

Go语言学习笔记 - 并发

Goroutine Go在语言层面对并发编程提供支持,采用轻量级线程(协程)实现。只需要在函数调用语句前添加go关键字,就可以创建并发执行单元。开发人员无需了解任何执行细节,调度器会自动将其安排到合适的系统线程上执行。goroutine是一种非常轻量级的实现,可在单个进程里执行成千上万的并发任务。事实上,入口函数main就以goroutine运行。另有与之配套的channel类型,用以实现“以通讯来共享内存”的CSP模式。 go func() { println("Hello, World!") } 调度器不能保证多个goroutine执行次序,且进程退出时不会等待它们结束。默认情况下,进程启动后仅允许一个系统线程服务于goroutine。可使用环境变量或标准函数runtime.GOMAXP...阅读全文

博文 2017-02-10 15:54:27 技术学习

golang通道中 nil通道 close通道的特性点

英文原文 C1. 以下操作会引起panic P1. Closing the nil channel. 实例: func C1P1() { var ch chan int close(ch) } 结果 panic: close of nil channel goroutine 1 [running]: panic(0x458300, 0xc82000a170) /home/wdy/go/src/runtime/panic.go:464 +0x3e6 main.main() /home/wdy/learn/program-learn/golang/learnchannel.go:27 +0x1e exit status 2 P2. Closing a closed channel. 实例: fu...阅读全文

博文 2017-07-06 04:07:24 kingeasternsun

Golang Read CSV File From HTTP Request

发送请求到Go后端服务: curl -X POST \ http://127.0.0.1:11111/api/product/upload\ -H 'Content-Type: multipart/form-data' \ -F product_file=@products.csv 注意:Content-Type 需要传递为 multipart/form-data Go 服务读取文件CSV文件 file, fileHeader, _ := r.FormFile("product_file") defer file.Close() fmt.Println(fileHeader.Filename) // products.csv fmt.Println(fileHeader.Header) //...阅读全文

博文 2020-01-18 15:32:43 七秒钟回忆待续

golang并发----利用close(channel)实现任务取消

所有channel接收者都会在channel关闭时 立刻从阻塞等待中返回 ok值为false 这个广播机制经常被利用进行向多个订阅者同时发送信号 例如退出信号 func dowork() { fmt.Println("do work.") time.Sleep(time.Second) } func iscanceled(cancelchan chan struct{}) bool { select { case <-cancelchan: return true default: return false } } // 向cancelch中发送数据只能通知一个goroutine func cancel1(cancelch chan struct{}) { cancelch <- struc...阅读全文

Go 语言 Channel 实现原理精要

Home Menu Go 语言 Channel 实现原理精要 23 Mar 2019 Channel 并发编程 Golang Go实现原理 概述 设计原理 数据结构 基本操作 创建 发送 直接发送 缓冲区 阻塞发送 小结 接收 直接接收 缓冲区 阻塞接收 小结 关闭 总结 相关文章 Reference 这一节中的内容总共包含两个部分,我们会先介绍 Channel 的设计原理以及它在 Go 语言中的数据结构,接下来我们会分析常见的 Channel 操作,例如创建、发送、接收和关闭的实现原理,由于在 Range 和 Select 两节中我们会提到 Channel 在不同的控制结构中组合使用时的现象,所以这一节还是会将重点放到 Channel 的常见操作上。 概述 作为 Go 语言中核心的数据结构...阅读全文

博文 2019-03-31 11:43:25 draveness.me

使用GAE Standard环境发送http请求

在GAE Standard环境中,不能直接使用Golang的http包发送网络请求,需要使用如下形式才能发送网络请求。 import ( "fmt" "net/http" "google.golang.org/appengine" "google.golang.org/appengine/urlfetch" ) func handler(w http.ResponseWriter, r *http.Request) { ctx := appengine.NewContext(r) client := urlfetch.Client(ctx) resp, err := client.Get("https://www.google.com/") if err != nil { http.Erro...阅读全文

博文 2017-06-26 04:06:44 阿莱_1b6f

使用aws sqs 做缓冲队列(go)

背景 作为一位刚进公司的小白,参与到项目的第一个任务是为操作记录的存储增加消息队列,为什么我们要这么做呢?原因如下:在现有系统中我们直接将用户的操作记录增加到mongodb数据库中,但是在我们的系统出现峰值的时候,发现mongodb受不了,为此我们要做到削峰这个功能,按照惯例我们想到了使用消息队列,同时由于我们在项目中普遍采用aws的云服务,为此我们采用了aws的消息队列。 注意事项 aws sqs 收费是按照请求次数收费所以要尽量使用批量操作 aws sqs 的消费上线是12000次,最多允许12000个在传递的数据 aws sqs 容量无限大 aws sqs 的批量操作的上限是10条数据(毕竟是按次数收费) aws sqs并行取数据的过程中可能会出现重复,我们利用数据库的ID来去重,注意...阅读全文

博文 2019-10-26 16:32:45 zhuchenshu