golang

【原创翻译】《GO语言编程入门》

烈酒焚心 提交于 2020-10-29 01:54:34
本人在对CALEB DOXSEY写的《An Introduction To Programming In GO》进行中文翻译, 英文版 地址为: http://www.golang-book.com/ 翻译的内容将陆续地添加进来,并在本页面进行链接更新。 书籍内容的中文目录如下: 目录: 准备工作 文件与文件夹 命令行终端 文本编辑器 GO语言工具 你的第一个程序 如何阅读一个GO程序 习题 类型 数值(number) 字符串(string) 布尔值(boolean) 习题 变量 如何命名变量 作用域 常量 定义多个变量 代码例子 习题 控制结构 for if switch 习题 数组、数组切片、map 数组(array) 数组切片(slice) map 习题 函数 你的第二个函数 多参数返回 可变参数函数 闭包 递归 defer、panic和recover 习题 指针 *和&操作符 new 习题 结构(struct)与接口(interface) 结构(struct) 方法(method) 接口(interface) 习题 并发 协程(goroutine) 通道(channel) 接口(interface) 习题 包(package) 创建包 文档 接口(interface) 习题 测试 习题 核心包 strings(字符处理) io(输入输出) os(文件系统) errors

Codis集群搭建摘要

青春壹個敷衍的年華 提交于 2020-05-05 15:28:13
本文主要介绍Codis编译过程中的一些注意事项和Codis集群的搭建。 #准备方案 ##Golang环境搭建 环境搭建很简单,下载go1.4.2.linux-amd64.tar.gz安装包,直接解压并添加到环境变量就可以。 假设解压到/usr/local/go下,这个目录就是GOROOT,另外需要定义一个go开发目录,假设为/workspace/golang。 go开发目录未来会产生一些主要的子目录: 1. src 存放源码 2. pkg 编译后生成的文件 3. bin 编译后生产的可执行文件(比如godep命令在安装后就会放在这个目录下) 环境变量添加: export GOROOT=/usr/local/go export GOPATH=/workspace/golang PATH=".:$PATH:$GOROOT/bin:$GOPATH/bin:$ZOOKEEPER/bin" 生效后就可以执行go version查看go的版本信息。 将$GOPATH/bin加入PATH是为了让一些开源的或者自己安装的go扩展命令(如godep)可以全局使用。 ##Codis下载和编译 最新版的Codis位于[ https://github.com/CodisLabs/codis ] 通过下面命令获得源码 go get -u -d github.com/CodisLabs/codis

WebSocket 和 Golang 实现聊天功能

做~自己de王妃 提交于 2020-04-27 22:21:46
本文同步至 http://www.waylau.com/go-websocket-chat/ 这个示例应用程序展示了如何使用 WebSocket , Golang 和 jQuery 创建一个简单的web聊天应用程序。这个示例的源代码在 https://github.com/waylau/goChat 。 ##Running the example 运行示例 这个示例需要 Golang 开发环境。 该 页面 描述如何安装开发环境。 一旦你去启动和运行,您可以下载、构建和运行的例子, 使用命令: go get gary.burd.info/go-websocket-chat go-websocket-chat 在支持 websocket 的浏览器尝试打开 http://127.0.0.1:8080/ 启动应用 ##Server 服务器 服务器程序实现了 http 包,包含了 Go 分发和 Gorilla 项目的 websocket 包. 应用程序定义了两种类型, connection 和 hub 。服务器为每个 webscocket 连接 创建的一个 connection 类型的实例 。 连接器扮演了 websocket 和 hub 类型单例 之间的媒介 。 hub 保持一组注册了的连接器 和 广播到连接器的信息。 程序运行了一个 goroutine 给 hub 和两个

Go语言学习笔记(语法篇)

