package

这点其实和Java有点区别的,Java支持在任何包名下psvm的。

但是Go不同,go的主函数的包名必须是main

变量声明

四种方式,三种支持全局变量的声明,一种不支持

支持全局变量的声明方式

  1. var a int //默认值为0
  2. var a int = 10
  3. var a = 10

这三种方式都支持全局变量的定义,感觉还是比较类似python的

不支持全局变量的声明方式

a := 100

这种方式就更加类似于python了,在赋初值的时候会自动判断类型

这种方法只支持在函数体内声明变量

和Java的区别

同时Go是一个很简洁的语言,如果一个变量声明了但是没有使用,这是会报错的。

提到报错这一点,其实go和java又是一个极端,go是不支持exception的,只有error

const常量

常量的特点是具有只读属性,不允许修改,和Java中的final以及cpp的const一致

所以可以用来定义枚举类型,配合iota来实现,第一行的iota的默认值为0

定义类似如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
const(
BEIJING = iota
SHANGHAI
SHENZHEN
)
//这样就会出现BEIJING=0,SHANGHAI=1,SHENZHEN=2
const(
BEIJING = 10*iota
SHANGHAI
SHENZHEN
)
//这样定义的话就会出现BEIJING=0,SHANGHAI=10,SHENZHEN=20
//iota的特性是按照行来累加的,后续如果没有定义值,就和上一行相同
//例如定义如下:
const(
a, b = iota+1, iota+2 //a=1,b=2
c, d //c=2,d=3
e, f //e=3,f=4
g, h = iota*2, iota*3 //g=6,h=9
i, k //i=8,k=12
)

多返回值

go感觉在这一点上和python很像,支持多返回值

返回值定义

首先go的返回值包括形参的定义如下:

1
2
3
func func1(a string, b bool) int{
return 0
}

但是如果我要定义多个返回值,那么可以用类似于python元组的形式定义返回值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
func func2(a int, b int)(int ,string){
return 0, "hello"
}
//当然也可以返回多个有形参名的返回值,这样返回也可以
//同时,r1和r2也是形参,默认值为0,在go里默认值都是0,字符串是""
func func3(a int, b int)(r1 int, r2 string){
r1 = 0
r2 = "hello"
return
}
//当然如果类型相同也可以这么返回
func func4(a int, b int)(r1, r2 int){
r1 = 0
r2 = 1
return
}

导包

导包一般会执行到init()函数才会继续执行,一般来说,init函数会早于main函数执行

同时,go有个比较有意思的点,就是对外放开的方法首字母要大写。