golang

通向Golang的捷径【1. Go 语言的起源, 特性和发展】

与世无争的帅哥 提交于 2019-12-28 12:22:28
第 I 部分 学习 Go 语言的理由 1 Go 语言的起源, 特性和发展 1.1 起源和发展 2007 年已开始酝酿 Go 语言,2009 年出现了 Go 语言的首个公开版本, Go 的初始设计开始于 2007 年 9 月 12日, 它是 Google 公司的一个附属项目 ( 花费每个工作日 20% 的时间, 来完成的项目), 并由三个著名的软件工程师来实现, Robert Griesemer(从事于 Java HotSpot 虚拟机的研究), Rob Pike(贝尔实验室 Unix 开发组的成员, 从事于 Plan 9, Inferno 操作系统和 Limbo 语言的研究), Ken Thompson(贝尔实验室 Unix 开发组的成员,曾经开发过 C 语言,Unix 和 Plan 9 操作系统, 协助 Rob Pike 完成 UTF-8 的开发), 从 2008 年 2 月开始, Ken Thompson 已在开发对应的编译器, 以展示所需的设计理念, 它能生成 C 语言代码. 在 2008 年中,Go 语言已基本完成, 剩余的工作主要是编译器和运行时功能的实现, 同时 Ian Lance Taylor 加入开发组, 并于 2008 年 5 月构建了一个基于 gcc 的编译器. Russ Cox 加入开发组后, 开始基于 Go 语言的开发, 并创建了 Go 语言库, 在 Go

Linux Mint 19 安装GoLang环境

人盡茶涼 提交于 2019-12-28 10:33:51
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 直接合用apt install安装也是可以的。但是比较慢,而且版本也不是官网上最新的版本。 这里就直接从官网下载安装。这种方式的安装,安装包更小,也更快。 第一步:下载go并解压缩 到Go官网下载Go安包,下载地址https://golang.org/dl/。我直接下载的是最新的go-1.13.5。选择的是linux 64位版本:go1.13.5.linux-amd64.tar.gz 国内比较快的下载链接,通过golang中文社区进行下载: Go 安装包下载 $ tar -zxvf go1.13.5.linux-amd64.tar.gz -C /usr/local 第二步:设置go的变量环境(Go Environment) 我们需要设置3个变量环境,分别是GOROOT, GOPATH , PATH. GOROOT 是go在系统上所安装的路径。 sudo vim /etc/profile 在末尾追加 export GOROOT=/usr/local/go GOPATH 是你go项目的路径,可以设置为任意目录,这里用了 ~/GoProjects export GOPATH=$HOME/GoProjects 最后设置PATH变量的路径,这样就可以随时使用go 命令了。 export PATH=$GOPATH/bin:

golang版本管理工具GO111MODULE

眉间皱痕 提交于 2019-12-28 01:24:28
在go1.11版本前,想要对go语言包进行管理,只能依赖第三方库实现,比如 Vendor, GoVendor, GoDep, Dep, Glide 等等。 1. 开启GO111MODULE 用环境变量 GO111MODULE 开启或关闭模块支持,它有三个可选值: off 、 on 、 auto ,默认值是 auto 。 GO111MODULE=off 无模块支持,go 会从 GOPATH 和 vendor 文件夹寻找包。 GO111MODULE=on 模块支持,go 会忽略 GOPATH 和 vendor 文件夹,只根据 go.mod 下载依赖。 GO111MODULE=auto 在 $GOPATH/src 外面且根目录有 go.mod 文件时,开启模块支持。 在使用模块的时候, GOPATH 是无意义的,不过它还是会把下载的依赖储存在 $GOPATH/src/mod 中,也会把 go install 的结果放在 $GOPATH/bin 中。 2. 定义module 模块根目录和其子目录的所有包构成模块, 在根目录下存在 go.mod 文件 ,子目录会向着父目录、爷目录一直找到 go.mod 文件。 模块路径指模块根目录的导入路径,也是其他子目录导入路径的前缀。 go.mod 文件第一行定义了模块路径,有了这一行才算作是一个模块。 go.mod

突然发现一个很好用Golang的json库

删除回忆录丶 提交于 2019-12-27 17:57:38
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> json 我并不想解释json是什么。 库名 GJSON 点这里去star感谢小哥 下载 $ go get -u github.com/tidwall/gjson 与官方的json解析包有什么区别 官方的包,都是一整块数据一起 包装/解析。 有如下数据 struct { str1 str2 } json :{str1:"xx",str2:"xx"} 如果要单独得到str1的话,很麻烦的。 官方给的demo package main import "github.com/tidwall/gjson" const json = `{"name":{"first":"Janet","last":"Prichard"},"age":47}` func main() { value := gjson.Get(json, "name.last") println(value.String()) } 输出: Prichard 我写的超级详细的例子! 给你们看看我要解析的json,就问你们怕不怕: //第一个 { "richtext": { "data": { "items": [ { "desc": "惊爆!!!在光棍节这种虐狗的节日到来之际,有一份充满恶意的榜单华丽丽出炉了。咱们look look~此榜单一出

使用golang构建实时白板

廉价感情. 提交于 2019-12-27 17:57:24
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 源码 https://github.com/chapin666/simple-drawing-backend 首先,我们需要创建一个用于与用户交互消息的桥梁(Hub)。这个思路类似于Gorilla's 的 chat 例子。 Client struct 创建一个 client.go 文件 package main import ( "github.com/gorilla/websocket" uuid "github.com/satori/go.uuid" ) type Client struct { id string hub *Hub color string socket *websocket.Conn outbound chan []byte } 为client编写一个构造方法,这里使用了UUID和随机颜色库 func newClient(hub *Hub, socket *websocket.Conn) *Client { return &Client{ id: uuid.NewV4().String(), color: generateColor(), hub: hub, socket: socket, outbound: make(chan []byte), } } 新建 utilities.go

