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

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

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

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

深入浅出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 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

基于Gin框架封装go web项目骨架(GoSkeleton)

1.这是一个基于go语言gin框架的web项目骨架,定位于单体应用开发,其目的主要在于将web项目主线逻辑梳理清晰,最基础的东西封装完善,让开发者更多关注实际业务进行快速开发即可。 2.专注于前后端分离业务场景,开发常用模块齐全,从项目开发到上线、运维。我们提供了整套解决方案。 3.更多功能参见项目地址以及文档:https://gitee.com/daitougege/GinSkeleton 4.项目整体逻辑 ![图例](http://139.196.101.31:2080/GinSkeleton.jpg) 5.并发测试 > 2核4g云服务器并发测试, QPS 1 万+ ![QPS](http://139.196.101.31:208...阅读全文

开源项目 2020-08-20 14:58:32 张三丰

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 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

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

每周计划

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

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

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天行

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语言编程--读后感

图灵出的《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

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

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

2016 Go for it!

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

Golang读取文件三种方式

golang读取文件操作 func ReadFiles() { // ReadFile file, err := ioutil.ReadFile("./demo/mongo.go") if err != nil { fmt.Println(err.Error()) } else { fmt.Println(string(file)) } // open read f, err := os.Open("./demo/mongo.go") if err != nil { fmt.Println(err.Error()) } else { defer f.Close() var strings string for { buf := make([]byte, 1024) n, err := f.R...阅读全文

博文 2020-04-11 13:32:42 是个懒人

2016 Go for it!

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

golang 按行读取、读取整个文件

参考如下: https://studygolang.com/articles/21868?fr=sidebar 读取整个文件的四种方式: https://www.jianshu.com/p/711c453bff16 golang 按行读取文件 file, err := os.Open("app-2019-06-01.log") if err != nil { log.Fatal(err) } defer file.Close() scanner := bufio.NewScanner(file) for scanner.Scan() { lineText := scanner.Text() } golang 按文件读取 b, err := ioutil.ReadFile("app-2019-...阅读全文

博文 2020-01-15 13:32:41 翻江倒海一条鱼

键-文件存储系统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

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通过socket与java通讯

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

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

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

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

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

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

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

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

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

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

送你一份Redis书单,以后使用缓存的问题不用再问我啦!

经过了10多年的发展,Java Web从开发框架到社区都已经非常成熟,很多程序员都可以通过使用框架很快速地搭建起一个Java Web应用,特别是近几年SpringBoot大热,干脆连配置都不需要了解了,直接一键式编译部署运行,让Java工程师的入门成本变得越来越低。 但于此同时,互联网公司对于Java的应用场景也在不断地升级换代,从单机部署再到分布式,从SOA再到微服务,Java后端技术栈变得更加庞大,对于工程师的要求也越来越高,特别是对于大公司来说更是如此,Java Web工程师已经不复存在,而取而代之的是Java后端工程师,也就是说,我们这些Java程序员不仅要写好业务代码,还要更多地掌握后端技术,除了数据库之外,像是缓存、消息队列、定时任务、微服务等技术也都是我们需要掌握的内容。 今天...阅读全文

博文 2020-05-08 23:32:48 程序员黄小斜

协程调度时机二: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 丁凯

深度剖析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

Channel使用技巧

[原文地址](https://bingjian-zhu.github.io/2019/09/25/channel%E4%BD%BF%E7%94%A8%E6%8A%80%E5%B7%A7/) #### 前言 Go协程一般使用channel(通道)通信从而协调/同步他们的工作。合理利用Go协程和channel能帮助我们大大提高程序的性能。本文将介绍一些使用channel的场景及技巧 #### 场景一,使用channel返回运算结果 计算斐波那契数列,在学习递归时候这是个经典问题。现在我们不用递归实现,而是用channel返回计算得出的斐波那契数列。 计算前40个斐波那契数列的值,看下效率 ```go package main import ( "fmt" "time" ) //计算斐波那契数列并...阅读全文

博文 2019-09-25 20:34:58 939496716

## 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"/...阅读全文

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并发之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写数据),...阅读全文

博文 2019-09-07 11:27:29 ZhDavis

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

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

Golang定时器陷阱

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

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

送你一份Redis书单,以后使用缓存的问题不用再问我啦!

点击蓝色“程序员书单”关注我哟 加个“星标”,每天带你读好书! ![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")​ 经过了10多年的发展,Java Web从开发框架到社区都已经非常成熟,很多程序员都可以通过使用框架很快速地搭建起一个Java Web应用,特别是近几年SpringBoot大热,干脆连配置都不需要了解了,直接一键式编译部署运行,让Java工程师的入门成本变得越来越低。 但于此同时,互联网公司对于Java的应用场景也在不断地升级换代,从单机部署再到分布式,从SOA再到微服务,Java后端技术栈变得更加庞大,对于工程师的要求也越来越高,特...阅读全文

博文 2020-05-08 23:32:51 程序员书单

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

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

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

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

[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