go学习笔记 - 语法

发布 : 2017-07-31 分类 : IT 浏览 :

特点

  • 语法简易
  • 自动格式化代码,保证所有人代码风格一致
  • 并发处理
  • 垃圾回收
  • 函数多返回值,返回错误

代码规范

  • 要有main包和main函数
  • 变量必须要使用,引入的包必须要使用
  • 表达式可以省略括号,不能省略花括号,左花括号必须在行尾
1
2
3
4
5
6
7
8
9
10
11
12
package main
import (
"fmt"
)
func main() {
a := 3
if a > 1 {
fmt.Printf("%T,%v", a, a)
}
}

引入多个包

1
2
3
4
5
6
package main
import (
"fmt"
"math"
)

不可以import未被使用的包

变量

1
2
3
var a int8 = 4
var a = 4
a := 8 //:=只能用在函数内

byte: unit8

rune: int32

自增

不能前置,不能用作表达式

1
2
3
a++; //right
++a; //wrong
if (a++) { //wrong

数组及遍历

1
2
3
4
5
6
7
8
package main
func main() {
a := [3]int{1, 2, 3}
for i, s := range a {
println(i, s)
}
}

指针

指针不能运算

1
2
3
4
5
6
7
package main
func main() {
a := 3
var p *int = &a
print(*p)
}

switch

对比下php和go的swithc语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
$a = 1
switch ($a) {
case 1:
case 2:
echo 1;
break;
case 3:
echo 3;
break;
default:
echo 'default';
break;
}

输出为1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package main
func main() {
a := 1
switch a {
case 1:
case 2:
println(1)
break
case 3:
println(3)
default:
break
}
}

输出为空

go会自动在语句为空的case后面补上break,相当于没有执行任何操作

要实现php中的多个case执行相同的语句,应该使用下面的写法:

1
2
3
case 1,2:
println(1)
break

for

初始语句和结束语句可以省略

1
2
3
for sum < 1000 {
sum += sum
}

函数

需指定入参和出参的类型,可以返回多个值

1
2
3
4
//x后面的int可省略,根据王垠的博客说的最好保留
func add(x int, y int) int {
return x + y
}

defer

1
2
3
4
5
6
7
8
9
package main
import "fmt"
func main() {
defer fmt.Println("world")
fmt.Println("hello")
}

输出结果:

hello

world

struct

用点号.访问结构体中的字段

1
2
3
4
type Vertex struct {
X int
Y int
}

slice

1
2
3
4
5
6
7
8
9
10
s := []int{2, 3, 5, 7, 11, 13}
//slice长度
len(s)
//slice转string,第二个参数是分隔符
strings.Join(s,'_')
//打印slice
fmt.Printf("%v", s)

map

函数

函数可以作为函数的入参

闭包

Go 函数可以是一个闭包。闭包是一个函数值,它引用了函数体之外的变量。 这个函数可以对这个引用的变量进行访问和赋值;换句话说这个函数被“绑定”在这个变量上。

并发

goroutine
channel

1
2
ch <- v // 将 v 送入 channel ch
v := <-ch // 从 ch 接收,并且赋值给 v

错误处理

gc

参考

本文作者 : 小凡
原文链接 : https://16bh.github.io/2017/07/31/go-study-note-grammar/
版权声明 : 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
留下足迹