Golang行情

Golang的优势
极简部署方式
- 可直接编译成机器码
- 不依赖其他库
- 直接运行即可部署
静态类型语言
- 编译的时候检查出来隐藏的大多数问题
语言层面的并发
不通过外层包装,原生支持并发
充分利用多核
强大的标准库
- runtime系统调度机制(垃圾回收,资源平均分配)
- 高效GC垃圾回收
- 丰富的标准库
简单易学
- 25个关键字
- 内嵌C语法支持
- 面向对象(继承、多态、封装)
Golang的不足
- 大部分包管理在github上
- 无泛化
- 所有的Exception都用Error来处理
- 对C的降级,并非无缝。没有降级到asm那么完美
Golang第一个程序:letsgo
package main //含有main函数的包,包名不需要与项目名和文件名相同
import(
"fmt"
"time"
)
//import "fmt"
// import "time"
func main(){//左花括号不换行
//golang表达式,';'可加可不加,建议不加
fmt.Println("letsgo")
}
go run letsgo.go
go build letsgo.goletsgo
Golang四种变量声明方式与多变声明方式

func main(){
//方法一:声明一个变量,默认值是0
var v1 int
fmt.Println("v1 = ", v1)
fmt.Printf("type of v1 is %T\n", v1)
//方法二:声明一个变量,初始化一个值
var v2 int = 10
fmt.Println("v2 = ", v2)
fmt.Printf("type of v2 is %T\n", v2)
//方法三:在初始化的时候,省去数据类型,通过值自动匹配当前变量的数据类型
var v3 = "str"
fmt.Println("v3 = ",v3)
fmt.Printf("type of v3 = %T\n",v3)
//方式四:省去var关键字,直接自动匹配
//:=只能放在函数体内声明,不支持全局变量
v4:="str"
fmt.Println("v4 = ",v4)
fmt.Printf("type of v4 = %T\n",v4)
//声明多个变量
//多行的多变量声明
}
const与iota
iotaconst()
const con int = 10
const(
a, b = iota+1, iota+2
c, d
e, f
g, h = iota*10, iota*20
l, m
)
Golang函数多返回值三种写法
func test1(a string, b int)(string, int){
return a,b+1
}
func test2(a string, b int)(c string, d int){
c=a
d=b+1
return //或return c, d
}
func test3(a int, b int)(e, f int){
e=a
f=b
return
}
func main() {
fmt.Println(test1("san6", 6))
fmt.Println(test2("san6", 6))
fmt.Println(test3(5, 6))
}
import导包
函数和变量首字母大写时,表示是对外开放的
init()早于main()
Golang导入的包必须使用,否则会报错
init导包路径与init方法调用流程


// demo1/lib1/lib1.go go从ROOT和PATH下找包
package lib1
import "fmt"
func init(){
fmt.Println("lib1 init()...")
}
func Lib1func() {
fmt.Println("lib1func()...")
}
// demo1/letsgo.go
package main
import (
"fmt"
"demo1/lib1"
"demo1/lib2"
)
func main() {
fmt.Println("main()...")
lib1.Lib1func()
lib2.Lib2func()
}
import匿名及别名导包方式
import(
_"lib1" //匿名导包。无法使用包内方法,但是会调用包的init()方法
l1 "lib2" //给包起一个别名,l1.show()来直接调用
."lib3" //把包内方法全部导入本包中,包括非公开方法
)
Golang指针
package main
import "fmt"
func swap(a *int, b *int) {
*a = *a + *b
*b = *a - *b
*a = *a - *b
}
func main() {
var a, b = 3, 4
swap(&a, &b)
fmt.Println("a = ", a, " b = ", b)
}
defer语句调用顺序
- 方法执行周期结束时,执行defer语句
- 多个defer语句存在,以压栈形式执行
- return属于方法执行周期,先于defer执行
package main
import "fmt"
func deferfunc1() {
fmt.Println("deferfunc1() called")
}
func deferfunc2() {
fmt.Println("deferfunc2() called")
}
func returnfunc()int {
fmt.Println("returnfunc() called")
return 0
}
func defertest()int {
defer deferfunc1()
defer deferfunc2()
return returnfunc()
}
func main() {
defertest()
}