golang

一致性哈希的golang实现

ε祈祈猫儿з 提交于 2019-12-04 23:15:06
一致性哈希背景和原理 点这里 源码实现 package consistent // import "stathat.com/c/consistent" import ( "errors" "hash/crc32" "sort" "strconv" "sync" ) type uints [] uint32 // Len returns the length of the uints array. func (x uints) Len() int { return len (x) } // Less returns true if element i is less than element j. func (x uints) Less(i, j int ) bool { return x[i] < x[j] } // Swap exchanges elements i and j. func (x uints) Swap(i, j int ) { x[i], x[j] = x[j], x[i] } // ErrEmptyCircle is the error returned when trying to get an element when nothing has been added to hash. var ErrEmptyCircle = errors.New(

golang基础教程

爷,独闯天下 提交于 2019-12-04 23:13:41
目录 golang基础教程(一)、环境搭建 golang基础教程(二)、开发规范及API golang基础教程(三)、变量与数据类型概述 golang基础教程(四)、基本数据类型 golang基础教程(五)、基本数据类型的转换 golang基础教程(六)、指针 golang基础教程(七)、数组 golang基础教程(八)、切片 golang基础教程(九)、map golang基础教程(十)、结构体 golang基础教程(十一)、方法 golang基础教程(十二)、继承 golang基础教程(十三)、接口、多态 golang基础教程(十四)、异常处理 golang基础教程(十五)、文件操作 golang基础教程(十六)、goroutine 和 channel使用 golang基础教程(十七)、GO并发原理 golang基础教程(十八)、反射 golang基础教程(十九)、tcp网络编程 golang基础教程(二十)、单元测试 golang基础教程(附录一)Golang代理配置,解决google包无法下载的问题 来源: CSDN 作者: iRich_全栈 链接: https://blog.csdn.net/weixin_37910453/article/details/87276411

golang之 iota 常量生成器

