Go学习笔记(一)Let's 干
加 Golang学习 QQ群共同学习进步成家立业 ^-^ 群号:96933959
简介
Go是Google开发的一种 静态强类型、编译型,并发型,并具有垃圾回收功能的编程语言。为了方便搜索和识别,有时会将其称为Golang。
罗伯特·格瑞史莫,罗勃·派克(Rob Pike)及肯·汤普逊于2007年9月开始设计Go语言,稍后Ian Lance Taylor、Russ Cox加入项目。Go语言是基于Inferno操作系统所开发的。Go语言于2009年11月正式宣布推出,成为开放源代码项目,并在Linux及Mac OS X平台上进行了实现,后来追加了Windows系统下的实现。在2012年早些时候发布了Go 1稳定版本。
现在Go的开发已经是完全开放的,并且拥有一个活跃的社区。
Go语言的语法接近C语言,但对于变量的声明有所不同。Go语言支持垃圾回收功能。Go语言的并行模型是以东尼·霍尔的通信顺序进程(CSP)为基础,采取类似模型的其他语言包括Occam和Limbo,但它也具有Pi运算的特征,比如通道传输。在1.8版本中开放插件(Plugin)的支持,这意味着现在能从Go语言中动态加载部分函数。
与C++相比,Go语言并不包括如异常处理、继承、泛型、断言、虚函数等功能,但增加了 Slice 型、并发、管道、垃圾回收、接口(Interface)等特性的语言级支持。Google 目前仍正在讨论是否应该支持泛型,其态度还是很开放的,但在该语言的常见问题列表中,对于断言的存在,则持负面态度,同时也为自己不提供类型继承来辩护。
不同于Java,Go语言内嵌了关联数组(也称为哈希表(Hashes)或字典(Dictionaries)),就像字符串类型一样。
语言特性
1. 垃圾回收
- 内存自动回收,再也不需要开发人员管理内存
只需要new分配内存,不需要释放
2. 天然并发
- 从语言层面支持并发,非常简单
Goroutine,轻量级线程,创建成千上万个Goroutine成为可能
基于CSP(Communicating Sequential Process)模型实现
3. channel
- 管道,类似unix/linux中的pipe
多个Goroutine之间通过channel进行通信
支持任何类型
close 内置函数用来关闭 channel
4. Goroutine
Go语言的主要的功能在于令人简易使用的并行设计,这个方法叫做Goroutine,通过Goroutine能够让你的程序以异步的方式运行,而不需要担心一个函数导致程序中断,因此Go语言也非常地适合网络服务。
Goroutine是类似线程的概念(但Goroutine并不是线程)。线程属于系统层面,通常来说创建一个新的线程会消耗较多的资源且管理不易。而 Goroutine就像轻量级的线程,但我们称其为并发,一个Go程序可以运行超过数万个 Goroutine,并且这些性能都是原生级的,随时都能够关闭、结束。一个核心里面可以有多个Goroutine,通过GOMAXPROCS参数你能够限制Gorotuine可以占用几个系统线程来避免失控。
在内置的官方包中也不时能够看见Goroutine的应用,像是net/http中用来监听网络服务的函数实际上是创建一个不断运行循环的Goroutine。
编译器
当前有两个Go语言的编译器的分支。官方编译器gc和gccgo。官方编译器在初期使用C写成,后用go重写从而实现自举。Gccgo是一个使用标准GCC作为后端的Go编译器。
官方编译器支持跨平台编译(但不支持CGO),允许将源码编译为可在目标系统、架构上执行的二进制文件。
安装
设置环境变量:
- export GOROOT=$PATH:/path/to/go/
- export PATH=$PATH:$GOROOT/bin/
- export GOPATH=/home/user/project/go
终端测试:
- go version
- go env
- Gofmt -w *.go
IDE安装可参考:
go 标准命令
go build
go build
命令用于编译我们指定的源码文件或代码包以及它们的依赖包
- go build -o bin/tongbupan go_dev/tongbupan/main
- -o :指定编译后存放目录以及名称
go install
go install
用于编译并安装指定的代码包及它们的依赖包。
go get
go get
可以根据要求和实际情况从互联网上下载或更新指定的代码包及其依赖包,并对它们进行编译和安装。
go clean
go clean
命令会删除掉执行其它命令时产生的一些文件和目录
go doc & godoc
go doc
命令可以打印附于Go语言程序实体上的文档。我们可以通过把程序实体的标识符作为该命令的参数来达到查看其文档的目的。
godoc
是一个很强大的工具,同样用于展示指定代码包的文档。
go run
go run
命令可以编译并运行命令源码文件。
- go run src/go_dev/hello.go
标记名称 | 标记描述 |
---|---|
-a | 强行对所有涉及到的代码包(包含标准库中的代码包)进行重新构建,即使它们已经是最新的了。 |
-n | 打印编译期间所用到的其它命令,但是并不真正执行它们。 |
-p n | 指定编译过程中执行各任务的并行数量(确切地说应该是并发数量)。在默认情况下,该数量等于CPU的逻辑核数。但是在darwin/arm 平台(即iPhone和iPad所用的平台)下,该数量默认是1 。 |
-race | 开启竞态条件的检测。不过此标记目前仅在linux/amd64 、freebsd/amd64 、darwin/amd64 和windows/amd64 平台下受到支持。 |
-v | 打印出那些被编译的代码包的名字。 |
-work | 打印出编译时生成的临时工作目录的路径,并在编译结束时保留它。在默认情况下,编译结束时会删除该目录。 |
-x | 打印编译期间所用到的其它命令。注意它与-n 标记的区别。 |
go test
go test
命令用于对Go语言编写的程序进行测试。这种测试是以代码包为单位的。
go list
go list
命令的作用是列出指定的代码包的信息。
go fix与go tool fix
go fix
会把指定代码包的所有Go语言源码文件中的旧版本代码修正为新版本的代码。
命令go fix
其实是命令go tool fix
的简单封装。
go vet与go tool vet
go vet
是一个用于检查Go语言源码中静态错误的简单工具。
go vet
命令是go tool vet
命令的简单封装。
go tool pprof
go tool pprof
命令来交互式的访问概要文件的内容。
go tool cgo
可以使我们创建能够调用C语言代码的Go语言源码文件。
go env
go env
用于打印Go语言的环境信息。
名称 | 说明 |
---|---|
CGO_ENABLED | 指明cgo工具是否可用的标识。 |
GOARCH | 程序构建环境的目标计算架构。 |
GOBIN | 存放可执行文件的目录的绝对路径。 |
GOCHAR | 程序构建环境的目标计算架构的单字符标识。 |
GOEXE | 可执行文件的后缀。 |
GOHOSTARCH | 程序运行环境的目标计算架构。 |
GOOS | 程序构建环境的目标操作系统。 |
GOHOSTOS | 程序运行环境的目标操作系统。 |
GOPATH | 工作区目录的绝对路径。 |
GORACE | 用于数据竞争检测的相关选项。 |
GOROOT | Go语言的安装目录的绝对路径。 |
GOTOOLDIR | Go工具目录的绝对路径。 |
Hello World
- package main
- import "fmt"
- func main() {
- fmt.Println("Hello World")
- }
程序基本语法
- 所有go源码以.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 |
append | bool | byte | cap | close | complex | complex64 | complex128 | uint16 |
copy | false | float32 | float64 | imag | int | int8 | int16 | uint32 |
int32 | int64 | iota | len | make | new | nil | panic | uint64 |
println | real | recover | string | true | uint | uint8 | uintptr |
程序基本结构
1. 任何一个代码文件隶属于一个包
2. golang可执行程序,package main,并且有且只有一个main入口函数
3. 包中函数调用:
- 同一个包中函数,直接调用
- 不同包中函数,通过包名+点+函数名进行调用
4. 包访问控制规则:
- 大写意味着这个函数/变量是可导出的
- 小写意味着这个函数/变量是私有的,包外部不能访问
项目目录
- $ tree project
- project
- ├── bin
- │ ├── example1
- │ └── goroute_example
- ├── pkg
- ├── src
- │ └── go_dev
- │ └── day1
- │ ├── example1
- │ │ ├── debug
- │ │ └── hello.go
- │ └── goroute_example
- │ ├── goroute
- │ │ └── add.go
- │ └── main
- │ └── main.go
- └── vender
- Src 源码文件
- Bin 编译后二进制文件
- vender 第三方
- pkg 静态文件
简单栗子
- $ tree project
- project
- ├── bin
- │ └── goroute_example
- ├── pkg
- ├── src
- │ └── go_dev
- │ └── test1
- │ └── goroute_example
- │ ├── goroute
- │ │ └── add.go
- │ └── main
- │ └── main.go
- └── vender
- [main.go]
- package main
- import (
- "fmt"
- "go_dev/test1/goroute_example/goroute"
- )
- func main() {
- pipe := make(chan )
- go goroute.Add(pipe, , )
- sum := <-pipe
- fmt.Println(sum)
- }
- [add.go]
- package goroute
- func Add(pipe chan int, a int, b int) {
- pipe <- (a + b)
- }
- $ go build -o bin/goroute_example go_dev/test1/goroute_example/main
- $ bin/goroute_example
- $
Go学习笔记(一)Let's 干的更多相关文章
- Binder学习笔记(十二)—— binder_transaction(...)都干了什么?
binder_open(...)都干了什么? 在回答binder_transaction(...)之前,还有一些基础设施要去探究,比如binder_open(...),binder_mmap(...) ...
- Linux 学习笔记
Linux学习笔记 请切换web视图查看,表格比较大,方法:视图>>web板式视图 博客园不能粘贴图片吗 http://wenku.baidu.com/view/bda1c3067fd53 ...
- [DL学习笔记]从人工神经网络到卷积神经网络_1_神经网络和BP算法
前言:这只是我的一个学习笔记,里边肯定有不少错误,还希望有大神能帮帮找找,由于是从小白的视角来看问题的,所以对于初学者或多或少会有点帮助吧. 1:人工全连接神经网络和BP算法 <1>:人工 ...
- JUC.Condition学习笔记[附详细源码解析]
目录 Condition的概念 大体实现流程 I.初始化状态 II.await()操作 III.signal()操作 3个主要方法 Condition的数据结构 线程何时阻塞和释放 await()方法 ...
- 【转】Ant学习笔记——自己构建Ant编译环境
自从年初开始用NetBeans6.0,才接触到Ant. 这是今年6月份的一篇Ant学习笔记.安装 1.下载并构建环境. 去官网下载src包和bin包.解压缩它们到同一目录,运行build.bat, ...
- Android学习笔记之HttpClient实现Http请求....
PS:最近光忙着考试了....破组成原理都看吐了....搞的什么也不想干...写篇博客爽爽吧....貌似明天就考试了...sad... 学习笔记: 1.如何实现Http请求来实现通信.... 2.解决 ...
- [转]LUA 学习笔记
Lua 学习笔记 入门级 一.环境配置 方式一: 1.资源下载http://www.lua.org/download.html 2.用src中的源码创建了一个工程,注释调luac.c中main函数,生 ...
- <老友记>学习笔记
这是六个人的故事,从不服输而又有强烈控制欲的monica,未经世事的千金大小姐rachel,正直又专情的ross,幽默风趣的chandle,古怪迷人的phoebe,花心天真的joey——六个好友之间的 ...
- xml基础学习笔记04
今天继续xml学习,主要是:SimpleXML快速解析文档.xml与数组相互转换 .博客中只是简单的做一个学习记录.积累.更加详细的使用方法,可以查看php手册 1.SimpleXML快速解析文档 前 ...
- 前端学习笔记汇总(之merge方法)
学习笔记 关于Jquery的merge方法 话不多说,先上图 使用jquery时,其智能提示如上,大概意思就是合并first和second两个数组,得到的结果是first+(second去重后的结果) ...
随机推荐
- 开涛spring3(9.1) - Spring的事务 之 9.1 数据库事务概述
9.1 数据库事务概述 事务首先是一系列操作组成的工作单元,该工作单元内的操作是不可分割的,即要么所有操作都做,要么所有操作都不做,这就是事务. 事务必需满足ACID(原子性.一致性.隔离性和持久性 ...
- 开涛spring3(6.1) - AOP 之 6.1 AOP基础
6.1.1 AOP是什么 考虑这样一个问题:需要对系统中的某些业务做日志记录,比如支付系统中的支付业务需要记录支付相关日志,对于支付系统可能相当复杂,比如可能有自己的支付系统,也可能引入第三方支付平 ...
- WPF自动更新程序
WPF AutoUpdater 描述: WPF+MVVM实现的自动更新程序 支持更新包文件验证(比较文件MD5码) 支持区分x86与x64程序的更新 支持更新程序的版本号 支持执行更新策略 截图: 使 ...
- LindAgile.Modules模块化的设计
在LindAgile中有一个比较主推的技术,就是模块化,一切组件都可以被抽象成一个小小的模块,而每个小模块的实现可能又有多种方式,如日志模块可以有LindLoger,Log4net等实现,而具体在程序 ...
- JS实现鼠标移上去图片停止滚动移开恢复滚动效果
这是在做个人站的时候展示项目成果,因为不光需要展示,还需要介绍详细内容,就在滚动展示的地方做了这个效果以便于点开想要看的项目. 首先,要做的是一个需要滚动的区域.我前边写过一个关于图片循环滚动的示例, ...
- JVM-7.Java内存模型与高效并发
更多内容参见<并发与同步>系列 一.引子 二.JMM 三.Java中的线程 四.线程安全 五.锁优化 一.引子 运算能力 摩尔定律:晶体管数量,代表的CPU的频率 Amdahl ...
- 【小练习06】HTML+CSS--教学大讲堂
要求实现如下效果图: 代码演示 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"&g ...
- Thrift总结(一)介绍
这段时间,一直在整理公司的内部 rpc 服务接口,面临的一个问题就是:由于公司内部的系统由几个不同的语言编写的.C# ,java,node.js 等,如何实现这些内部系统之间的接口统一调用,确实是比较 ...
- 构建自己的PHP框架--构建模版引擎(2)
自从来到新公司就一直很忙,最近这段时间终于稍微闲了一点,赶紧接着写这个系列,感觉再不写就烂尾了. 之前我们说到,拿到{{ $name }}这样一段内容时,我们只需要将它转化成<?php echo ...
- Caused by: org.springframework.beans.NotWritablePropertyException: Invalid property 'URIType' of bean class [com.alibaba.citrus.service.uribroker.uri.GenericURIBroker]
linux中的JDK为JDK8,tomcat为tomcat8 加入dubbo.war包 启动报错! Caused by: org.springframework.beans.factory.BeanC ...