go
tinysakurac
蹒跚学步的猿
展开
-
go文件操作大全
转载自鸟窝的博客[译]Go文件操作大全参考Go官方库的文件操作分散在多个包中,比如os、ioutil包,我本来想写一篇总结性的Go文件操作的文章,却发现已经有人2015年已经写了一篇这样的文章,写的非常好,所以我翻译成了中文,强烈推荐你阅读一下。原文: Working with Files in Go, 作者: NanoDano介绍万物皆文件UNIX 的一个基础设计就是"万物皆文件"...转载 2019-08-07 14:59:13 · 590 阅读 · 0 评论 -
go 函数类型(function types)
转载自咕咕鷄的博客从golang的官方文档得知function types的解释是这样的。A function type denotes the set of all functions with the same parameter and result types.先找个例子来看一下:package mainimport "fmt"// Greeting function ...转载 2019-08-27 09:03:05 · 1086 阅读 · 1 评论 -
go Tag详解
转载自OhBonsai的博客我们可以通过Tag来增强结构体的定义,Tag会带上一些meta信息,在本文中我们将通过几个例子来深入了解Tag的用法。结构Struct是由一组field组成,每个field包括了名字(可选)和字段类型package mainimport "fmt"type T1 struct { f1 string}type T2 struct { T1...转载 2019-08-27 11:51:10 · 5884 阅读 · 0 评论 -
import 下划线作用
import 下划线(如:import _ hello/imp)的作用:当导入一个包时,该包下的文件里所有init()函数都会被执行,然而,有些时候我们并不需要把整个包都导入进来,仅仅是是希望它执行init()函数而已。这个时候就可以使用 import _ 引用该包。即使用【import _ 包路径】只是引用该包,仅仅是为了调用init()函数,所以无法通过包名来调用包中的其他函数。示例目...转载 2019-08-28 20:56:00 · 816 阅读 · 0 评论 -
go time包定时器和断续器
定时器在time包中有两个函数可以帮助我们初始化time.Timertime.Newtimer函数初始化一个到期时间据此时的间隔为3小时30分的定时器t := time.Newtimer(3*time.Hour + 30*time.Minute)注意,这里的变量t是*time.NewTimer类型的,这个指针类型的方法集合包含两个方法Rest用于重置定时器该方法返回一个bool...转载 2019-08-29 09:19:48 · 225 阅读 · 0 评论 -
go runtime.Gosched()函数解析
runtime.Gosched()Go语言runtime.Gosched()函数的官方文档如下:func Gosched func Gosched()Gosched yields the processor, allowing other goroutines to run. It does not suspend the current goroutine, so executi...转载 2019-08-30 09:23:20 · 7288 阅读 · 4 评论 -
go闭包函数参数的作用
转载自cbsfly_的博客今天写代码的时候用到了协程go func,发现func函数块内部的代码也能使用外部的局部变量,当时我就加上了打印发现闭包内部的变量值和外部的局部变量是一样的,就觉得很费解匿名函数的传参是什么用的?然后我就做了个小实验,运行如下代码func main() { i := 1 go func() { time.Sleep(100*tim...转载 2019-08-30 09:35:28 · 793 阅读 · 0 评论 -
go goroutine泄露
什么是goroutine泄露Go 中的并发性是以 goroutine(独立活动)和 channel(用于通信)的形式实现的。处理 goroutine 时,程序员需要小心翼翼地避免泄露。如果最终永远堵塞在 I/O 上(例如 channel 通信),或者陷入死循环,那么 goroutine 会发生泄露。即使是阻塞的 goroutine,也会消耗资源,因此,程序可能会使用比实际需要更多的内存,或者最...转载 2019-08-30 10:45:08 · 1070 阅读 · 0 评论 -
go语言日志框架logrus
转载自李文周的博客logrus介绍Logrus是Go(golang)的结构化logger,与标准库logger完全API兼容。它有以下特点:完全兼容标准日志库,拥有七种日志级别:Trace, Debug, Info, Warning, Error, Fataland Panic。可扩展的Hook机制,允许使用者通过Hook的方式将日志分发到任意地方,如本地文件系统,logstash,e...转载 2019-08-30 14:25:55 · 1054 阅读 · 0 评论 -
go unsafe包使用
转载自stefno的博客什么是 unsafe前面所说的指针是类型安全的,但它有很多限制。Go 还有非类型安全的指针,这就是 unsafe 包提供的 unsafe.Pointer。在某些情况下,它会使代码更高效,当然,也更危险。unsafe 包用于 Go 编译器,在编译阶段使用。从名字就可以看出来,它是不安全的,官方并不建议使用。我在用 unsafe 包的时候会有一种不舒服的感觉,可能这也是语...转载 2019-08-22 17:17:46 · 149 阅读 · 0 评论 -
go select语句
简介go语言的select语句和其它语言有所不同select 是 Go 中的一个控制结构,类似于用于通信的 switch 语句。每个 case 必须是一个通信操作,要么是发送要么是接收。select 随机执行一个可运行的 case。如果没有 case 可运行,它将阻塞,直到有 case 可运行。一个默认的子句应该总是可运行的。注意select没有case运行的情况下是会阻塞的,如果想要...原创 2019-08-13 11:27:45 · 223 阅读 · 0 评论 -
go goroutine线程模型
转载自guyan0319的博客Go语言最大的特色就是从语言层面支持并发(Goroutine),Goroutine是Go中最基本的执行单元。事实上每一个Go程序至少有一个Goroutine:主Goroutine。当程序启动时,它会自动创建。为了更好理解Goroutine,现讲一下线程和协程的概念线程(Thread):有时被称为轻量级进程(Lightweight Process,LWP),...转载 2019-08-07 16:27:30 · 279 阅读 · 0 评论 -
go grountine通讯管道Channel
转载自鸟窝的博客什么是channelChannel是Go中的一个核心类型,你可以把它看成一个管道,通过它并发核心单元就可以发送或者接收数据进行通讯(communication)。它的操作符是箭头 <- 。(箭头的指向就是数据的流向)ch <- v // 发送值v到Channel ch中v := <-ch // 从Channel ch中接收数据,并将数据赋值给v...转载 2019-08-07 17:02:34 · 462 阅读 · 0 评论 -
Go 反射
转载自赵帅虎的博客飞雪无情的博客简介Reflection(反射)在计算机中表示 程序能够检查自身结构的能力,尤其是类型。它是元编程的一种形式,也是最容易让人迷惑的一部分。本文中,我们将解释Go语言中反射的运作机制。每个编程语言的反射模型不大相同,很多语言索性就不支持反射(C、C++)。由于本文是介绍Go语言的,所以当我们谈到“反射”时,默认为是Go语言中的反射。阅读建议本文中,我们...转载 2019-08-12 10:54:16 · 864 阅读 · 0 评论 -
go语言 grpc入门
what grpcgRPC is a modern open source high performance RPC framework that can run in any environment. It can efficiently connect services in and across data centers with pluggable support for load b...原创 2019-08-25 15:25:25 · 796 阅读 · 0 评论 -
grpc命令行工具grpcurl使用
安装go get github.com/fullstorydev/grpcurlgo install github.com/fullstorydev/grpcurl/cmd/grpcurl注册reflection服务grpcurl对于其他grpc服务的感知皆来自reflection服务,所以在注册自己的服务之前需要先注册reflection服务,否则会提示$ grpcurl -pla...原创 2019-08-25 16:46:59 · 17993 阅读 · 0 评论 -
字节序与go binary库
二进制协议基于文本类型的协议(比如 JSON)和二进制协议都是字节通信,他们不同点在于他们使用哪种类型的字节和如何组织这些字节。文本协议只适用于 ASCII 或 Unicode 编码可打印的字符通信。例如 “26” 使用 “2” 和 “6” 的 utf 编码的字符串表示,这种方式方便我们读,但对于计算机效率较低。在二进制协议中,同样数字 “26” 可使用一个字节 0x1A 十六进制表示,减少...原创 2019-08-12 16:03:40 · 2267 阅读 · 0 评论 -
如何使用bit位更高效的声明协议状态
前言众所周知一个byte由8位bit组成,当我们表示一个状态时没有必要使用整个字节而是转为使用一个字节的一位或连续几位,这样做可以有效的减少协议头长度,提高传输效率。而如何灵活的使用bit表示状态,则需要对位操作比较熟悉。下面通过go语言rpcx协议的设计为示例进行介绍。rpcx使用的字节序是大端序(也是几乎所有网络协议的选择),如果对字节序不够了解的读者可以参考我的这篇博客rpcx协议r...原创 2019-08-12 20:15:39 · 650 阅读 · 0 评论 -
go Context深入理解
转载自飞雪无情的博客Context背景 和 适用场景golang在1.6.2的时候还没有自己的context,在1.7的版本中就把golang.org/x/net/context包被加入到了官方的库中。golang 的 Context包,是专门用来简化对于处理单个请求的多个goroutine之间与请求域的数据、取消信号、截止时间等相关操作,这些操作可能涉及多个 API 调用。比如有一个网络请...转载 2019-08-13 11:15:20 · 281 阅读 · 0 评论 -
logrus使用进阶
文件名与行号logrus的一个很致命的问题就是没有提供文件名和行号,这在大型项目中通过日志定位问题时有诸多不便。Github上的logrus的issue#63:Log filename and line number创建于2014年,四年过去了仍是open状态~~~网上给出的解决方案分位两类,一就是自己实现一个hook;二就是通过装饰器包装logrus.Entry。两种方案网上都有很多代码,但...转载 2019-08-30 14:50:26 · 2128 阅读 · 3 评论