go语言

Go语言的并发机制

蹲街弑〆低调 提交于 2020-02-16 01:53:36
目录 写在前面 并发 Concurrency Channel 关键字:range,close 关键字 select sync.Mutex 写在前面 这一部分,在官方教程中并没有太多详细的说明,建议读者先看以下文章: http://legendtkl.com/2017/07/30/understanding-golang-channel/ https://studygolang.com/articles/12342 https://studygolang.com/articles/12402 并发 Concurrency go的并发是通过goroutine来实现的 它的使用,就是在某个操作前加上go关键字 go f(x, y, z) 什么叫当前的goroutine? 文字苍白,且看代码: package main import "fmt" func main() { fmt.println("hello,world!") } 如果程序开始执行,那么上面的的就是当前的goroutine了 什么是非当前的goroutine 使用go关键词就能添加新的goroutine了 import "fmt" func NewGoroutine() { fmt.Println("new goroutine!") } func main() { go NewGoroutine() /

Go语言环境配置 Sublime Text + GoSublime+ gocode + MarGo组合

时间秒杀一切 提交于 2020-02-16 01:52:31
买来《Go Web编程》一书学习Go语言,结果按照书中的步骤搭建,发现部分站点已经失效了,查了网上好多教程也没有人能够说清楚如何搭建。还是自己动手找方法吧,经过自己的不懈努力终于搭建好了。ps:没有google的日子太难受了,查资料各种不方便,平时基本不翻墙,所以。。。。。。 1.下载安装go,今天安装go的时候发现go官网打不开,在网上找各种go下载地址无果,不过还是在不经意间发现了一个下载地址,希望你看到这篇文章时还能下载。我的机器是64位windows8,找个可用的msi太费劲了。附地址 :https://code.google.com/p/go/downloads/list?q=OpSys-Windows+Type%3DInstaller 。我电脑就更改了google的hosts,如果你不能访问这个地址的话,建议你也做一下。 下载之后的安装很简单,next到头就好了,安装完成之后,打开终端,输入go回车,能看到安装成功的提示就说明安装成功了。 2.设置GOPATH,找个自己想放置go项目的文件夹,添加一个GOPATH环境变量并指向这个文件夹。如果GOPATH=c:\mygo。一般来说在GOPATH下面创建三个子目录,src,bin,pkg。 3.准备工作完成之后,开始搭建Sublime Text开发go语言的环境。   a.下载安装sublime text之后

go语言并发

风流意气都作罢 提交于 2020-02-16 01:50:27
go语言并发 goroutine goroutine格式 为一个普通函数创建 goroutine 的写法如下: go funcName(参数列表) 为一个匿名函数创建goroutine的写法如下 go func(参数列表){ 函数体 }(参数列表) goroutine创建流程 Go 程序从 main 包的 main() 函数开始,在程序启动时,运行时(runtime)会默认为 main() 函数创建一个默认的 goroutine。 在 main() 函数的 goroutine 中执行到 go funcName语句时,归属于 funcName函数的 goroutine 被创建。 此时,main() 继续执行,funcName函数开始在自己的 goroutine 中执行,两个 goroutine 通过 Go 程序的调度机制同时运作。 channel 使用 go 关键字创建 goroutine 时,被调用函数的返回值会被忽略。 如果需要在 goroutine 中返回数据,需要通过通道把数据从 goroutine 中作为返回值传出。 在任何时候,同时只能有一个 goroutine 访问通道进行发送和获取数据。 声明通道类型 通道的元素类型就是在其内部传输的数据类型,声明如下: var 通道变量 chan 通道类型 //通道类型:通道内的数据类型。 //通道变量:保存通道的变量。 chan

Go语言学习笔记(1)——顺序编程

