特色
- 简洁
- 快速
- 安全
- 并行
- 有趣
- 开源
- 内存管理
- 数组安全
- 编译迅速
用途
- 搭载Web服务器
- 搭载存储集群或类似用途的巨型中央服务器的系统
- 对于高性能分布式系统领域,Go比大多数其他语言有更高的开发效率
- 它提供海量并行的支持,对于游戏服务端的开发非常有优势
程序
1 2 3 4 5 6 |
package main import "fmt" func main() { fmt.Println("hello world") } |
定义包
- 必须在源文件中非注释的第一行指明这个文件属于哪个包
- package main表示一个可独立执行的程序
- 每个go应用程序都包含一个名为main的包
引入包
- import fmt告诉go编译器需要使用到fmt包里面的东西
main&&init
- main函数一般是启动后第一个执行的函数
- 如果有init函数,init函数会先于main执行
注释
- 单行注释 //
- 多行注释(注释块) /* */
标识符
- 第一个字符必须是字母或者下划线
- 标识符由一个或是多个字母、数字、下划线组成
- 不正确的情况
- 以数字开头
- 使用go的关键字
- 掺杂了运算符
关键字
- 25个 关键字|保留字
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 |
- 36个预定义标识符
append | bool | true | false | byte |
cap | close | complex | complex64 | complex128 |
int | int8 | int16 | int32 | int64 |
uint | uint8 | uint16 | uint32 | uint64 |
float32 | float64 | copy | imag | iota |
len | make | new | nil | panic |
println | real | recover | string | |
uintptr |
iota
- 特殊常量
- 一个可以被编译器修改的常量
- 在每一个const关键字出现时,被重置为0,然后在下一个const出现之前,每出现一次iota,其所代表的数字会自动增加1
- 用作枚举
1 2 3 4 5 |
const ( a = iota b = iota c = iota ) |
Map
- 一种无序的键值对的集合
- 通过key来快速检索数据
- key类似于索引,指向数据的值
- map是一种集合,所以我们可以像迭代数据和切片那样迭代它
- 由于map是用hash表实现的,所以它是无序的,我们无法决定它的返回顺序
- 定义map
1 2 3 4 5 |
//申明变量,默认map是nil var map_variable map[key_data_type]value_data_type //使用make函数 map_variable = make(map[key_data_type]value_data_type) |
如果不初始化,那么创建的就是一个nil map,nil map不能用来存放键值对
- 示例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
package main import "fmt" func main(){ var countryCapital map[string]string countryCapital = make(map[string]string) countryCapital["China"] = "Beijing" countryCapital["France"] = "paris" //输出map for country := range countryCapital { fmt.Println("Capital of",country,"is",countryCapital[country]) } //查看元素在集合中是否存在 capital,ok := countryCapital["United states"] if(ok){ fmt.Println("capital of United States is",capital) }else { fmt.Println("capital of United States is not present") } } |
- delete()函数
删除集合的元素
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
package main import "fmt" func main(){ countryCapital := map[string]string {"France":"Paris","Italy":"Rome","China":"Beijing"} //打印map for country := range countryCapital { fmt.Println("capital of",country,"is",countryCapital[country]) } //删除元素 delete(countryCapital,"France") //再打印map,观察变化 for country := range countryCapital{ fmt("capital of",country,"is",countryCapital[country]) } } |
范围for
- 用于
- for循环迭代数组、切片、链表或集合的元素
- 在数组和切片中返回元素的索引值
- 在集合中返回key-value对的key值
- 示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
package main import "fmt" func main(){ nums := []int{2,3,4} sum := 0 //不需要使用元素的序号,所以用“空白符”_省略了 for _,num := range nums{ sum += num } fmt.Println("sum:",sum) //需要用到索引, for i,num := range nums{ if num == 3{ fmt.Println("index:",i) } } //map用在键值树上 kvs := map[string]string{"a":"apple","b":"banana"} for k,v := range kvs{ fmt.Println("%s->%s\n",k,v) } //用来枚举Unicode字符串 for i,c := range "go"{ fmt.Println(i,c) } } |
变量
- 声明变量
- 第一种
12var v_name v_typev_name = value - 第二种
1var v_name = value - 第三种
1v_name := value
- 第一种
- 多变量声明
- 第一种
1vname1,vname2,vname3 = v1,v2,v3 - 第二种
1var vname1,vname2,vname3 = v1,v2,v3
- 第一种
- :=赋值操作符
- 可自动推断类型
变量作用域
- 局部变量
- 全局变量
- 形式参数
- 关于初始化
int | 0 |
float32 | 0 |
pointer | nil |
常量
- 定义
- 显示类型定义
1const a string = "abc" - 隐式类型定义
1const b = "abc"
- 显示类型定义
- 枚举
12345const (unknow = 0female = 1male = 2)
函数
- 格式
1234func function_name([parameter list]) [return_types]{//dosomething} - 解析
- 函数由func开始声明
- 函数可以返回多个值
- 参数
- 值传递
- 引用传递
- 用法
- 作为值进行传递
- 闭包
- 匿名函数,可在动态编程中使用
- 方法
- 包含了接受者得函数
递归函数
斐波那契数列
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
package main import "fmt" func fibonaci(n int){ if n < 2{ return n } else{ return fibonaci(n-2)+fibonaci(n-1) } } func main(){ var i int for i=0;i<10;i++{ fmt.Println("%d\t",fibonaci(i)) } } |
错误处理
- go语言通过内置的错误接口提供了错误处理机制
- error类型的定义
1 2 3 |
type error interface{ Error() string } |
我们可以在编码中通过实现error接口类型来生成错误信息
示例:
1 2 3 4 5 6 |
func sqrt(f float64)(float64,error){ if f < 0{ return 0,error.New("math:square root of negative number") } //实现 } |
- 示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
package main import "fmt" type DivideError struct{ dividee int divider int } func (de * DivideError) Error() string{ strFormat := ` cannot proceed,the divider is zero. dividee:%d divider:0 ` return fmt.Sprintf(strFormat,de.dividee) } func Divide(varDividee int,varDivider int)(result int,errorMsg string){ if varDivider == 0{ dData := DivideError{ dividee: varDividee, divider: varDivider, } errorMsg = dData.Error() return }else { return varDividee/varDivider,"" } } func main(){ if result,errorMsg := Divide(100,10);errorMsg == ""{ fmt.Println("100/10 = ",result) } if _,errorMsg := Divide(100,0);errorMsg != ""{ fmt.Println("errorMsg is:",errorMsg) } } |
本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ Reading 2020 《鲁迅杂文精选》12/02
- ♥ 链表相关09/12
- ♥ 2020_05_11_0105/14
- ♥ C++_运算符优先级&&相关性12/15
- ♥ 贪心算法06/29
- ♥ 表_约束-主键10/26