golang

Golang大道至简之新手入门

别来无恙 提交于 2020-01-11 07:53:54
目录大纲 快速开始 安装 Hello Golang 快速开始 安装 # 下载软件包 wget https://dl.google.com/go/go1.13.5.linux-amd64.tar.gz # 软件包校验 sha256sum go1.13.5.linux-amd64.tar.gz # 解压 /usr/local sudo tar -C /usr/local -xzf go1.13.linux-amd64.tar.gz # 编辑 .bash_profile vi ~/.bash_profile ******添加内容****** export PATH = $PATH :/usr/local/go/bin ****** # 刷新 .bash_profile source ~/.bash_profile # go 版本 go version Hello Golang # 创建项目目录 mkdir -p /var/www/vhosts/go/src/hello cd /var/www/vhosts/go/src/hello # hello.go vi hello.go *****添加内容***** package main import "fmt" func main ( ) { fmt.Printf ( "Hello, Golang\n" ) } ******* # build

换个语言学一下 Golang (1)

吃可爱长大的小学妹 提交于 2020-01-11 03:01:19
做技术的总是有些拗。这么多年一直在.net的框框里打转转。直到现在市场上.net工作越来越难找,项目越来越老才发现不做出改变不行了。就从学习Go开始吧。 Go语言的特点 简洁、快速、安全 并行、有趣、开源 内存管理、数组安全、编译迅速 Go 语言用途 Go 语言被设计成一门应用于搭载 Web 服务器,存储集群或类似用途的巨型中央服务器的系统编程语言。 对于高性能分布式系统领域而言,Go 语言无疑比大多数其它语言有着更高的开发效率。它提供了海量并行的支持,这对于游戏服务端的开发而言是再好不过了。 为什么使用Go语言 计算机软件经历了数十年的发展,形成了多种学术流派,有面向过程编程、面向对象编程、函数式编程、面向消息编程等,这些思想究竟孰优孰劣,众说纷纭。 除了OOP外,近年出现了一些小众的编程哲学,Go语言对这些思想亦有所吸收。例如,Go语言接受了函数式编程的一些想法,支持匿名函数与闭包。再如,Go语言接受了以Erlang语言为代表的面向消息编程思想,支持goroutine和通道,并推荐使用消息而不是共享内存来进行并发编程。总体来说,Go语言是一个非常现代化的语言,精小但非常强大。 Go 语言最主要的特性: 自动垃圾回收 更丰富的内置类型 函数多返回值 错误处理 匿名函数和闭包 类型和接口 并发编程 反射 语言交互性 安装环境 去官网 https://golang.org/dl/

Golang之单元测试

雨燕双飞 提交于 2020-01-11 02:01:21
golang提供了极为简洁的编写单元测试的方式,只需几行代码,即可轻松创建出一个测试用例,并且可以直接运行。 1.testing单元测试 使用 testing 可以提供自动化的测试支持,通过 go test 命令能够执行形如一下结构的函数: func TestXXX ( t * testing . T ) XXX可以是任何的字符串,通常为被测试的方法名。 其中的 *testing.T 包含测试打印测试日志、输出断言错误等的一些方法,此外还包括Skip用于跳过某个测试用例的方法。 下面是一个简单的待测试待函数( funcs1.go ): package unit_1 //编写一个简单的方法 func Sum ( arr [ ] int ) int { sum := 0 for v := range arr { //故意写错的.. sum += v } return sum } 另外创建一个文件( funcs1_test.go )包含以下测试方法: package unit_1 import ( "testing" ) func TestSum ( t * testing . T ) { testArr := [ ] int { 1 , 3 , 5 , 7 } expected := 16 actual := Sum ( testArr ) if actual != expected

Go开发关键技术指南

核能气质少年 提交于 2020-01-10 20:26:40
Go开发关键技术指南 本文最初发布于 GoDevGuide ,欢迎来github阅读原文。 原图链接地址: https://www.processon.com/view/link/5df22829e4b010171a411e7d#map 感谢阿里巴巴云原生微信公众号转载了这篇文章,给了很重要的改进建议,从Markdown转微信公众号也做了大量工作,配图和排版让阅读变成一种享受。如果你更习惯微信阅读,可以读下面四章: Go 开发关键技术指南 | 为什么你要选择 Go? Go 开发关键技术指南 | Go 面向失败编程 Go 开发关键技术指南 | 带着服务器编程金刚经走进 2020 年 Go 开发关键技术指南 | 敢问路在何方? Overview 本文讨论了服务器领域常见的并发等问题,也涉及到了工程化相关的问题,也整理了C背景程序员对于Go的GC以及性能的疑问,探讨了Go的错误处理和类型系统最佳实践,以及依赖管理的难处,接口设计的正交性,当然也包含我们在服务器开发中对于Go实践的总结,有时候也对一些有趣的问题做深度的挖掘,也列出了Go重要的事件和资料集合,还有Go2的进展和思考。我更想从问题本身出发,不局限于Go语言,探讨服务器中常常遇到的问题,最后回到Go如何解决这些问题,提供Go开发的关键技术指南。 下面是各个章节以及简介: About the Name

Golang 在 Mac、Linux、Windows 下交叉编译

时光怂恿深爱的人放手 提交于 2020-01-10 18:31:47
Golang 支持在一个平台下生成另一个平台可执行程序的交叉编译功能。 Mac下编译Linux, Windows平台的64位可执行程序: 1 CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build gofile.go 2 CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build gofile.go Linux下编译Mac, Windows平台的64位可执行程序: 1 CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build gofile.go 2 CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build gofile.go Windows下编译Mac, Linux平台的64位可执行程序: 1 SET CGO_ENABLED=0 2 SET GOOS=darwin 3 SET GOARCH=amd64 4 go build gofile.go 5 6 SET CGO_ENABLED=0 7 SET GOOS=linux 8 SET GOARCH=amd64 9 go build gofile.go GOOS:目标可执行程序运行操作系统,支持 darwin,freebsd,linux,windows GOARCH