你离开我真会死。 提交于 2020-02-16 01:44:42
Go语言学习笔记这一堆主要是《Go语言编程》(人民邮电出版社)的读书笔记。中间会穿插一些零碎的点,比如源码学习之类的。大概就是这样吧。 1. 顺序编程 1.1 变量 变量的声明: var 变量名 类型 var v1 int 也可以把若干变量的声明用大括号括起来 var { v1 int v2 string } 变量初始化: 变量的初始化可以用如下的方法: var v1 int = 10 var v2 = 10 v3 := 10 这三种方法的效果大体上是一样的。需要注意的有:第三种方法不能用于声明全局变量;以及:=赋值符号不能用于已声名过的变量名。 变量的赋值: 赋值这里唯一特别的是,Go语言支持多重赋值,比如交换i和j的值: i, j = j, i 匿名变量: Go语言有一个特性,就是在引入的包和变量在没有使用的时候,会在编译阶段报错。所以对于不需要的变量,可以使用匿名变量进行处理。 两个例子,第一个是多重返回函数的返回值的处理: func GetName() (firstName, lastName, nickName string) { return "May", "Chan", "Chibi Maruko" } _, _, nickName := GetName() 如果只需要函数的部分返回值的时候,就可以利用匿名变量。 第二个是for循环: var a int[] = {5

Go语言编程(七牛云存储团队执笔)

不打扰是莪最后的温柔 提交于 2020-02-16 01:37:54
《Go语言编程(七牛云存储团队执笔)》 基本信息 作者: 许式伟 吕桂华 丛书名: 图灵原创 出版社:人民邮电出版社 ISBN:9787115290366 上架时间:2012-8-15 出版日期:2012 年8月 开本:16开 页码:1 版次:1-1 所属分类: 计算机 > 软件与程序设计 > 综合 > 高级程序语言设计 更多关于 》》》《 Go语言编程(七牛云存储团队执笔) 》 内容简介书籍 计算机书籍   《go语言编程》首先引领读者快速浏览go 语言的全貌,迅速消除读者对这门语言的陌生感,然后循序渐进地介绍了go 语言的面向程和面向对象的编程语法,其中穿插了一些与其他主流语言的比较以让读者理解go 语言的设计动机,接着探讨了go 语言重要的并行编程方法,之后介绍了网络编程、工程管理、安全编程、开发工具等非语法相关但非常重要的内容,最后为一列关于go 语言的文章,可以帮助读者更深入了解这门全新的语言。   《go语言编程》适合所有层次的开发者阅读。 目录 《go语言编程》 第1章  初识go语言    1 1.1  语言简史    1 1.2  语言特性    2 1.2.1  自动垃圾回收    3 1.2.2  更丰富的内置类型    4 1.2.3  函数多返回值    5 1.2.4  错误处理    6 1.2.5  匿名函数和闭包    6 1.2.6  类型和接口

google go语言

Deadly 提交于 2020-02-16 01:30:44
引用: http://developer.51cto.com/art/201203/326428.htm 谷歌今天发布了Go语言的首个正式版本,谷歌称,这是该语言发展过程中的一个重要的里程碑。 Go 语言最初由Rob Pike等谷歌工程师在2007年9月启动设计工作,在2009年11月正式对外发布。Go将动态语言易于编写的特性和静态语言的高效性相结合,具备良好的易用性和极佳的执行效率。Go语言最初定位于网络服务器、存储系统和数据库的程序设计,同时在语言中包含并发构造体,以帮助开发者创建并行任务。Go开发团队曾表示,编译完成的Go程序运行速度接近C语言实现的程序。 在3月中旬,谷歌曾发布 Go 1的候选版本 ,并称已经非常接近正式版了。而此次发布的正式版在候选版的基础上改进了部分功能,修复了一些bug,核心库和性能更加稳定,意味着可以正式用于生产。 Go 1 正式版的改进包括语言方面的改变(如Unicode字符的新类型)以及标准库的变化(如新增了包和重命名了strconv包),此外,包的层级已经进行了重新整理,放置到了相应的组中,如网络设施、RPC包、网络子目录等。 谷歌称, Go语言向前兼容,使用Go 1编写的代码,除了少数情况外,基本都可以在该版本的所有生命周期中继续编译和运行, 即使后续版本(如Go 1.1、1.2等)进行了更新和bug修复。Go语言兼容性可参阅: http:/

Day_04 面向对象

感情迁移 提交于 2020-02-16 01:25:02
概述 对于面向对象编程的支持,Go语言设计得非常简洁而优雅。因为,Go语言并没有沿袭传统 面向对象编程中的诸多概念,比如继承(不支持继承,尽管匿名字段的内存布局和行为类似继承,但它并不是继承)、 虚函数、构造函数和析构函数、隐藏的this指针等等 尽管Go语言中没有封装、继承、多态这些概念,但同样通过别的方式实现这些特性: 封装:通过方法实现 继承:通过匿名字段实现 多态:通过接口实现 接口概述: 在Go语言中,接口(interface)是一个自定义类型,接口类型具体描述了一系列方法的集合 接口类型是一种抽象的类型,它不会暴露出它所代表的对象的内部值的结构和这个对象支持的基础操作的集合, 它们只会展示出它们自己的方法。因此接口类型不能将其实例化。 Go通过接口实现了鸭子类型(duck-typing):“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子、那么这只鸟就可以被称为鸭子了” 我们并不关心对象是什么类型,到底是不是鸭子,只关心行为 01.匿名字段初始化 //匿名字段体现的是面向对象的继承特点 package main import "fmt" type Person struct { name string //名字 sex byte //性别 age int //年龄 } type Student struct { Person //只有类型,没有名字,匿名字段

Golang 入门系列(十四)defer, panic和recover用法

社会主义新天地 提交于 2020-02-12 17:33:11
以前讲过golang 的基本语法。但是,只是讲了一些基础的语法,感兴趣的可以看看以前的文章, https://www.cnblogs.com/zhangweizhong/category/1275863.html ,前段时间有人问我defer,recover的用法。所以,还是统一的总结一下相关的关键字吧。 其实,Go语言是不支持 try…catch…finally 这种异常处理的,因为Go语言的设计者们认为,将异常与控制结构混在一起会很容易使得代码变得混乱。因为开发者很容易滥用异常,甚至一个小小的错误都抛出一个异常。 在Go语言中,使用多值返回来返回错误。不要用异常代替错误,更不要用来控制流程。在极个别的情况下,才使用Go中引入的Exception处理:defer, panic, recover。 一. defer 用法 defer的特性: 在函数返回之前, 调用defer函数的操作, 简化函数的清理工作. 在初接触到go时, 就被defer吸引住了,但是在使用defer关键字的时候,还是得注意这些: 1. 在defer表达式确定的时候,defer修饰的函数(后面统称为defered函数)的参数也就确定了 package mainimport ( "fmt")func main() { g()}func g() { i := 0 defer fmt.Println(i) i++

Go语言标准库之JSON编解码

好久不见. 提交于 2020-02-12 15:47:36
Go语言标准库之JSON编解码 基本的类型 Go 语言中的数据类型和 JSON 的数据类型的关系 bool -> JSON boolean float64 -> JSON numbers string -> JSON strings nil -> JSON null Struct to JSON Go 包 encoding/json 中的 json.Marshal 方法,可以将 struct 编码为 JSON 数据 package main import ( "encoding/json" "fmt" "time" ) type FruitBasket struct { Name string Fruit []string Id int64 `json:"ref"` private string // 这个字段不会被编码 Created time.Time } func main() { basket := FruitBasket{ Name: "Standard", Fruit: []string{"Apple", "Banana", "Orange"}, Id: 999, private: "Second-rate", Created: time.Now(), } jsonData, err := json.Marshal(basket) if err != nil { fmt

Go语言结构体转json的坑

一笑奈何 提交于 2020-02-12 15:39:24
Go语言结构体转json的坑 标签(空格分隔): go json.Marshal() JSON输出的时候必须注意,只有导出的字段(首字母是大写)才会被输出,如果修改字段名,那么就会发现什么都不会输出,所以必须通过struct tag定义来实现。 针对JSON的输出,我们在定义struct tag的时候需要注意的几点是: - 字段的tag是"-",那么这个字段不会输出到JSON - tag中带有自定义名称,那么这个自定义名称会出现在JSON的字段名中 - tag中如果带有"omitempty"选项,那么如果该字段值为空,就不会输出到JSON串中 - 如果字段类型是bool, string, int, int64等,而tag中带有",string"选项,那么这个字段在输出到JSON的时候会把该字段对应的值转换成JSON字符串 代码示例 package main import ( "encoding/json" "fmt" ) func main() { type UserInfo struct { Id int Name string Address string } type Comiket struct { id int title string } type Test struct { Id int `json:"-"` Content string `json:"content