基础语法
package golang通过package来组织, package main , main.main()是入口函数
var 定义变量方式(像某些脚本语言),类型在变量的后面:var x int,
自动推导 := 可以不写类型,但无法用于函数体外部
const const PI = 3.1415926 //类型于java的final
slice 切片
go动态数组,数组要指定长度,切片不用
var xslice []int , y := x[1:3] 前闭后开
可以通过一个数组来切,或一个已经存在的切片来再次声明
xslice := make([]int,10,20) 长度和容量,通过append函数可以扩容
map
s := make(map[string]int)
流程控制
if else if可以不写括号
for 和java的类似,代替while
switch 默认可以不写break, 使用fallthrough可以后面的继续
range 用于遍历容器中的元素(切片或map)
for i,v := range x {
fmt.Println(i,v) //i 下标,v 元素
}
函数
func foo(p1 type1,p2 type2) (out1 type1,out2 type2) {
//out可以省去
return v1,v2
}
//传值与传指针 0xfcdfe->1, *的作用相当于(0xfcdfe)=1
func add(xa *int) *int {
*xa = *xa + 1
return xa
}
a := 1
add(&a)
fmt.Println("%d",a)
defer 在函数体执行完后,延迟调用,用于最后做的操作,类似于java的finally, 像个栈,后进先出
闭包 匿名函数加()执行,闭包函数的特点是内部变量可以不受外部影响,可能造成内存泄露
panic
panic("xxxx") //抛出异常, 终止流程,但会执行之前定义的defer
recover
捕获panic异常,必须定义在panic之前的defer语句中,仍然执行协程
defer func() {
if r := recover(); r != nil {
fmt.Printf("捕获到的错误:%s\n", r) //r 就是 panic中的内容
}
}()
struct 结构体
匿名字段
type Person struct {
name string
age int
}
type Student struct {
Person
id string
}
s1 := Student{Person{"tom",25},"9527"}
golang的可见性 大写字母开头就是public
类方法声明 , 类型和方法必须在同一个包里定义,
要改变类变量的值,需绑定指针类型
func (rev *revType) getName (a,b int) bool{
return a < b
}
类初始化
p := new(Point)
p := &Point{}
p := &Point{x:100,y:100}
p := Point{}
Go接口
如果类实现了接口要求的函数,就可以说实现了该接口
type Aaa interface {
A()
}
type Bbb struct {
}
func (b Bbb) A() {
.....
}
var aaa Aaa
bbb := new(Bbb)
aaa = bbb
bbb.A ()
实现方法
接口 = 实现类