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

【公告】寻找社区日常运营、功能开发、维护 自愿者

本站 2013 年上线以来,得到国内广大 gopher 们的支持,也让我有动力一直开发、维护着。 随着 go 越来越流行,学习 go 的人也越来越多,本社区用户量也越来越大,而我个人的精力有限。为了给社区用户提供更好的服务,希望有自愿者加入社区,一起维护、运营本站。招募的自愿者包括: 1. 日常网站运营 —— 比如晨读文章推荐、周推荐等;**特别欢迎在校大学生;** 2. 功能开发、维护 —— 参与开发本站功能;板块维护、管理者等; 3. 活动组织、宣传者 —— 组织社区用户参与互动,和外界联系拉赞助等; 4. 翻译 —— Go 相关教程、文章、资讯等的翻译; 其他你想到的,也可以和我沟通~ 根据情况,会提供奖励~ 有兴趣的可以回复本贴留下联系方式或加我 qq或微信...阅读全文

golang中strings包用法

本文转自Golove博客:http://www.cnblogs.com/golove/p/3236300.html strings 包中的函数和方法 // strings.go ------------------------------------------------------------ // Count 计算字符串 sep 在 s 中的非重叠个数 // 如果 sep 为空字符串,则返回 s 中的字符(非字节)个数 + 1 // 使用 Rabin-Karp 算法实现 func Count(s, sep string) int func main() { s := "Hello,世界!!!!!" n := strings.Count(s, "!") fmt.Println(n) //...阅读全文

博文 2016-01-18 23:00:04 chenbaoke

golang IO COPY