我是研究僧i 提交于 2020-04-24 05:38:39
Go语言的控制结构比Java、C语言都要少,只有很简单的几个,语法与也略有不同。 Go语言的保留关键字 break default func interface select case defer go map struct chan else goto package switch const fallthrough if range type continue for import return var 运算符 * / % << >> & &^ + - | ^ && || ! if if中的条件不需要用中括号()给包含起来。 a := 1 b := 2 c := 3 if a < b && b < c { fmt.Println(true) } else { fmt.Println(false) } 而且if接受初始化语句,初始化的变量为一个局部变量。 if f, err := os.Open("c:/hello.go"); err == nil { fmt.Println(f.Name()) } else { fmt.Println(err) } goto 在Java里这是一个保留关键字,但没有任何实际作用。goto用不好容易造成程序的逻辑混乱。下面用Lable标识一个标签,goto可以将执行跳转到这个标签位置,注意标签是大小写敏感的。 func myfunc() { i :

GoLang 强制类型转换:unsafe.Pointer

天涯浪子 提交于 2020-04-20 07:08:59
注意此种转换只适合简单类型,对于有对象描述的类型是完全不适用的,鸡肋啊 更详细的文章请参见@陈一回 http://my.oschina.net/goal/blog/193698 ps:补充另外一种用法,这次就不鸡肋了 Go语言是个强类型语言。也就是说Go对类型要求严格,不同类型不能进行赋值操作。 指针也是具有明确类型的对象,进行严格类型检查。下面的代码会产生编译错误 package main import ( "fmt" ) func main() { u := uint32(32) i := int32(1) fmt.Println(&u, &i) // 打印出地址 p := &i // p 的类型是 *int32 p = &u // &u的类型是 *uint32,于 p 的类型不同,不能赋值 p = (*int32)(&u) // 这种类型转换语法也是无效的 fmt.Println(p) } unsafe 包提供的Pointer方法可以完成这个任务 package main import ( "fmt" "unsafe" ) func main() { u := uint32(32) i := int32(1) fmt.Println(&u, &i) p := &i p = (*int32)(&u) p = (*int32)(unsafe.Pointer(&u)) fmt

有关 tom-toml 的一些事儿

不羁岁月 提交于 2020-04-15 20:33:26
【推荐阅读】微服务还能火多久?>>> 为什么要再写一个TOML解析器 学习写解析器 支持注释 支持格式化输出并保持次序 学习写解析器 一直认为编写解析器是非常有挑战性的任务. TOML 本身已经很简洁. 为 TOML 写个解析器很有吸引力. 我们知道已经有了 YACC 这样工具可以完成此类工作. 事实上 Go 提供了这样的工具, TOML 上也有关于 EBNF 的讨论, 已经出现出几个版本. 但是要让这些 EBNF 定义转换成特定语言的代码, 还有很多辅助工作. 作为学习目的, 我采取先手工写一个解析器, 可以对完整使用 EBNF 有更深刻的理解. 鉴于 TOML 的简洁. 手工写出所有的 First 集和 Follow 集是可行的. parser.go 中 stateEmpty/tokensEmpty 就是 First 集, 按照编译原理所阐述的, 解析完整结束也会回到 First 集. 解析开始的时候至少要匹配到 First 集合中的一项(TOML 没有二义性, 只匹配一个). 解析结束的时候会回到 First 集合, 由于我写的 First 集合中没有 EOF 匹配, 所以当匹配不了 First 集合时, 解析结束, 相反如果在 First 集合中写下 stateEof/tokensEof 那最终会以匹配 EOF 而结束. 其他的 Follow 集合也是必须要有匹配,

用go和zk实现一个简单的分布式server

拥有回忆 提交于 2020-04-11 17:22:53
#golang的zk客户端 最近打算写个简单的配置中心,考虑到实现便捷性,语言选择了go,由于其中计划用到zk,就调研了下golang的zk客户端,并实现了个简单的分布式server。最终找到了两个,地址如下: gozk: https://wiki.ubuntu.com/gozk go-zookeeper: https://github.com/samuel/go-zookeeper 由于gozk的文档不如后者,且代码没在gihub上,所以就直接选择了后者。go-zookeeper文档还是比较全面的: 文档 #基本操作测试 这里默认大家已经了解zk的用处和基本用法了,如果还不了解可以参看: 官方文档 或 中文文档 下边我们先来写个简单的例子来测试下基本的操作: package main /** 客户端doc地址:github.com/samuel/go-zookeeper/zk **/ import ( "fmt" zk "github.com/samuel/go-zookeeper/zk" "time" ) /** * 获取一个zk连接 * @return {[type]} */ func getConnect(zkList []string) (conn *zk.Conn) { conn, _, err := zk.Connect(zkList, 10*time.Second)

免费查快递跟踪信息Golang实现

生来就可爱ヽ(ⅴ<●) 提交于 2020-04-08 13:01:14
参考ui效果: https://www.kuaidi100.com/?from=openv 思路: 调用快递100的接口,可以免费查询快递跟踪记录了... 线上请求地址 https://test.ibanana.club/kd100/auto_com_num?num=73119782411952 线上请求地址 https://test.ibanana.club/kd100/query_num_detail?num=73119782411952&comCode=zhongtong //路由 router.GET("/kd100/auto_com_num", controller.AutoComNum) //获取快递公司类型 router.GET("/kd100/query_num_detail", controller.QueryNumDetail) //获取快递跟踪信息 //获取快递公司类型 func AutoComNum(ctx *gin.Context) { //fmt.Println("AutoComNum...") text := ctx.Query("num") //单号 url := "https://www.kuaidi100.com/autonumber/autoComNum?resultv2=1&text=" + text paramData := gin.H{}

Golang基础语法(一)

断了今生、忘了曾经 提交于 2020-04-07 09:38:44
Golang基础知识 一、运行 1.go run hello.go直接运行go文件 2.go build hello.go 编译hello.go,产生二进制可执行文件 3.go install hello.go 编译产生二进制文件,并且将其移动到GOPATH的bin目录下,在任何的目录下都可执行该文件 二、变量 声明方法: Var 变量名类型= 值 //声明时复制 Var 变量名= 值 //不声明类型,编译器自己推出变量类型 Var 变量类型 变量= 值 //声明后再赋值 速记声明 变量名:= 值 //速记声明 左边至少有一个是新变量,且不能作为全局变量 _,b = 5,7 //空白标识符用于抛弃值,如左边,5被抛弃 三、数据类型 bool类型:true或false 有符号整型:uint8,uint16,uint32,uint64,uint 无符号整型:int8,int16,int32,int64,int 浮点型:float32,float64 复数型:complex64,complex128 特殊:type(uint8的别称),rune(int32的别名) 字符型:string 派生类型:指针、数组、结构体、Channel、函数、切片、接口、Map 类型转换:T(v)将v转换为T值 //Go中没有隐式转换 常量:只能是布尔型、数字和字符串,且被const修饰的常量不能被更改

golang sync.pool源码阅读

江枫思渺然 提交于 2020-04-06 23:13:51
阅读项目代码的时候发现很多地方用到了golang的sync.pool,所以好奇golang的sync.pool底层实现是什么样的,有哪些优化。 本文是基于go1.13.8,做讲解。 目录 介绍 用法 结构图 实现细节 数据结构——从下往上讲一下Pool底层存储是如何实现 eface poolDequeue poolChainElt poolChain poolLocal 主要函数 Put Get 附录 pool.dot 介绍 Pool翻译过来就是池子,主要功能就是: 需要使用某个Object的时候可以从Pool获取,使用完毕再归还,从而减少创建和销毁Object的开销。而本文讲的就是golang中的Pool源码实现。 用法 千万不要想当然的认为put进去的Object和get出来的Object有什么关系,Pool存的Object在GC时会都清理掉 package main import ( "fmt" "sync" ) type Book struct { Name string Info map[string]string } func NewBook() interface{} { return &Book{ Name: "", Info: make(map[string]string), } } func main() { // 创建pool并定义创建object的函数