golang 实现bloom filter

心不动则不痛 提交于 2020-01-10 12:58:52
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 今天下午不知怎么了,突然脑子里出现了bloom filter这个东西。做爬虫这么久了,还没找到过应用场景,就想着自己实现一个玩玩。原理很简单. 先定义一个n长的数组, 每位都为0, 添加记录时进行k次hash, 再将hash出的int % n作为index, 将对应index位设置成1. 每次判断时都去做同样的操作,判断是否每一位都是1,只要有一位不是1,则这条记录肯定不存在. 但如果全是1也不一定是存在的。 bloom filter原理描述网上太多,直接上链接 https://blog.csdn.net/hguisu/article/details/7866173 根据原理实现了简单的支持redis, 内存, 文件三种工作模式的bloom filter. https://github.com/lujinda/simplebloom 来源: oschina 链接: https://my.oschina.net/u/1860030/blog/1673383

Ubuntu下搭建Golang开发环境

∥☆過路亽.° 提交于 2020-01-10 09:17:42
Golang安装及配置 下载安装文件,当前最新版本为1.4.2,go1.4.2.linux-amd64.tar.gz 。 将安装文件解压至指定目录: 1 # sudo tar -zxvf go1.4.2.linux-amd64.tar.gz -C /usr/local/ 编辑 /etc/profile 文件添加环境变量: export GOROOT=/usr/local/go export GOBIN=$GOROOT/bin export PATH=$PATH:$GOBIN export GOPATH=$HOME/goproj 重新编译 /etc/profile 文件,并尝试查看GO版本: 1 # source /etc/profile 2 # go version Golang交叉编译 新建 hello.go 文件,内容如下: 1 package main 2 3 import ( 4 "fmt" 5 ) 6 7 func main() { 8 fmt.Println("Hello Golang!") 9 } Go安装包中只打包了相应平台下的编译工具,为实现交叉编译,需要手动生成其他平台的编译工具。下面将生成 windows 64位编译器,打开 /usr/local/go/src/ ,执行如下代码,GOOS表示目标系统类型,GOARCH说明目标系统是32位(386)或64位

golang中的flag模块小结

吃可爱长大的小学妹 提交于 2020-01-10 08:16:35
1. flag常用函数 无论是c语言还是golang语言或是其他语言,启动应用程序时都可以带一些参数,然后系统根据传入的参数进行特点的工作。如:./main -mode online -model bert_ch. 在Go中可以方便地使用flag模块进行命令行参数解析。 // 解析字符串 type string string func String(name string, value string, usage string) *string // 解析整数变量 type int int func Int(name string, value int, usage string) *int // 解析bool变量 type bool bool func Bool(name string, value bool, usage string) *bool type float64 float64 func Float64(name string, value float64, usage string) *float64 type int64 int64 func Int64(name string, value int64, usage string) *int64 // 解析使得参数生效 func Parse() // 给指定的参数设置值 func Set(name, value

golang 打包,交叉编译,压缩

泪湿孤枕 提交于 2020-01-10 07:34:54
打包,压缩 我们的常规打包方式 $ go build   Mac下我们用 ls -lh查看,可以看到我们打包出来的可执行文件会比较大,一般只写几行代码就回又3M以上的文件大小了. 我们的带压缩的打包方式 $ go build -ldflags '-w -s'   Mac下我们用 ls -lh查看,可以看到我们打包出来的文件明显比刚才的小了一些,但是,也有2M之多. 压缩可执行文件(终极压缩) 我们使用第三方的压缩工具 https://github.com/upx/upx/releases , Mac, linux, Windows系统都可以使用, mac下安装 upx brew install upx   安装成功以后就可以直接使用 upx 了 $ upx project_name   等待压缩完成 此时我们再看可执行文件的大小,即可发现,文件大小只有800kb左右了. 温馨提示 : 压缩出来的可执行文件是和没压缩之前的使用方式是一样的.它只是改变了文件的大小而已 golang的交叉编译 Mac 下编译 Linux 和 Windows 64位可执行程序 CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go

golang 记一次data race排查过程

只谈情不闲聊 提交于 2020-01-10 07:25:32
golang 记一次data race排查过程 背景 data race 现场 解决思路 经验总结 data race在写并发代码时候经常遇到,相关基础概念的介绍可以参考之前一篇文章: golang data race 竞态条件 https://louyuting.blog.csdn.net/article/details/103606831 这篇文章主要是记录项目中一次 data race的排查过程。 背景 大概背景是这样的,最近项目中需要在golang中实现一个并发安全的list容器,list容器的长度不一定,通过在初始化的时候指定,容器必须要能够并发安全的更新容器内的每一个元素。经过调研,决定采用类似于 Java 中的 AtomicReferenceArray 的实现方案。关于 AtomicReferenceArray 的实现原理这里就不细说了,网上很多博客介绍。 需求大概是这样,容器里面保存的是一个指针列表,每一个指针指向一个统计窗口的数据结构的地址。因为golang中的数组申明时候必须指定长度,不指定长度默认就是slice,所以也就是借助于slice来实现数组的目的。大概结构如下图: 里面的W0 - W(n-1) 都是指针,指针的size是8bytes(64位机器),指针分别指向一个实际的存储实体(用红色的圆来表示)。base指向数组的首地址,length表示数组的长度。