Golang的优势
-
极简单的部署方式
- 可直接编译成机器码
- 不依赖其他库
- 直接运行即可部署
-
静态类型语言
- 编译的时候检查出来隐藏的大多数问题
-
语言层面的并发
- 天生的基因支持
- 充分的利用多核
-
强大的标准库
- runtime系统调度优势
- 高效的垃圾回收
- 丰富的标准库
-
简单易学
- 25个关键字
- 内嵌c语言支持,简洁
- 面向对象特征
- 跨平台
-
大厂领军:Google、facebook、腾讯、百度、京东、字节、七牛云等
Golang的应用
(1)云计算基础设施领域
代表项目:docker、kubernetes、etcd、consul、cloudflare CDN、七牛云存储等。
(2)基础后端软件
代表项目:tidb、influxdb、cockroachdb等。
(3)微服务
代表项目:go-kit、micro、monzo bank的typhon、bilibili等。
(4)互联网基础设施
代表项目:以太坊、hyperledger等
go语法
初见
package main //定义包名。你必须在源文件中非注释的第一行指明这个文件属于哪个包.package main表示一个可独立执行的程序,每个 Go 应用程序都包含一个名为 main 的包。
/*
import "fmt" //告诉 Go 编译器这个程序需要使用 fmt 包(的函数,或其他元素),fmt 包实现了格式化 IO(输入/输出)的函数。
import "time"
*/
import (
"fmt"
"time"
)
func main(){ //左花括号必须与函数名在同一行!!
fmt.Println("Hello Go!")
//表达式加不加分号;都可以,建议不加
time.Sleep(1*time.Second)
}
变量
关键字:var
- 声明单个变量
1、声明后不赋值,使用默认值0
var a int
2、声明给定初始化值
var b int =100
3、在初始化时,省去数据类型,通过值自动匹配当前的数据类型
var c = 100
4、(常用)省去var关键字,直接自动匹配 := (只能用在函数体内)
c := 100
注意:声明全局变量时,可以用方法1/2/3,但是不能用方法4
- 声明多个变量
var xx,yy int =100,200 xx=100 yy=200
var kk,ll = 100, "abcd" kk=100 ll="abcd"
var ( //多行的多变量声明
vv int=100
jj bool=true
)
常量
关键字:const
const length int = 10
枚举:
const (
/*
BEIJING = 0
SHANGHAI = 1
SHENZHNE = 2
*/
//可以在const()中添加关键字 iota ,这样每行的iota都会加1,第一行是0
BEIJING = iota //0
SHANGHAI //1
SHENZHNE //2
)
函数
//1、只有一个返回值
func 函数名(参数1名 参数1类型,参数2名 参数2类型) 返回值类型{
return 返回值
}
//2、多返回值
func 函数名(参数1名 参数1类型,参数2名 参数2类型) (返回值1类型,返回值2类型){
return 返回值1,返回值2
}
//3、多返回值,返回值有形参名称
func 函数名(参数1名 参数1类型,参数2名 参数2类型) (返回值1 返回值1类型,返回值2 返回值2类型){
return
}
//4、多返回值,且类型相同
func 函数名(参数1名 参数1类型,参数2名 参数2类型) (返回值1 ,返回值2 类型){
return
}
init函数
import导包
import _ "fmt"给fmt包起一个别名(匿名),无法使用此包的方法,但是会执行包内部的init()方法import aa "fmt"给fmt起一个别名aa,可以通过aa.Println()调用包内部的方法import ."fmt"将fmt包中的全部方法,导入到当前本包的作用域中,就可以直接使用API来调用fmt包中的方法,不需要用fmt.方法
指针
*p 取值
&a 取地址
引用传递(指针):在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。
/* 定义交换值函数*/
func swap(x *int, y *int) {
var temp int
temp = *x /* 保持 x 地址上的值 */
*x = *y /* 将 y 值赋给 x */
*y = temp /* 将 temp 值赋给 y */
}
值传递:在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
func swap(x, y int) {
var temp int
temp = x /* 保存 x 的值 */
x = y /* 将 y 值赋给 x */
y = temp /* 将 temp 值赋给 y*/
}
defer
1、预定对函数的调用,延迟函数。当执行完“}”之后才开始执行
2、如果一个函数中有多个defer语句,它们会以LIFO(后进先出)的顺序执行。
3、defer 和return 谁先执行? return后的语句先执行,defer后的语句后执行。