Go
2022-01-05
63
go modGO111MODULE 有三个值:off, on和auto(默认值)GO111MODULE=off,go命令行将不会支持module功能,寻找依赖包的方式将会沿用旧版本那种通过vendor目录或者GOPATH模式来查找。GO111MODULE=on,go命令行会使用modules,而一点也不会去GOPATH目录下查找。GO111MODULE=auto,默认值,go命令行将会根据当前目录来决定是否启用module功能。这种情况下可以分为两种情形:当前目录在GOPATH/src之外且该目录包含go
2022-01-05
116
包的介绍和定义包(package)是多个Go源码的集合,是一种高级的代码复用方案,Go语言为辅我们提供了很多内置包,如fmt/strconv/strings/sort/errors/time/encoding/json/os/io等。Golang中的包可以分为三种:1. 系统内置包 2. 自定义包 3. 第三方包系统内置包:Golang语言给我们提供的内置包,引入后可以直接使用,如fmt/strconv/strings/sort/errors/time/encoding/json/os/io等。自定义包:
2022-01-05
33
今天突然想起来很多年前去一家游戏公司现场面试遇到的一个逻辑题,题目是有N个小朋友围在一起从1开始报数,报到3的出列,然后剩下的人重新报数,问最后剩下的小孩是谁,试写一些伪代码。当时第一反应是采用常规的递归算法实现了,当时对方赞同但并不满意,随即补充了一个条件,假定N的人数为2时,如何才能进行递归?当时真是一下子懵逼了,想好好久,在对方提示下采用了链轮方式,发现代码不但精简很多而且逻辑更清晰。后来有次做棋牌游戏的出牌坐次需求时还真的给用上了。下面分享下相关代码和逻辑步骤。逻辑步骤:第一步,要将要看似是队列结
2022-01-05
36
关于闭包变量逃逸
请看下面一段代码:func f() *Cursor {var c Cursorc.X = 500return &c
}在Go语言中 方法内定义了一个变量c ,并最后返回其地址,理论上函数内定义变量使用的是函数内的栈空间,当函数返回时候栈空间就会释放掉,但是golang 使用了escape analyze 语法会自动识别出这种这种变量,并在堆中给其分配内存空间,二不是在函数的栈中。这种情况就是闭包逃逸,并移到了堆中。
返回一个闭包时,并不是单纯的返回一个函数,而是返回了一个结构体,记录下函
2022-01-05
42
手撸golang etcd raft协议之3
缘起
最近阅读 [云原生分布式存储基石:etcd深入解析] (杜军 , 2019.1)
本系列笔记拟采用golang练习之
gitee: https://gitee.com/ioly/learning.gooop
raft分布式一致性算法
分布式存储系统通常会通过维护多个副本来进行容错,
以提高系统的可用性。
这就引出了分布式存储系统的核心问题——如何保证多个副本的一致性?Raft算法把问题分解成了领袖选举(leader election)、
日志复制(log
2022-01-05
95
go 常量
golang中的常量一般用const来定义
const声明多个常量多个常量声明const (a = 1b = "go"c = "java"
)值相同时,可省略const (n1 = 100n2n3
)常量计数器iota
在const关键字出现时将计数被重置为0。
const中每新增一行常量声明,计数+1(iota可理解为const语句块中的行索引)常规用法const (n1 = iota //0n2 //1n3 //2n4 //3
)跳过计数const
2022-01-05
41
go map
golang中的map是一种(无序的)key-value形式的数据结构,类似python中的字典,默认初始值为nil,map是引用类型,必须初始化才能使用。
map创建
直接创建/通过make创建
通过make创建时 make(map[keyType]valueType, [cap]), cap可省略
var userMap = map[String]String{"name": "admin","password": "password",
}codeMap := make(map[Str
2022-01-05
34
Println输出
Print系列函数会将内容输出到系统的标准输出,区别在于Print函数直接输出内容,Printf函数支持格式化输出字符串,Println函数会在输出内容的结尾添加一个换行符。
fmt.Println("Println输出,尾部会有换行符")
print("print输出")Fprint
Fprint系列函数会将内容输出到一个io.Writer接口类型的变量w中,我们通常用这个函数往文件中写入内容。
实例:
// 向标准输出写入内容
fmt.Fprintln(os.Stdout, "向标