谁说胖子不能爱 提交于 2019-12-04 22:00:50
常量声明可以使用iota常量生成器初始化,它用于生成一组以相似规则初始化的常量,但是不用每行都写一遍初始化表达式。在一个 const 声明语句中,在第一个声明的常量所在的行, iota 将会被置为 0 ,然后在每一个有常量声明的行加一。 下面是来自time包的例子,它首先定义了一个 Weekday 命名类型,然后为一周的每天定义了一个常量,从周日 0 开始。在其它编程语言中,这种类型一般被称为枚举类型。 type Weekday int const (   Sunday Weekday = iota   Monday   Tuesday   Wednesday   Thursday   Friday   Saturday ) 周日将对应0,周一为1,如此等等。 我们也可以在复杂的常量表达式中使用iota,下面是来自 net 包的例子,用于给一个无符号整数的最低 5bit 的每个 bit 指定一个名字: type Flags uint const ( FlagUp Flags = 1 << iota // is up FlagBroadcast // supports broadcast access capability FlagLoopback // is a loopback interface FlagPointToPoint // belongs to a point-to

【转】 Golang输入输出格式化Printf Springf Fprintf..

烈酒焚心 提交于 2019-12-04 21:58:24
package mainimport "fmt"import "os"type point struct { x, y int}func main() { // Go 为常规 Go 值的格式化设计提供了多种打印方式。例 // 如,这里打印了 `point` 结构体的一个实例。 p := point{1, 2} fmt.Printf("%v\n", p) // 如果值是一个结构体,`%+v` 的格式化输出内容将包括 // 结构体的字段名。 fmt.Printf("%+v\n", p) // `%#v` 形式则输出这个值的 Go 语法表示。例如,值的 // 运行源代码片段。 fmt.Printf("%#v\n", p) // 需要打印值的类型,使用 `%T`。 fmt.Printf("%T\n", p) // 格式化布尔值是简单的。 fmt.Printf("%t\n", true) // 格式化整形数有多种方式,使用 `%d`进行标准的十进 // 制格式化。 fmt.Printf("%d\n", 123) // 这个输出二进制表示形式。 fmt.Printf("%b\n", 14) // 这个输出给定整数的对应字符。 fmt.Printf("%c\n", 33) // `%x` 提供十六进制编码。 fmt.Printf("%x\n", 456) // 对于浮点型同样有很多的格式化选项

golang之格式化fmt.Printf

為{幸葍}努か 提交于 2019-12-04 19:06:54
当使用fmt包打印一个数值时,我们可以用%d、%o或%x参数控制输出的进制格式,就像下面的例子: o := 0666 fmt.Printf("%d %[1]o %#[1]o\n", o) // "438 666 0666" x := int64(0xdeadbeef) fmt.Printf("%d %[1]x %#[1]x %#[1]X\n", x) // Output: // 3735928559 deadbeef 0xdeadbeef 0XDEADBEEF 注意fmt的两个使用技巧。通常Printf格式化字符串包含多个%参数时将会包含对应相同数量的额外操作数,但是%之后的 [1] 副词告诉Printf函数再次使用第一个操作数。第二,%后的 # 副词告诉Printf在用%o、%x或%X输出时生成0、0x或0X前缀。 字符使用 %c 参数打印通过一对单引号直接包含对应字符,或者是用 %q 参数打印带单引号的字符: ascii := 'a' unicode := '国' newline := '\n' fmt.Printf("%d %[1]c %[1]q\n", ascii) // "97 a 'a'" fmt.Printf("%d %[1]c %[1]q\n", unicode) // "22269 国 '国'" fmt.Printf("%d %[1]q\n", newline)

【Golang基础总结】map

萝らか妹 提交于 2019-12-04 18:28:28
转载自: https://www.cnblogs.com/liuzhongchao/p/9160227.html 什么是 map? Map 是 Go 中的内置类型,它将键与值绑定到一起。可以通过键获取相应的值。 如何创建 map? 可以通过将键和值的类型传递给内置函数 make 来创建一个 map。语法为: make(map[KeyType]ValueType) 。( 译者注:map 的类型表示为 map[KeyType]ValueType )例如: personSalary := make(map[string]int) 上面的代码创建了一个名为 personSalary 的 map。其中键的类型为 string,值的类型为 int。 map 的 0 值为 nil。试图给一个 nil map 添加元素给会导致运行时错误。因此 map 必须通过 make 来初始化( 译者注:也可以使用速记声明来创建 map,见下文 )。 package main import ( "fmt" ) func main() { var personSalary map[string]int if personSalary == nil { fmt.Println("map is nil. Going to make one.") personSalary = make(map[string]int)

【Golang基础总结】数组和切片

痴心易碎 提交于 2019-12-04 18:27:23
转载自: https://www.cnblogs.com/liuzhongchao/p/9159896.html 数组 数组是类型相同的元素的集合。例如,整数 5, 8, 9, 79, 76 的集合就构成了一个数组。Go不允许在数组中混合使用不同类型的元素(比如整数和字符串)。 声明 var variable_name [SIZE] variable_type 有很多声明数组的方式,让我们一个一个地介绍。 package main import ( "fmt" ) func main() { var a [3]int //int array with length 3 fmt.Println(a) } var a [3]int 声明了一个长度为 3 的整型数组。数组中的所有元素都被自动赋值为元素类型的 0 值。比如这里 a 是一个整型数组,因此 a 中的所有元素都被赋值为 0(即整型的 0 值)。 运行 上面的程序,输出为: [0 0 0] 。 数组的索引从 0 开始到 length - 1 结束。下面让我们给上面的数组赋一些值。 package main import ( "fmt" ) func main() { var a [3]int //int array with length 3 a[0] = 12 // array index starts at 0 a[1] =

golang学习----nil值

风格不统一 提交于 2019-12-04 18:23:08
golang中的空值 两个空值是不能比较的 func main() { fmt.Println(nil==nil) } 运行结果见下图: nil 没有默认类型 func main() { fmt.Printf("%T", nil) print(nil) } 运行结果见下图: 不同类型 nil 的指针是一样的 func main() { var m map[int]string var num *int fmt.Printf("%p\n", m) fmt.Printf("%p", num) } 运行结果见下图: map、slice、pointer、channel、func、interface 的零值是nil func main() { var m map[int]string var ptr *int var c chan int var sl []int var f func() var i interface{} var k struct{ name string age int } fmt.Printf("%#v\n", m) fmt.Printf("%#v\n", ptr) fmt.Printf("%#v\n", c) fmt.Printf("%#v\n", sl) fmt.Printf("%#v\n", f) fmt.Printf("%#v\n", i) fmt

[易学易懂系列|golang语言|零基础|快速入门|(四)]

微笑、不失礼 提交于 2019-12-04 17:26:11
今天开始,我们来写代码。 学习一门语言,最快的方式就是写代码,做项目。 别的学习教程,都是hello world. 我们就来点不一样的吧。我们不一样!不一样!不一样! 首先,打开VSCODE.( 关于VSCODE配置,见:https://www.jianshu.com/p/83beca927c9e,https://zhuanlan.zhihu.com/p/59879132) 写代码: package main var x, y int var ( // 这种因式分解关键字的写法一般用于声明全局变量 a int b bool ) var c, d int = 1, 2 var e, f = 123, "hello" //这种不带声明格式的只能在函数体中出现 //g, h := 123, "hello" func main(){ g, h := 123, "hello" println(x, y, a, b, c, d, e, f, g, h) } 输出结果为: 0 0 0 false 1 2 123 hello 123 hello 我们来一一说明: 1)var x, y int 这里通过var关键词,来定义变量 x,y,并且golang自动赋值为0.所以结果打印都为:0 2)var ( a int b bool ) 这种声明方式,一般用在全局变量。其中bool为布尔值,默认值为

golang之new函数

本秂侑毒 提交于 2019-12-04 12:19:58
另一个创建变量的方法是调用用内建的new函数。表达式new(T)将创建一个T类型的匿名变量,初始化为T类型的零值,然后返回变量地址,返回的指针类型为 *T 。 p := new(int) // p, *int 类型, 指向匿名的 int 变量 fmt.Println(*p) // "0" *p = 2 // 设置 int 匿名变量的值为 2 fmt.Println(*p) // "2" 用new创建变量和普通变量声明语句方式创建变量没有什么区别,除了不需要声明一个临时变量的名字外,我们还可以在表达式中使用 new(T) 。换言之, new 函数类似是一种语法糖,而不是一个新的基础概念。 下面的两个newInt函数有着相同的行为: func newInt() *int {   return new(int) } func newInt() *int {   var dummy int   return &dummy } 每次调用new函数都是返回一个新的变量的地址,因此下面两个地址是不同的: p := new(int) q := new(int) fmt.Println(p == q) // "false" 来源: https://www.cnblogs.com/xiangxiaolin/p/11863632.html