golang 初探

golang 语言由 google 开发的高级语言,对并发的支持可以很容易的实现高并发程序,可以方便的用于多核处理器和网络开发。golang 可以快速编译,同时支持垃圾回收功能,并且还支持运行时反射。
golang 具有高效,静态类型,但是又具有解释语言的动态类型特征的系统级语法。

ps. 之前那家区块链公司给我发 offer 后我还真的学过一段时间的 golang, 可谁知那家公司后来垮了/(ㄒoㄒ)/~~

golang 源代码组成

示例

1
2
3
4
5
6
7
package main

import "fmt"

func main() {
fmt.Printf("hello world")
}

一个 golang 源文件由至少三个部分组成

  • package 声明部分
  • import 导入部分
  • func 函数定义部分

另外可能还有全局变量声明。

所有初始化完成后,程序从 main 包的 main 函数开始执行。

基本语法

变量声明

使用 var 关键字声明一系列的变量,类型附在声明最后,如果跟有初始化列表,那么类型可以省略。

1
var i, j, k int

在函数内部可以使用 := 赋值语句代替 var 关键字,但是在函数体外,语句必须由关键字 var, func 开头,所以 := 不可以用。

函数声明

使用 func 声明函数,参数列表后可带返回值类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
func add(x int, y int) int {
return x + y
}

func add(x, y int) int {
return x + y
}

func swap(a, b string) (string, string) {
return b, a
}

func split(sum int) (x, y int) {
x = sum * 4 / 9
y = sum - x
return
}

以上几种方法只在参数列表和返回值列表不同,属于 golang 的语法糖。

for 语句

for 语句三种写法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
for i < 0; i < 1000; i++ {
sum := i
}

// while
for sum < 1000 {
sum += sum
}

// infinite loop
for {
sum += sum
if sum > 1000{
break
}
}

golang 中无 while, do 关键字。

switch case

1
2
3
4
switch i {
case 0:
case f():
}

于 C++, Java 不同在于,golang 的 switch 是只会执行选中的 case, 而不是跟在后面所有的 case, 另外,golang 的 case 中的可以不是字面量或者常量值,也可以是表达式,条件表达式或者函数调用。

以上代码当 i == 0 时,f() 不被调用。

f 当 i == 0 时不被调用。

defer 关键字

def 声明一个函数在当前的函数体返回时调用,无论是执行了 return 语句,还是执行到了函数体尾部,还是抛出了异常。

1
DeferStmt = "defer" Expression .

Expression 必须为函数或是函数调用。
defer 函数调用声明会被推入一个栈中,所以当声明多个 defer 语句时,执行顺序为其声明顺序的逆序。

语法与规范

与其他语言不同的是在于 golang 将一些编程规范包含到了语法中。

在 golang 中,任何一个代码块由 {} 环绕,并且第一个 { 强制不换行。
在一个包的符号中,当一个符号的首字母大写时,这个符号为导出符号。

类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
bool

string

int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 uintptr

byte // alias for uint8

rune // alias for int32
// repesents a Unicode code point

float32 float64

complex64 complex128

没有初始化但是类型已经确定的变量会被赋于 0 值。

对于数值类型为 0
对于 boolean 类型为 false
对于字符串类型为 “”

类型推导

当变量不带类型声明时,可从赋值语句的右值推导出类型。

常量

常量声明要在前面加 const 关键字