Golang JSON解析包GJSON详解

和自甴很熟 提交于 2019-12-27 17:47:20
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 基本概述 相信使用过 动态语言 的人,都觉得解析JSON是很简单的,只需要简单的几行代码就可以拿到解析好的JSON对象。例如Python解析JSON如下所示 import json jsonStr = '{"name": "Bob", "age": 18}' result = json.loads(jsonStr) print(result["name"]) // "Bob" 而Golang语言中简单的数据结构可使用map[string]interface{},但如果JSON嵌套格式太复杂,用这种方式特别容易绕晕,而如果预先定义struct结构体,在用json.Unmarshal把数据解析到结构体中,取出对应的数据,代码量编写会增加许多。如下所示 type Student struct { Name string `json:"name"` Age int `json:"age"` } jsonData := []byte(` { "name": "Bob", "age": 18 }`) var student Student err := json.Unmarshal(jsonData, &student) if err != nil { fmt.Println(err) } fmt.Println

超好用Golang 解析JSON包GJSON

那年仲夏 提交于 2019-12-27 17:19:23
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 基本概述 相信使用过 动态语言 的人,都觉得解析JSON是很简单的,只需要简单的几行代码就可以拿到解析好的JSON对象。例如Python解析JSON如下所示 result = {"name": "Bob", "age": 18} print(result["name"]) // "Bob" 而Golang语言中简单的数据结构可使用map[string]interface{},但如果JSON嵌套格式太复杂,用这种方式特别容易绕晕,而如果预先定义struct结构体,在用json.Unmarshal把数据解析到结构体中,取出对应的数据,代码量编写会增加许多。如下所示 type Student struct { Name string `json:"name"` Age int `json:"age"` } jsonData := []byte(` { "name": "Bob", "age": 18 }`) var student Student err := json.Unmarshal(jsonData, &student) if err != nil { fmt.Println(err) } fmt.Println(student.Name) 经过对比,发现GoLang解析JSON有没有相对简单的方法呢

golang内存分配与管理

眉间皱痕 提交于 2019-12-27 16:33:39
Go语言内置运行时(就是runtime),不同于传统的内存分配方式,go为自主管理,最开始是基于tcmalloc架构,后面逐步迭新。自主管理可实现更好的内存使用模式,如内存池、预分配等,从而避免了系统调用所带来的性能问题。 1. 基本策略 每次从操作系统申请一大块内存,然后将其按特定大小分成小块,构成链表(组织方式是一个单链表数组,数组的每个元素是一个单链表,链表中的每个元素具有相同的大小。); 为对象分配内存时从大小合适的链表提取一小块,避免每次都向操作系统申请内存,减少系统调用。 回收对象内存时将该小块重新归还到原链表,以便复用;若闲置内存过多,则归还部分内存到操作系统,降低整体开销。 1.1 内存块   span:即上面所说的操作系统分配的大块内存,由多个地址连续的页组成;   object:由span按特定大小切分的小块内存,每一个可存储一个对象;   按照用途,span面向内部管理,object面向对象分配。 关于span   内存分配器按照页数来区分不同大小的span,如以页数为单位将span存放到管理数组中,且以页数作为索引;   span大小并非不变,在没有获取到合适大小的闲置span时,返回页数更多的span,然后进行剪裁,多余的页数构成新的span,放回管理数组;   分配器还可以将相邻的空闲span合并,以构建更大的内存块,减少碎片提供更灵活的分配策略。

golang——database/sql包学习

故事扮演 提交于 2019-12-27 10:00:09
1、database/sql包 sql包提供了保证SQL或类SQL数据库的泛用接口。 使用sql包时必须注入(至少)一个数据库驱动。 (1)获取mysql driver:go get -v github.com/go-sql-driver/mysql (2)代码示例: package main import ( "database/sql" "fmt" "log" "time" _ "github.com/go-sql-driver/mysql" ) // 检查错误 func checkErr(err error) { if err != nil { log.Fatalln(err) } } // 事务错误 func checkTxErr(err error, tx *sql.Tx) { if err != nil { log.Println(err) err = tx.Rollback() checkErr(err) } } // 数据库实体 type User struct { ID int Name string Age int Sex int AddDate time.Time } func main() { //1、获取数据库连接 db, err := sql.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/test

搞明白GOROOT,GOPATH,GOBIN,project目录

假装没事ソ 提交于 2019-12-27 01:22:50
我们接下来一个一个来看关于Go语言中的三个目录的详细解释 先通过go env查看go的环境变量(我这里是mac的环境,所以可能和你的不同) localhost:~ zhaofan$ go env GOARCH="amd64" GOBIN="" GOEXE="" GOHOSTARCH="amd64" GOHOSTOS="darwin" GOOS="darwin" GOPATH="/Users/zhaofan/go_project" GORACE="" GOROOT="/usr/local/Cellar/go/1.9.2/libexec" GOTOOLDIR="/usr/local/Cellar/go/1.9.2/libexec/pkg/tool/darwin_amd64" GCCGO="gccgo" CC="clang" GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/b6/mc1c40c91cld67ps963_r16h0000gn/T/go-build539393745=/tmp/go-build -gno-record-gcc-switches -fno-common" CXX=