文章目录
1. 初识GO
1.1 Go语言优势
- 可直接编译成机器码,不依赖其他库,glibc 的版本有一定要求,部署就是扔一个文件 上去就完成了。
- 静态类型语言,但是有动态语言的感觉,静态类型的语言就是可以在编译的时候检查出 来隐藏的大多数问题,动态语言的感觉就是有很多的包可以使用,写起来的效率很高。
- 语言层面支持并发,这个就是 Go 最大的特色,天生的支持并发。Go 就是基因里面支 持的并发,可以充分的利用多核,很容易的使用并发。
- 内置 runtime,支持垃圾回收,这属于动态语言的特性之一吧,虽然目前来说 GC(内存 垃圾回收机制)不算完美,但是足以应付我们所能遇到的大多数情况,特别是 Go1.1 之 后的 GC。
- 简单易学,Go语言的作者都有C的基因,那么Go自然而然就有了C的基因,那么Go 关键字是 25 个,但是表达能力很强大,几乎支持大多数你在其他语言见过的特性:继 承、重载、对象等。
- 丰富的标准库,Go目前已经内置了大量的库,特别是网络库非常强大。
- 内置强大的工具,Go 语言里面内置了很多工具链,最好的应该是 gofmt 工具,自动化 格式化代码,能够让团队 review 变得如此的简单,代码格式一模一样,想不一样都很
困难。 - 跨平台编译,如果你写的Go代码不包含cgo,那么就可以做到window系统编译linux
的应用,如何做到的呢?Go 引用了 plan9 的代码,这就是不依赖系统的信息。 - 内嵌C支持,Go里面也可以直接包含C代码,利用现有的丰富的C库。
1.2 Go适合做什么?
- 服务器编程,以前你如果使用C或者C++做的那些事情,用Go来做很合适,例如处理 日志、数据打包、虚拟机处理、文件系统等。
- 分布式系统,数据库代理器等。
- 网络编程,这一块目前应用最广,包括Web应用、API应用、下载应用。
- 内存数据库,如google开发的groupcache,couchbase的部分组建。
- 云平台,目前国外很多云平台在采用Go开发,CloudFoundy的部分组建,前VMare的技术总监自己出来搞的 apcera 云平台。
1.3 Go标准命令概述
Go 语言中包含了大量用于处理 Go 语言代码的命令和工具。其中,go 命令就是最常用的一 个,它有许多子命令。这些子命令都拥有不同的功能,如下所示。
build
:用于编译给定的代码包或Go语言源码文件及其依赖包。clean
:用于清除执行其他go命令后遗留的目录和文件。doc
:用于执行godoc命令以打印指定代码包。env
:用于打印Go语言环境信息。fix
:用于执行gotoolfix命令以修正给定代码包的源码文件中包含的过时语法和代码调用。fmt
:用于执行gofmt命令以格式化给定代码包中的源码文件。get
:用于下载和安装给定代码包及其依赖包(提前安装git或hg)。 l list:用于显示给定代码包的信息。run
:用于编译并运行给定的命令源码文件。install
:编译包文件并编译整个程序。test
:用于测试给定的代码包。tool
:用于运行Go语言的特殊工具。version
:用于显示当前安装的Go语言的版本信息。
1.4 HelloWorld
代码:
package main // 必须包含一个main 包
import "fmt" // 导入包含,导入后必须要使用,否则编译器会自动优化掉这一行
func main() { // 花括号必须这种格式
// main函数不支持参数
// 不需要用分号换行
fmt.Println("hello world!")
}
运行:
zhou@zhoudeMacBook-Air helloworld % go run main.go
hello world!
zhou@zhoudeMacBook-Air helloworld %
2. 基础类型
2.1 变量
2.1.1 变量声明
//1、单变量声明,类型放在变量名之后,可以为任意类型
var 变量名 类型
var v1,v2,v3 string //多变量同类型声明
//2、多变量声明
var {
v1 int
v2 []int
}
2.1.2 变量初始化
//1、使用关键字var,声明变量类型并赋值
var v1 int=10
//2、使用关键字var,直接对变量赋值,go可以自动推导出变量类型
var v2=10
//3、直接使用“:=”对变量赋值,不使用var,两者同时使用会语法冲突,推荐使用
v3:=10
2.1.3 变量赋值
//1、声明后再变量赋值
var v int
v=10
//2、多重赋值,经常使用在函数的多返回值中,err,v=func(arg)
i,j=j,i //两者互换,并不需要引入中间变量
2.1.4 匿名变量
//Go中所有声明后的变量都需要调用到,当出现函数多返回值,并且部分返回值不需要使用时,可以使用匿名变量丢弃该返回值
func GetName()(firstName,lastName,nickName string){
return "May","Chan","Make"
}
_,_,nickName:=GetName() //使用匿名变量丢弃部分返回值
2.2 常量
Go语言中,常量是编译时期就已知且不可变的值,常量可以是数值类型(整型、浮点型、复数类型)、布尔类型、字符串类型。
2.2.1 常量定义
//1、可以限定常量类型,但非必需
const Pi float64 = 3.14
//2、无类型常量和字面常量一样
const zero=0.0
//3、多常量赋值,可以声明类型,也可以自动推导
const(
size int64=1024
eof=-1
)
//4、常量的多重赋值,类似变量的多重赋值
const u,v float32=0,3
const a,b,c=3,4,"foo" //无类型常量的多重赋值
//5、常量赋值是编译期行为,可以赋值为一个编译期运算的常量表达式
const mask=1<<3
2.2.2 预定义常量,枚举类型
//预定义常量:true、false、iota
//iota:可修改常量,在每次const出现时被重置为0,在下一个const出现前,每出现一次iota,其代表的值自动增1。
const( //iota重置为0
c0=iota //c0==0
c1=iota //c1==1
c2=iota //c2==2
)
//两个const赋值语句一样可以省略后一个
const( //iota重置为0
c0=iota //c0==0
c1 //c1==1
c2 //c2==2
)
// 枚举类型
const(
Sunday=iota //Sunday==0,以此类推
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday //大写字母开头表示包外可见
numberOfDays //小写字母开头表示包内私有
)
2.3 基础数据类型
package main
import "fmt"
func main() {
// 1. bool 类型
// 默认为false
var a bool
fmt.Println("a =", a)
a = true
// 自动推导类型
var a1 = false
fmt.Println("a1 =", a1)
a2 := true
fmt.Println("a2 =", a2)
// 2. 浮点型
fmt.Println("------浮点型------")
var b float32
b = 3.14
fmt.Println("b =", b)
b1 := 3.14
fmt.Printf("b1 type is %T\n", b1)
fmt.Println("b1 =", b1)
// 3. 字符类型
fmt.Println("------字符类型-------")
var ch byte // 声明字符类型
ch = 97
fmt.Println("ch =", ch)
// 格式化输出,%c 以字符方式打印, %d 以整型方式打印
fmt.Printf("ch = %c, ch = %d\n", ch, ch)
// 用单引号赋值
ch = 'b'
fmt.Printf("ch = %c, ch = %d\n", ch, ch)
// 4. 字符串类型
fmt.Println("------字符串类型-------")
var str1 string
str1 = "abc"
fmt.Println("str1 =", str1)
str2 := "def"
str3 := str1 + str2
fmt.Println("str3 =", str3)
fmt.Println("str3.len =", len(str3))
// 字符串最后有个隐藏的 '\0'
// 支持下标操作
fmt.Println("str3[2] =", str3[2])
// 5. 复数类型
fmt.Println("------复数类型-------")
var c complex64
c = 3 + 4i
fmt.Println("c =", c)
// 取实部、虚部
fmt.Println("real(c) =", real(c), ", imag(c) =", imag(c))
}
2.4 输入输入
输入输出类似于C语言的风格,有类似的格式