GO语言语法入门
引言
Go
Go语言是谷歌2009发布的编程语言,它是一种并发的、带垃圾回收的、快速编译的语言。
它结合了解释型语言的游刃有余,动态类型语言的开发效率,以及静态类型的安全性。它也打算成为现代的,支持网络与多核计算的语言。要满足这些目标,需要解决一些语言上的问题:一个富有表达能力但轻量级的类型系统,并发与垃圾回收机制,严格的依赖规范等等。这些无法通过库或工具解决好,因此Go也就应运而生了。
优势
- 语法简单,上手快;
- 性能高,编译快,开发效率也不低;
- 丰富的标准库;
- 原生支持并发,协程模型是非常优秀的服务端模型,同时也适合网络调用;
- 部署方便,编译包小,除 glibc 外没有其他外部依赖;
- 自带完善的工具链, 大大提高了团队协作效率和一致性。 比如 gofmt ,gofix,,govet 等工具。
Docker等很多 Go 产品的流行,更证明了 Go 语言的优秀。
适用场景
- 服务器编程,如:处理日志、数据打包、虚拟机处理、文件系统等;
- 分布式系统,数据库代理器等;
- 内存数据库,google开发的groupcache,couchbase的部分组建;
- 云平台,目前国外很多云平台在采用Go开发,如:CloudFoundy(VMware推出的业界第一个开源PaaS云平台)的部分组建。
缺点
1. Go的import包不支持版本,有时候升级容易导致项目不可运行,需要自己控制相应的版本信息;
2. Go的goroutine一旦启动之后,不同的goroutine之间切换不是受程序控制,需要严谨的逻辑;
3. 没什么太多应用场景非要 Golang 才能做的
3.1 开发 web 没有 php ruby 成熟、快速
3.2 开发 server 没有 java 现成解决方案多
GO指南
环境搭建
安装Golang的SDK
(1) http://www.golangtc.com/download
(2) 安装完成之后,打开终端,输入go、或者go version查看安装版本
配置Go环境变量
配置Go环境变量GOPATH和GOBIN
(1)打开终端,cd ~
(2)查看是否有.bash_profile文件:
ls -all
(3)有则跳过此步,没有则:
1)创建:touch .bash_profile
2)编辑:open -e .bash_profile
3)自定义GOPATH和GOBIN位置:
GOPATH:日常开发的根目录。GOBIN:是GOPATH下的bin目录。
export GOPATH=/Users/yuan/go |
(4)编译:source .bash_profile
(5)*查看Go环境变量:go env
开发工具配置
sublime text
一定要先配置好Go环境变量GOPATH和GOBIN,再安装此插件,要不插件会提示找不到GOPATH和GOBIN;
选用 sublime text 安装 gosublime 插件进行开发( golang 语法高亮提示)
(1)安装 package controll(若已安装,请跳过)
使用Ctrl+`快捷键或者通过View->Show Console菜单打开命令行,粘贴如下代码:
import urllib.request,os; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); open(os.path.join(ipp, pf), 'wb').write(urllib.request.urlopen( 'http://sublime.wbond.net/' + pf.replace(' ','%20')).read()) 2 |
(2)install go sublime
Command+shift+p 输入并选择packageControl: install package
然后输入并选择goSublime
安装完成就OK啦~~
Gogland
选择Gogland, 下载安装即可,3个月
https://www.jetbrains.com/go/download/
LiteIDE
国产IDE
http://golangtc.com/download/liteide
小试牛刀
在你的gopath目录下,新建main.go文件即可以进行编码了。
package main |
代码编写完成之后,使用command+b打开sublime text终端
(一)编译+执行
使用go build main.go对其进行编译,编译通过的结果信息如下:
[ `go build main.go` | done: 420.495985ms ]
提示编译成功之后,再执行shell命令,执行刚刚编译之后的文件./main即可看到运行结果:
[ `./main` | done: 10.532868ms ]
hello go
(二)直接执行
如果仅仅是只需要看到运行的结果,而不产生可执行文件(文件名和项目名一样)则在sublime text终端中直接使用go run xxx.go即可:
[ `go run main.go` | done: 314.476988ms ]
hello go
基础
包、变量、函数
package main |
包
1. 每个 Go 程序都是由包组成的。
2. 程序运行的入口是包 main 。
3. 按照惯例,包名与导入路径的最后一个目录一致。例如,"math/rand" 包由 package rand 语句开始。
变量
- 变量声明使用关键字var
- 初始值存在时可省略类型声明
- 短赋值语句:= 可以用于替代 var 的隐式类型声明(:=结构不能使用在函数外,函数外的每个语法块都必须以关键字开始)
var name1 string //声明变量 |
函数
- 可以返回任意数量的返回值
- 类型声明在变量名之后
- 同一类型的多个参数,最后一个参数需声明类型
func swap(x, y string) (string, string) { |
- 命名返回值的参数
func split(sum int) (x, y int) { |
基本类型
bool |
常量
const Pi = 3.14 |
运算符
http://www.yiibai.com/go/go_operators.html
注意:
- 没有++i,--i,只有i++、i--
- 不能使用i++、i--对变量直接赋值
流程控制
for
Go 只有一种循环结构—— for 循环
for i := 0; i < 10; i++ { |
if else
if x < 0 { |
switch
case 语句匹配后会自动终止(无需break),除非用 fallthrough 语句作为结尾,则会强制执行下一条case的语句或者default语句,而不判断expression。
x := 2 |
defer
延迟(defer)处理
Defer用于确保在稍后的程序中,执行函数调用。
defer语句在封装函数(main)结束时执行。
package main |
复杂类型
struct
要定义结构,必须使用type和struct语句。struct语句定义了一个新的数据类型,在程序中有多个成员。type语句在例子中绑定一个类型为struct的名字。 struct语句的格式如下:
type person struct { |
访问结构体成员使 .
package main |
slice
因为切片(Slice)是数组上的抽象。 它实际上使用数组作为底层结构体.len()函数返回切片中存在的元素数量,其中cap()函数返回切片(Slice)的容量(大小),即可容纳多少个元素。
package main |
map
var map_variable map[key_data_type]value_data_type
map_variable = make(map[key_data_type]value_data_type)
map_variable := make(map[key_data_type]value_data_type)
delete(map_variable, key)
package main |
range
range函数可以用来遍历array,slice和map。
当用于遍历array和slice时,range函数返回索引和元素;
当用于遍历map的时候,range函数返回key和value。
package main |
方法和接口
方法
Go中没有类,但是可以为结构体定义方法,方法就是一类带有特殊的接受者参数的函数。
方法接受者位于func关键字和方法名之间。
可以为非结构体类型声明方法,但不能为其它包内定义的类型的接收者声明方法,且不能为内建类型声明方法。
package main |
package main |
函数是完全闭包的
package main |
接口
接口类型是由一组方法签名的集合。
接口类型的值可以保存任何实现了接口方法的变量。
类型通过实现了一个接口的所有方法来实现这个接口,而不需要专门的显示声明也就是”implements”关键字来声明。
package main import "fmt" type geometry interface { func (r rect) area() float64 { // output |
error
Go编程提供了一个非常简单的错误处理框架,以及内置的错误接口类型,如下声明:
type error interface { |
Go函数通常返回错误作为最后一个返回值。 可使用errors.New来构造一个基本的错误消息
package main |
并发
goroutine
goroutine 是由 Go 运行时环境管理的轻量级线程。
使用 go f(x, y, z) 开启一个新的 goroutine 执行。
package main |
channel
channel 是有类型的管道,可以用 channel 操作符 <- 对其发送或者接收值。
ch <- v // 将 v 送入 channel ch。
v := <-ch // 从 ch 接收,并且赋值给 v。
默认情况下,在另一端准备好之前,发送和接收都会阻塞。这使得 goroutine 可以在没有明确的锁或竞态变量的情况下进行同步。
package main |
channel 可以是带缓冲的。为 make 提供第二个参数作为缓冲长度来初始化一个缓冲 channel:
ch := make(chan int, 100)
向缓冲 channel 发送数据的时候,只有在缓冲区满的时候才会阻塞。当缓冲区清空的时候接受阻塞。
package main |
close
发送者可以 close 一个 channel 来表示再没有值会被发送了。接收者可以通过赋值语句的第二参数来测试 channel 是否被关闭:当没有值可以接收并且 channel 已经被关闭,那么
v, ok := <-ch
ok 会被设置为 false。
注意: 只有发送者才能关闭 channel,而不是接收者。向一个已经关闭的 channel 发送数据会引起 panic。
package main |
select
Go语言的选择(select)可等待多个通道操作。将goroutine和channel与select结合是Go语言的一个强大功能。
select 会阻塞,直到条件分支中的某个可以继续执行,这时就会执行那个条件分支。如果有多个都准备好的时候,会随机选一个。
package main |
Goroutine 调度

G: 一个goroutine,它有自己的栈,instruction pointer和其他信息(正在等待的channel等等),用于调度。
P: 代表调度的上下文,可以把它看做一个局部的调度器,使go代码在一个线程上跑,它是实现从N:1到N:M映射的关键。

- 图中看到,当一个OS线程M0陷入阻塞时,P转而在OS线程M1上运行。调度器保证有足够的线程来运行所以的context P。
- 当MO返回时,它必须尝试取得一个context P来运行goroutine,一般情况下,它会从其他的OS线程那里steal偷一个context过来,
如果没有偷到的话,它就把goroutine放在一个global runqueue里,然后自己就去睡大觉了(放入线程池里)。Contexts们也会周期性的检查global runqueue。

分配不均——steal work
global runqueue
- 其他的P

- 开大括号不能放在单独的一行
- 未使用的变量
- 未使用的Imports
- 不支持前置版本的自增和自减,也无法在表达式中使用这两个操作符。
。。。
查看更多陷阱,请点击↓
http://studygolang.com/articles/8382
GO语言语法入门的更多相关文章
- c语言快速入门2
如果你想快速入门计算机,可以参考我的上一篇帖子,先了解一些必备的软知识,然后再来进行语言的快速入门 计算机入门基础知识 c语言快速入门1 1.1.12 函数的概念 函数的定义:c语言的基本单位,c语言 ...
- Swift语言快速入门
Swift语言快速入门(首部同步新版官方API文档和语法的Swift图书,确保代码可编译,作者专家在线答疑,图书勘误实时跟进) 极客学院 编著 ISBN 978-7-121-24328-8 201 ...
- [SQL]SQL语言入门级教材_SQL语言快速入门(五)
SQL语言快速入门(一) SQL是英文Structured Query Language的缩写,意思为结构化查询语言. SQL语言的主要功能就是同各种数据库建立联系,进行沟通.按照ANSI(美国国家标 ...
- Java基础语法入门01
Java基础语法入门01 学习java你要先进行去了解JDK,JRE,JVM JDK Java开发工具包 JRE Java语言开发的运行环境 JVM Java虚拟机,用于Java语言的跨平台所用. 当 ...
- Go 语言极速入门
本系列文章主要是记录<Go 语言实战>和<Google 资深工程师深度讲解 Go 语言>的学习笔记. Go 语言极速入门1 - 环境搭建与最简姿势Go 语言极速入门2 - 基础 ...
- Markdown之语法入门篇
Markdown语法入门 一.什么是Markdown语言 我相信有很多小伙伴没有听说过Markdown语言.的确,对于一般人来说,有word足够了.但是有这么一群人,受够了word那糟糕的排版方式,需 ...
- R 语言 相关入门资料
<R语言基础语法入门>: http://www.xueqing.tv/upload/april-training/day1/index.html#1
- C语言高速入门系列(二)
C语言高速入门系列(二) -----转载请注明出处coder-pig 本节引言: 在前面一节中我们对C语言进行了初步的了解,学会了使用IDE进行代码的编写,编译执行! 在这一节中我们会对C语言的基本的 ...
- Swift语言高速入门
Swift语言高速入门(首部同步新版官方API文档和语法的Swift图书,确保代码可编译,作者专家在线答疑,图书勘误实时跟进) 极客学院 编著 ISBN 978-7-121-24328-8 201 ...
随机推荐
- Nginx服务应用
虚拟主机 基于域名的虚拟主机 所谓基于域名的虚拟主机,意思就是通过不同的域名区分不同的虚拟主机,基于域名的虚拟主机是企业应用最广的虚拟主机类型,几乎所有对外提供服务的网站都是使用基于域名的虚拟主机 基 ...
- 我非要捅穿这 Neutron(四)Open vSwitch in Neutron
目录 文章目录 目录 前文列表 OvS In Neutron 网络拓扑 OvS In Neutron 网络实现模型 双节点混合平面网络 双节点网络拓扑 OvS Bridges 与初始流表项 OvS b ...
- Java计算器的图形界面应用程序
JAVA计算器的图形界面应用程序 题目简介: 整体分析: 实验代码: /*部分使用插件做界面*/ import java.awt.EventQueue; import javax.swing.JB ...
- 对于MVVM的理解
MVVM 是Model-View-ViewModel的缩写. Model 代表数据模型,也可以在model中定义数据修改和操作的业务逻辑. View 代表UI组件,负责姜黄素局模型转化成UI展现出来. ...
- android webkit 初始化流程
以android 4.2为例 1, android 4.2中 WebViewClassic.java 为 WebView.java的代理类. 2,程序运行后,浏览器首先加载webkit so. Web ...
- 华为HCNA乱学Round 9:VRRP
- [转帖]CentOS 7安装并启动Google浏览器(★firecat亲测有效★)
CentOS 7安装并启动Google浏览器(★firecat亲测有效★) https://blog.csdn.net/libaineu2004/article/details/82821405 自己 ...
- 前端开发工具包 WijmoJS 2019V1正式发布:全新的在线 Demo 系统,助您快速上手,开发无忧
前端开发工具包WijmoJS在2019年的第一个主要版本2019V1已经发布,本次发布包括了更加易用的在线Demo系统.各控件新增功能.NPM 包的改动,以及全新的浏览器API组件. WijmoJ ...
- Shell脚本编程(一)
shell 脚本编程(一) 1 . shell 的作用 Shell的作用是解释执行用户的命令,用户输入一条命令,Shell就解释执行一条,这种方式称为交互式(Interactive),Shell还有一 ...
- SqlServer中#和##的区别
本地临时表的名称以单个数字字符(#)开头,它们仅对当前的用户连接是可见的. 全局临时表的名称以两个数字字符(##)开头,创建后对任何用户都是可见的.