Table of Contents generated with DocToc
go变量、常量、自定义类型、包、函数的命名方式必须遵循以下规则:
1. 首字符可以是任意Unicode字符或下划线。
2. 首字符之外的部分可以是Unicode字符、下划线或数字。
3. 名字的长度无限制。
理论上名字里可以有汉字,甚至可以全是汉字,但实际中不要这么做。
Go语言关键字
break default func interface select case defer go map struct chan else goto package switch const if range type continue for import return fallthrough var
常量
true false iota nil
数据类型
int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 uintptr float32 float64 complex128 complex64 bool byte rune string error
函数
make len cap new append copy close delete complex real imag panic recover
算法术运算符
运算符 | 描述 |
---|---|
+ | 相加 |
- | 相减 |
* | 相乘 |
/ | 相除 |
% | 求余 |
//arithmetic 算术运算
func arithmetic() {
var a f
Table of Contents generated with DocToc
Ken Thompson
- 1966年:加入了贝尔实验室,在参与 Multics (多路信息计算)开发期间,创造出了B语言,并用一个月的时间用B语言开发了全新的操作系统UNICS,后来改名为我们所熟悉的UNIX 操作系统。
- 1971年:和丹尼斯·利奇(Dennis Ritchie)一起共同发明了C语言。
- 1973年:和丹尼斯·利奇(Dennis Ritchie)使用C语言重写了UNIX,并安装于PDP-11的机器之上。
- 1983年:美国计算机协会将图灵奖授予汤普森。
- 2000年:离开贝尔实验室,已退休的汤普森成为了一名飞行员。
- 2006年:加入Google工作。
- 2007年:64岁的高龄,与Rob Pike和Robert Griesemer主导了Go语言的开发。
Rob Pike
- Go语言项目总负责人。
- 贝尔实验室Unix团队成员,参与的项目包括Plan 9,Inferno操作系统和Limbo编程语言。
- UTF-8字符集规范唯二的发明人之一(另一位是Ken Thompson)。
- 《UNIX环境编程》和《程序设计实践》这两本书的作者之一。
- 第22届莫斯科夏季奥运会射箭项目的银牌得主。
- 业余天文学家,设计的珈玛射线望远镜差点被 NASA 用在航天飞机上。
- 他的媳妇Renee French 就是 Go 语言吉祥物的设计人。
Robert Griesemer
- 参与V8 JavaScript引擎的开发。
- 参与Java HotSpot虚拟机的研发。
2007年,Google的几位大牛正在用C++开发一些比较繁琐但是核心的工作,主要是分布式集群,大牛觉得很闹心。此时C+
定义结构体
type user struct {
id int
score float32
enrollment time.Time
name, addr string //多个字段类型相同时可以简写到一行里
}
声明和初始化结构体
var u user //声明,会用相应类型的默认值初始化struct里的每一个字段
u = user{} //用相应类型的默认值初始化struct里的每一个字段
u = user{id: 3, name: "zcy"} //赋值初始化
u = user{4, 100.0, time.Now(), "zcy", "beijing"} //赋值初始化,可以不写字段名,但需要跟结构体定义里的字段顺序一致
访问与修改结构体
u.enrollment = time.Now() //给结构体的成员变量赋值
fmt.Printf("id=%d, enrollment=%v, name=%s\n", u.id, u.enrollment, u.name)//访问结构体的成员变量
成员方法
//可以把user理解为hello函数的参数,即hello(u user, man string)
func (u user) hello(man string) {
fmt.Println("hi " + man + ", my name is " + u.name)
}
//函数里不需要访问user的成员,可以传匿名,甚至_也不传
func (_ user) think(man string) {
fmt.Println("hi " + man + ", do you know my name?")
}
为自定义类型添加方法
type UserMap map[int]User //自定义类型
//可以给自定义类型添加任意方法
func (um UserMap) GetUser(id int) User {
return um[id]
}
结构体的可见性:
- go语言关于可见的统一规则:大写字母开头跨package也可以访问;否则只能本pack
//函数定义。a,b是形参
func argf(a int, b int) {
a = a + b
}
var x, y int = 3, 6
argf(x, y) //函数调用。x,y是实参
func argf(a, b *int) {
*a = *a + *b
*b = 888
}
var x, y int = 3, 6
argf(&x, &y)
slice、map、channel都是引用类型,它们作为函数参数时其实跟普通struct没什么区别,都是对struct内部的各个字段做一次拷贝传到函数内部。
package main
import "fmt"
func slice_arg_1(arr []int) { //slice作为参数,实际上是把slice的arrayPointer、len、cap拷贝了一份传进来
arr[0] = 1 //修改底层数据里的首元素
arr = append(arr, 1) //arr的len和cap发生了变化,不会影响实参
}
func main() {
arr := []int{8}
slice_arg_1(arr)
fmt.Println(arr[0]) //1
fmt.Println(len(arr)) //1
}
关于函数返回值
- 可以返回0个或多个参数。
- 可以在func行直接声明要返回的变量。
- return后面的语句不会执行。
- 无返回参数时return可以不写。
func returnf(a, b int) (c int) { //返回变量c已经声明好了
a = a + b
c = a //直接使用c
return //由于函数要求有返回值,即使给c赋过值了,也需
接口是一组行为规范的集合。
type Transporter interface { //定义接口。通常接口名以er结尾
//接口里面只定义方法,不定义变量
move(src string, dest string) (int, error) //方法名 (参数列表) 返回值列表
whistle(int) int //参数列表和返回值列表里的变量名可以省略
}
只要结构体拥有接口里声明的所有方法,就称该结构体“实现了接口”。一个struct可以同时实现多个接口。
type Car struct { //定义结构体时无需要显式声明它要实现什么接口
price int
}
func (car Car) move(src string, dest string) (int, error) {
return car.price, nil
}
func (car Car) whistle(n int) int {
return n
}
接口值有两部分组成, 一个指向该接口的具体类型的指针和另外一个指向该具体类型真实数据的指针。
car := Car{"宝马", 100}
var transporter Transporter
transporter = car
接口的使用
func transport(src, dest string, transporter Transporter) error {
_,err := transporter.move(src, dest)
return err
}
var car Car //Car实现了Transporter接口
var ship Shiper // Shiper实现了Transporter接口
transport("北京", "天津", car)
transport("北京", "天津", ship)
接口的赋值
func (car Car) whistle(n int) int {…}//方法接收者是值
func (ship *Shiper) whistle
基础数据类型
数据类型 | 长度(字节) | 默认值 | 说明 | 取值范围 |
---|---|---|---|---|
bool | 1 | false | 布尔值 | true 或 false |
byte | 1 | 0 | 8位无符号整数 | 0 到 255(和uint8一样) |
rune | 4 | 0 | Unicode 码点 | 0 到 0x10FFFF(rune是int32 的别名) |
int | 4 或 8 | 0 | 有符号整数 | -2147483648 到 2147483647 或 -9223372036854775808 到 9223372036854775807 |
uint | 4 或 8 | 0 | 无符号整数 | 0 到 4294967295 或 0 到 18446744073709551615 |
int8 | 1 | 0 | 有符号 8 位整数 | -128 到 127 |
uint8 | 1 | 0 | 无符号 8 位整数 | 0 到 255 |
int16 | 2 | 0 | 有符号 16 位整数 | -32768 到 32767 |
uint16 | 2 | 0 | 无符号 16 位整数 | 0 到 65535 |
int32 | 4 | 0 | 有符号 32 位整数 | -2147483648 到 2147483647(和rune一样) |
uint32 | 4 | 0 | 无符号 32 位整数 | 0 到 4294967295 |
int64 | 8 | 0 | 有符号 64 位整数 | -9223372036854775808 到 9223372036854775807 |
uint64 | 8 | 0 | 无符号 64 位整数 | 0 到 18446744073709551615 |
float32 | 4 | 0.0 | 32 位浮点数 | 大约 1.18e-38 到 3.4e38 |
float64 | 8 |
由于各位所使用的go版本不同,建议大家自行进行安装所需要的版本,安装步骤如下:
1.13.5:https://dl.google.com/go/go1.13.5.linux-amd64.tar.gz
1.13.1:https://dl.google.com/go/go1.13.1.linux-amd64.tar.gz
1.11.5:https://dl.google.com/go/go1.11.5.linux-amd64.tar.gz
在 ~ 下创建 golang 文件夹,并进入 golang 文件夹
mkdir ~/golang && cd ~/golang
下载的 go 压缩包
wget https://dl.google.com/go/go1.13.5.linux-amd64.tar.gz
执行tar解压到~/golang目录下(官方推荐),得到go文件夹等
tar -zxvf go1.13.5.linux-amd64.tar.gz
添加HOME/golang/go/bin目录到PATH变量中。添加到HOME/.bash_profile
vim ~/.bash_profile
# 在最后一行添加GO的环境变量
#GOROOT
GOROOT=$HOME/golang/go
export PATH=$GOROOT/bin:$PATH
#GOPATH 这个写不写都可以
#export GOPATH=$HOME/go
#export PATH=$PATH:$GOPATH/bin
# 保存退出后source一下(vim 的使用方法可以自己搜索一下)
source ~/.bash_profile
go version
相比PHP,Go语言的标准输出流的功能上丰富很多。