使用golang实现 IO copy,测试程序如下: package main import ( "fmt" "io" "os" "syscall" ) func main() { var errCh chan error errCh = Go(func() error { return test_stdout() }) if err := <-errCh; err != nil { fmt.Printf("End io_copy: %s\n", err) //return err } } //异步执行 func Go(f func() error) chan error { ch := make(chan error, 1) go func() { ch <- f() }() return...阅读全文

博文 2015-10-30 19:00:03 golang_yh

golang中timer定时器实现原理

一般我们导入import ("time")包,然后调用time.NewTicker(1 * time.Second) 实现一个定时器: func timer1() { timer1 := time.NewTicker(1 * time.Second) for { select { case <-timer1.C: xxx() //执行我们想要的操作 } } } 再看看timer包中NewTicker的具体实现: func NewTicker(d Duration) *Ticker { if d <= 0 { panic(errors.New("non-positive interval for NewTicker")) } // Give the channel a 1-element ti...阅读全文

博文 2015-07-28 15:00:01 webyh

深入浅出Golang的协程池设计

教程制作: IT无崖子(刘丹冰) 教程简介:本教程主要针对具有一定编程基础的学员,懂得基本的编程语法。 使用Go语言实现并发的协程调度池阉割版,本文主要介绍协程池的基本设计思路,目的为深入浅出快速了解协程池工作原理,与真实的企业协程池还有很大差距,本文仅供学习参考。 一、何为并发,Go又是如何实现并发? gopool1.jpeg gopool2.jpeg 并行的好处: 同一时刻可以处理多个事务 更加节省时间,效率更高 具有并行处理能力的程序我们称之为“并发程序” 并发程序的处理能力优势体现在哪里? goPool3.jpeg 二、Go语言如何实现并发? package main import "fmt" import "time" func go_worker(name string) { f...阅读全文

博文 2018-10-14 14:34:38 IT无崖子

golang channal中buf和for range一些用法

go的gocontinue用法实现了轻量级的线程,可以被大量创建。线程之间用channal通信,以下说说基本用法。 channal的buf c:=make(chan int ,3) 3就是设定的chanal的缓存量,缓存只意味着这个创建的channal可以同时存入3个数据,并不意味读channal时可以同时读出。 x:=<-c 读channal时仍然是以阻塞的方式一次一个地将数据读出。 当channal缓存中存在有效数据时,即使close掉channal,仍然可以读出buf里的数据。需要注意的是,从close掉的channal读数据时,channal是不阻塞的,当channal中的buf数据被读完时,仍然会以不阻塞的方式读出0值。 channal的for range c:=make(chan...阅读全文

博文 2015-12-21 16:00:01 iwbno1

golang bytes buffer代码剖析

//上数据结构,bytes Buffer type Buffer struct { buf []byte // byte切片 off int // 从&buf[off]地址读数据, 从&buf[len(buf)]地址写数据 runeBytes [utf8.UTFMax]byte // avoid allocation of slice on each WriteByte or Rune bootstrap [64]byte // memory to hold first slice; helps small buffers (Printf) avoid allocation. lastRead readOp // last read operation, so that Unread* ca...阅读全文

博文 2015-10-25 17:00:02 webyh

golang -- TCP服务器(2)

tcp服务器 包括日志,定时处理,广播,超时 map写添加了锁(读不用锁) 添加了解码器 删除了addr-buf映射,添加删除锁 mark:今天听大神所要处理系统中断EINTR, 以后做简单处理EINTR--retry mark:用struct封装addr, net.Listener, exit(是否断开)等信息..最重要的是使用: br := bufio.NewReader(conn), bw := bufio.NewWriter(conn)来取代读循环,这样就可以需要的时候再读/写 https://github.com/zhangpeihao/gortmp/blob/master/server.go package main import ( "bytes" "encoding/bina...阅读全文

博文 2014-10-04 19:27:04 flyking

GO 语言开发实例:TCP端口共用服务器

GO 语言开发实例:TCP端口共用服务器 应用提出:”串口服务器“ 是 一种配置硬件。基本工作原理是 反向telnet,将一个console口映射为一个 TCP端口。 现在需要 “多用户同时共用”的功能。即:同一个TCP端口,允许多个用户同时登录,每个用户的输出都被输出到这个TCP端口,而这个TCP端口的输出数据,重复输出给所有的用户。 用GO语言实现这个应用,简直太容易了, 从网上找到 web_agent 的示范代码, 用一个map[int]Net.Conn 来记录所有的登录用户,从目标端口读数据的goroutine单独go,main 过程中,每个Accept单独go一个独立用户,定向到目标端口即可。 全部代码不超过200行。太给力了...阅读全文

键-文件存储系统weedfs

2012-12-31 键-文件存储系统weedfs weedfs 是跟据facebook的一篇论文 用go语言实现的key-file存储系统。 论文中facebook面临海量的photo存储,数据特点是一次写,读频繁,无修改,很少删除。 分析基于POSIX系统在此应用场景中主要的问题是元信息存储在磁盘,读元信息的磁盘IO成为性能瓶颈-- 第一次(可能是多次)读盘将文件名转为i结点,第二次读盘读入i结点,第三次读盘才是读数据。 设计目标: 高吞吐低延时 元信息全部存储在内存,避免多次的磁盘IO 容错 简单 facebook的原始设计 浏览器请求被重定向到CDN,CDN中如果缓存了该图片则直接返回,否则查询Photo存储服务器。 Photo存储服务器是用NFS搞的,他们改了内核做了个文件描述符的...阅读全文

博文 2015-03-16 11:50:54 zenlife

golang通过socket与java通讯

作为计算机专业的学生(虽然很水),直到今天还有二年级的师弟问我计算机专业学计算机网路基础究竟有什么作用?项目中是否只能用一门编程语言?……解释了半天,没能解释明白(原谅计算机专业读久了,口才真的变烂了),于是写下这篇文章。 本文主要是实现echo服务器/客户端,服务器采用golang编写,客户端采用java编写(别问我为什么不用C++,如果会早就用了),本文的目的是为了说明,现代编程中,网络是十分重要的,另外一个项目中,不仅仅只能用一门编程语言,由于本人也是入门,写的不好地方,望指正,谢谢。有不懂的,可评论,下面上代码: //server.go //客户端,主要是在9000端口创建监听程序,用于接受客户端连接 package main import ( "bufio" "fmt" "log"...阅读全文

博文 2015-12-12 01:00:10 u013025612

go 按行读文件问题

刚学go,我想读一个文件,一行一行读,从网上找到哪下代码,可以运行,但却搞不懂为什么这么写: 问题在下面代码里面,请大家详细回复一下,实在搞不懂这语法 path := "test.txt" log.Print(path) file, err := os.Open(path) //func Open(name string) (*File, error) Open返回的是 *File //func NewScanner(r io.Reader) *Scanner //但是NewScanner 的入参是 io.Reader,为什么file能传入 NewScanner 呢? scanner := bufi...阅读全文

golang time操作整理

这里的内容大部分是从他人处整理得到 http://my.oschina.net/1123581321/blog/190942 时间戳 当前时间戳 fmt.Println(time.Now().Unix()) # 1389058332str格式化时间 当前格式化时间 fmt.Println(time.Now().Format("2006-01-02 15:04:05")) # 这是个奇葩,必须是这个时间点, 据说是go诞生之日, 记忆方法:6-1-2-3-4-5 # 2014-01-07 09:42:20时间戳转str格式化时间 str_time := time.Unix(1389058332, 0).Format("2006-01-02 15:04:05") fmt.Println(str_...阅读全文

博文 2016-03-02 16:00:07 shenlanzifa

随手记——Go (Golang)

---------------------------------------- 2014-02-26 139K goroutines 支撑 68K 活跃连接, 每个连接有两个goroutine ,因为net包的write和read是阻塞的,只能是1:2。这条推特的意义在于,证明了了GOLANG的并发模型,解决了服务器端的 C10K 问题,而且是突破了 10K ,达到了 68K。 ---------------------------------------- 2014-05-13 Android:现实世界的购物平台 越过各种软件更新的小树叶,我们所看到的是Google辛勤栽种的一整片森林。将定位功能(包括离线地图)与行为识别、文字广告和强大的即时购买联系到一起,不难看出Google正将这广...阅读全文

博文 2014-10-20 18:00:06 leonzhouwei

go lang学习笔记——channel机理及调度理解

《Go语言编程》一书介绍了libtask库,可以认为这个库等同于go的底层goroutine实现。 libtask库的channel的数据结构如下: struct Alt{ Channel *c; void *v; unsigned int op; Task *task; Alt *xalt;}; struct Altarray{ Alt **a; unsigned int n; unsigned int m;}; struct Channel{ unsigned int bufsize; unsigned int elemsize; unsigned char *buf; unsigned int nbuf; unsigned int off; Altarray asend; Altarr...阅读全文

博文 2015-06-17 23:08:22 nobugtodebug

go lang学习笔记——channel机理及调度理解

《Go语言编程》一书介绍了libtask库,可以认为这个库等同于go的底层goroutine实现。libtask库的channel的数据结构如下:struct Alt{ Channel *c; void *v; unsigned int op; Task *task; Alt *xalt;};struct Altarray{ Alt **a; unsigned int n; unsigned int m;};struct Channel{ unsigned int bufsize; unsigned int elemsize; unsigned char *buf; unsigned int nbuf; unsigned int off; Altarray asend; Altarray a...阅读全文

博文 2015-05-14 03:00:01 nobugtodebug

sync包下的mutex理解

Go中`sync`包下有2种`mutex`实现: * `sync.Mutex` * `sync.RWMutex` `Mutex`底层基于`sync/atomic`实现了 [Compare and Swap](https://en.wikipedia.org/wiki/Compare-and-swap). 由于该算法逻辑只需要一条汇编就可以实现,在单核CPU上运行是可以保证原子性的,但多 核CPU上运行时,需要加上`LOCK`前缀来对总线加锁,从而保证了该指令的原子性: ``` // src/sync/atomic/asm_amd64.s#L35 TEXT ·CompareAndSwapInt32(SB),NOSPLIT,$0-17 JMP ·Compar...阅读全文

Go 语言中文网微信公众号支持查询本站内容

Go 语言中文网微信公众号在昨天(2017年7月18日)正式和本站打通,可以通过微信公众号聊天窗口查询本站内容,比如输入 晨读、最新晨读、主题、文章、资源、项目、图书 等等。如图: 关注后,以及输入 晨读 ![wx_2.png](http://studygolang.qiniudn.com/170719/ce618b2e148ffc4e9e47785641bfacd1.png) 输入 文章 ![wx_1.png](http://studygolang.qiniudn.com/170719/d78ba91f71cbd66d72f98def1c8800d2.png) 赶紧关注我们吧 ![wx_studygolang](http://studygolang.qi...阅读全文

GO语言练习:channel 缓冲机制

1、代码 2、运行 3、解析 1、代码 buffer.go 1 package main 2 3 import ( 4 "fmt" 5 "time" 6 ) 7 8 func readThread(ch chan int) { 9 fmt.Println("read for reading...") 10 for i := range ch { 11 fmt.Println("get i : ", i) 12 if 20 == i { 13 break 14 } 15 time.Sleep(1e8) 16 } 17 fmt.Println("read over...") 18 } 19 20 func main() { 21 ch := make(chan int, 1024) 22 go ...阅读全文

博文 2015-07-19 03:00:02 fengbohello

Go语言编程--读后感

图灵出的《Go语言编程》拿到手后稍稍有点失望,书太薄了,才230页。阅读完后,说实话,作为Go语言入门书籍,实用性比不上邢星翻译的那本GO中文学习书。把它当作Go语言工具书,内容和老外写的又差的太远。所以,我的结论是:还行,不是最好的,也不是最差的。对于Go语言有兴趣而又不了解的朋友,值得买来看看。但对于Go语言的职业开发者,建议还是看老外写的Go语言工具书。例如,《The.Way.To.Go.A.Thorough.Introduction.To.The.Go.Programming.Language》,《Programming.in.Go.Creating.Applications.for.the.21st.Century...阅读全文

博文 2014-12-24 00:00:01 cometwo

golang time操作整理

这里的内容大部分是从他人处整理得到 http://my.oschina.net/1123581321/blog/190942 时间戳 当前时间戳 fmt.Println(time.Now().Unix()) # 1389058332str格式化时间 当前格式化时间 fmt.Println(time.Now().Format("2006-01-02 15:04:05")) # 这是个奇葩,必须是这个时间点, 据说是go诞生之日, 记忆方法:6-1-2-3-4-5 # 2014-01-07 09:42:20时间戳转str格式化时间 str_time := time.Unix(1389058332, 0).Format("2006-01-02 15:04:05") fmt.Println(str_...阅读全文

博文 2015-11-06 17:00:13 u012210379

Golang 速查表

译文地址:blog原文:golang-cheat-sheet 简要概括 Go 语法及特性。 目录 基础语法 运算符 算术运算符 比较运算符 逻辑运算符 其他 声明 函数 函数作为值和回调使用 可变参数函数 内置类型 类型转换 package 流程控制结构 条件判断(if) 循环(for) 多条件分支(switch) array, slice, range array slice array 和 slice 的操作函数 map 结构体 指针 接口 结构体和接口的组合嵌入 Errors 并发 goroutine channel channel 开发原则 输出 代码片段 Http-Server 前言 参考 文中大部分代码都摘抄自 A Tour of Go,对新手来说是很好的参考资料。 Go 特性 ...阅读全文

博文 2018-06-11 20:34:37 wuYin

[go语言]channel的一个“奇怪”特性

(转自go技术晨读) go语言的channel有一个看上去很奇怪的特性,就是如果向一个为空值(nil)的channel写入或者读取数据,当前goroutine将永远阻塞。 以上四个main函数都会永远阻塞(但是因为没有其他goroutine,所以runtime会报告一个deadlock错误) 为什么go team 要这么设计呢? 据说是为了实现一个叫“guarded selective wating”的模式,及条件等待:在select中的一些case中如果对应的条件不满足就不在这个case上等待。 有这样一个场景: 利用nil channel特性,可以非常优雅的实现: 以上是利用nil channel实现的永久阻塞。 ——-——————————— 华丽分割线 —————————————— 如...阅读全文

博文 2015-06-17 23:00:30 EthanDorisHope

Golang定时器陷阱

所谓陷阱,就是它不是你认为的那样,这种认知误差可能让你的软件留下隐藏Bug。刚好Timer就有3个陷阱,我们会讲1)Reset的陷阱和2)通道的陷阱,3)Stop的陷阱与Reset的陷阱类似,自己探索吧。 Reset的陷阱在哪 Timer.Reset()函数的返回值是bool类型,我们看一个问题三连: 它的返回值代表什么呢? 我们想要的成功是什么? 失败是什么? 成功:一段时间之后定时器超时,收到超时事件。 失败:成功的反面,我们收不到那个事件。对于失败,我们应当做些什么,确保我们的定时器发挥作用。 Reset的返回值是不是这个意思? 通过查看文档和实现,Timer.Reset()的返回值并不符合我们的预期,这就是误差。它的返回值不代表重设定时器成功或失败,而是在表达定时器在重设前的状态: ...阅读全文

博文 2018-09-08 09:34:39 shitaibin

golang chan 单项通道与多项通道

package main import ( "fmt" ) func main() { var chan_test chan interface{} //双项通道 var read_test <-chan interface{} //单项通道 只支持 读 var write_test chan<- interface{} //单项通道 只支持 写 read_test <- "xiao" //会报错。因为这个通道 只是单项通道只支持读 不支持写 <-write_test //会报错。因为这个通道 只是单项通道只支持写 不支持读 fmt.Println(chan_test) fmt.Println(read_test) fmt.Println(write_test) ...阅读全文

博文 2016-11-22 09:00:03 liangguangchuan

协程调度时机二:Channel读写

---- *说明* ---- Golang中channle是协程间信息交互的主要手段。Golang的channel分为有缓冲和无缓冲两种,关于他们之间的用法区别可以自行google,这里不再赘述。Golang中的channel读写均是同步语义,写满的、读空的channel都会触发协程调度。 ------------- *向channel写数据* ------------- 无论是无缓冲还是有缓冲channel,当向channel写数据发现channel已满时,都需要将当前写的协程挂起,并进行一次调度,当前M转而执行P内的其他协程。直到有人再读该channel时发现有阻塞等待写的协程时将其唤醒。 func chansend(t *chantype, c *hchan, ep unsafe.Po...阅读全文

博文 2017-12-07 05:51:50 丁凯

go channel总结

1、创建 无缓冲 var chs1 = make(chan int) var chs2 = make(chan float64) var chs3 = make(chan string) 有缓冲 var chs1 = make(chan int, 3) var chs2 = make(chan float64, 3) var chs3 = make(chan string, 3) 有缓冲和无缓冲的区别: 写数据时缓冲模式且缓冲未满时可以直接写入,不会阻塞,缓冲满时会阻塞等待对方读, 无缓冲模式写入会阻塞到对方读完数据 读数据缓冲模式可以读取缓冲已有的数据,否则需要阻塞等待对方写 无缓冲模式需要阻塞等待对方写 2、关闭 var chs1 = make(chan int) close(chs1)...阅读全文

博文 2016-04-29 21:00:02 chukuang2004

2016 Go for it!

想起了一句话普通但深意满满的话叫做“光阴似箭,日月如梭”,两年的时间说长不长,说短不短,但却能把一个人脑中的想法改变,两年来自己在提高班感受的很多,就如同给徒弟开会的时候说的“开始很是喜欢听米老师的故事,后来是听一个个故事中为人处世,做人之道,学习之道,时间观念之道等等”。说说自己在2016这前半年的收获吧! 计算机: 看着很少,但其中的内容确实很多,每一个都是自己努力完成的劳动成果。。。 英语: 英语坚持说了半年感觉自己是每一天都在发生着变化,虽然有的时候还是有点听不懂别人说的陌生词,但通过多问,多说,多听进度还是挺大的。下面的是我学习英语的一个小小的记录,还有的是没有记录的,几乎是天天都在学习呦!!! 自考: 计划每天都要花一个小时的时间去学习自考和每年的学习方法是一样的,但不一样的确实...阅读全文

自定义协议/解决tcp粘包问题(golang版本)

Tcp/Udp介绍 Tcp是字节流协议, 数据传输像流水一样没有边界, 那么对等方在一次数据读取后,无法分辨读取是一个消息还是多个,或者是不足一个, 那么对等方拿到"残缺"消息就不知道如何处理. Udp是基于消息的传输服务,每个消息就是一个报文,是有边界的,对等方每次接收都是一个完整的消息.这样就需要我们在应用层,自己来区分. 粘包是如何出现的? 用户进程write消息, 但内核缓存区不足以容乃这个完整的消息, 一个消息分多次发送出去, 接收的时候就可能一个消息分多次接收 Tcp的报文段有大小限制(MSS) IP层最大传输单元(MTU), 会对包进行分片, 其他, Tcp流量控制, 拥塞控制 一般有三种常见的方式 1. 定长消息 发送端和接收端约定消息长度, 缺点: 消息很短时, 效率很低,...阅读全文

博文 2018-11-17 14:34:43 weiwenwang

NSQ 源码阅读 (四) diskqueue 文件读写

引言 我们在这个系列第一篇文章中提到过,如果需要消息落地而对存储子系统的选择上,从速度上来说 文件系统>分布式KV(持久化)>分布式文件系统>数据库。而NSQ选择了文件系统作为存储子系统。这篇文章将重点介绍nsq 对于文件的操作。 何时写入文件? 在内存的msg chan buffer 已满的时候,会将msg 写入文件,代码如下: func (c *Channel) put(m *Message) error { select { case c.memoryMsgChan <- m: default: b := bufferPoolGet() err := writeMessageToBackend(b, m, c.backend) bufferPoolPut(b) c.ctx.nsqd.S...阅读全文

博文 2017-09-19 15:34:45 buptztd

自定义协议/解决tcp粘包问题(golang版本)

### Tcp/Udp介绍 Tcp是字节流协议, 数据传输像流水一样没有边界, 那么对等方在一次数据读取后,无法分辨读取是一个消息还是多个, 或者是不足一个, 那么对等方拿到"残缺"消息就不知道如何处理. Udp是基于消息的传输服务,每个消息就是一个报文,是有边界的,对等方每次接收都是一个完整的消息. 这样就需要我们在应用层, 自己来区分. ### 粘包是如何出现的? - 用户进程write消息, 但内核缓存区不足以容乃这个完整的消息, 一个消息分多次发送出去, 接收的时候就可能一个消息分多次接收 - Tcp的报文段有大小限制(MSS) - IP层最大传输单元(MTU), 会对包进行分片, - 其他, Tcp流量控制, 拥塞控制 一般有三种常见的方式 #### 1. 定长消息 发送端和接收端...阅读全文

博文 2018-11-19 10:46:14 weiwenwang

2018年38粥记

2018年38周(9月17号-9月23号) 读书(非技术)10个 《暗逻辑》174-204/309,1个。 原来杨虎城改过名字,之前叫杨虎臣。 民国有过“军阀割据时代”,五代十国,唐后期也一样,直到宋才统一。 《历代经济变革得失》20-210/192,8个。 虽然书名跟钱穆先生的有点像,但这本书更易读。 这样的大佬出来割韭菜确实有收割的能力,很多观点或看法在他成书前可能就形成了,所以一些东西会看得更透,更远,维度也更高啊。 无论是想到作者的思路还是从书中得到知识,本书还是值得一读的。 《如何让你的阅读更高效》 10-62/227,1个。 算随笔吧,偶然下到的,闲来读读。 主要我读的书的总量也不少了,第1个番茄钟读来,基本都是实践过的,无非get点方法,让自己更高效点,更功利点,更体系点。 电...阅读全文

博文 2018-09-24 22:34:39 im天行

2016 Go for it!

想起了一句话普通但深意满满的话叫做“光阴似箭,日月如梭”,两年的时间说长不长,说短不短,但却能把一个人脑中的想法改变,两年来自己在提高班感受的很多,就如同给徒弟开会的时候说的“开始很是喜欢听米老师的故事,后来是听一个个故事中为人处世,做人之道,学习之道,时间观念之道等等”。说说自己在2016这前半年的收获吧! 计算机: 看着很少,但其中的内容确实很多,每一个都是自己努力完成的劳动成果。。。 英语: 英语坚持说了半年感觉自己是每一天都在发生着变化,虽然有的时候还是有点听不懂别人说的陌生词,但通过多问,多说,多听进度还是挺大的。下面的是我学习英语的一个小小的记录,还有的是没有记录的,几乎是天天都在学习呦!!! 自考: 计划每天都要花一个小时的时间去学习自考和每年的学习方法是一样的,但不一样的确实...阅读全文

## bufio.NewScanner的使用问题

最近开始学习golang,发现确实很给力,写了一个回射服务器代码,了解到可以阻塞读数据,也可以借助bufio中的**NewScanner**,我理解这是一个扫描器,用法也大概研究了一下,结果写完代码在linux上没有问题,运行正常,在windows却不能收到客户端数据,希望高手指点一二! 服务器启动后,通过客户端测试,效果如下: ![image.png](https://static.studygolang.com/171230/c99e4436e4d981a9504b1db8ec1d1926.png) 源代码如下: ``` go //回响服务器 package main import ( "time" "fmt" "log" "net" "bufio"/...阅读全文

strings包里面的Split函数的坑

无论哪种开发语言,Split函数都是经常用到。最近发现了strings包里的Split函数有个坑,真是活久见。 package main import "fmt" import "strings" func main() { str := "" v := strings.Split(str, "#") if len(v)%2 != 0 { fmt.Printf("v len is [%d]", len(v)) } } 期望获得结果应该是0,因为经常读数据字段的时候会做是不是几元组的判断。实际输出为: v len is [1] 来看Split的实现 func genSplit(s, sep string, sepSave, n int) []string { if n == 0 { retur...阅读全文

博文 2018-07-31 11:34:48 Cedrus

Golang学习笔记之集合(map)

Map 是一种无序的键值对的集合。Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值。 Map 是一种集合,所以我们可以像迭代数组和切片那样迭代它。不过,Map 是无序的,我们无法决定它的返回顺序,这是因为 Map 是使用 hash 表来实现的。 • 引⽤类型,哈希表。 • 键必须是⽀持相等运算符 (==、 !=) 类型,⽐如 number、 string、pointer、 array、 struct,以及对应的 interface。 • 值可以是任意类型,没有限制。 •map 的 0 值为 nil。试图给一个 nil map 添加元素给会导致运行时错误。 一、申明和初始化 可以通过将键和值的类型传递给内置函数 make 来创建一个 map。一般语法为: m...阅读全文

博文 2018-12-09 08:34:43 学生黄哲

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,...阅读全文

Go并发之channel

自公众号:灰子学技术原文链接:https://mp.weixin.qq.com/s/PIb-gGBootc6581pHhi5ew学习channel的时候,笔者问了自己几个问题,个人觉得弄明白了这些问题,至少应该会使用channel了。本文也会从这些问题着手,来讲解channel。问题1: 什么是channel?是用来做什么的?1.channel是Go里面的一种类型,它是Go语言为goroutine提供的一种通讯机制,不同的goroutine需要通过channel来相互通讯。2.channel是有类型的,并且还有方向,可以是单向的,也可以是双向的,类似与unix中的pipe(管道)。3.channel是通过<-和->来完成读写操作的,channel<-value(表示往channel写数据),...阅读全文

Golang并发模型:select进阶

最近公司工作有点多,Golang的select进阶就这样被拖沓啦,今天坚持把时间挤一挤,把吹的牛皮补上。 前一篇文章《Golang并发模型:轻松入门select》介绍了select的作用和它的基本用法,这次介绍它的3个进阶特性。 nil的通道永远阻塞 如何跳出for-select select{}阻塞 nil的通道永远阻塞 当case上读一个通道时,如果这个通道是nil,则该case永远阻塞。这个功能有1个妙用,select通常处理的是多个通道,当某个读通道关闭了,但不想select再继续关注此case,继续处理其他case,把该通道设置为nil即可。下面是一个合并程序等待两个输入通道都关闭后才退出的例子,就使用了这个特性。 func combine(inCh1, inCh2 <-chan ...阅读全文

博文 2018-12-18 09:34:44 大彬

深度剖析channel

##channel的用法 channel是golang中很重要的概念,配合goroutine是golang能够方便实现并发编程的关键。channel其实就是传统语言的阻塞消息队列,可以用来做不同goroutine之间的消息传递,由于goroutine是轻量级的线程能够在语言层面调度,所以channel在golang中也常被用来同步goroutine。 一般channel的声明形式为:var chanName chan ElementType ElementType指定这个channel所能传递的元素类型。 定义一个channel也很简单,直接使用内置的函数make()即可: ch := make(chan int,bufferSize) //bufferSize为缓冲区的大小,可以不传递该值...阅读全文

博文 2017-02-09 20:01:35 shanks

golang 版本的 ring buffer (变长,持久化)

最终的实现代码: https://github.com/esdb/drbuffer本文是整个 kafka agent 实现过程中的第一步:https://segmentfault.com/a/1190000004567774 内存结构 每个写入的packet格式如下 --- packet_size(uint16) --- packet_body([]byte) --- 通过存储packet的长度实现变长数据的存储。目标是把这样的内存结构存储到一个ring buffer里。整体的ring buffer的结构如下 --- <-- nextReadFrom packet 1 --- packet 2 --- <-- nextWriteFrom ... 除了每个packet是一个变长的结构体,貌似并...阅读全文

博文 2017-02-09 08:12:00 taowen

golang的websocket封装

实现代码如下: import ( "errors" "github.com/gorilla/websocket" "sync" ) type Connection struct { wsConn *websocket.Conn inChan chan []byte outChan chan []byte closeChan chan byte mutex sync.Mutex isClosed bool } func InitConnection(wsConn *websocket.Conn)(conn *Connection ,err error){ conn=&Connection{ wsConn:wsConn, inChan:make(chan []byte,1000), outCha...阅读全文

博文 2018-12-19 13:34:47 小小Desperado

每周计划

语言 周1、3、5英语学习 周2、4、6日语学习 周日复习,并写周总结 代码 周1、3、5 review 一篇完整代码 每周一篇随笔,记录优秀的代码设计 技术文章 周2、4、6精读一篇文章,并记录读后感 周日重新阅读读后感,并写周总结 新闻 每天阅读新闻: golang 日报,并挑选文章待精读 技术、科技、财经、政治 每日零碎时间 早晨通勤时间 : 语言学习 午休时间 : 新闻阅读 工作摸鱼时间 :review代码 / 技术文章 晚上通勤时间 :review代码 / 技术文章 晚上回家 :整理一天所学,并记...阅读全文

博文 2018-10-17 02:34:39 HinaKaze