bool
、string
(u)int
、(u)int8
、(u)int16
、(u)int32
、(u)int64
、uintptr
byte
、rune
float32
、float64
、complex64
、complex128
uintptr
是指针类型,rune
是字符类型(4字节,也就是解决了其他语言char
的编码问题),complex
复数类型(很神奇,其他语言没有)。
在go
语言中,我们使用复数的话,可以和数学中一样
a := 1 + 1i
这点和python
有一点区别,python
中使用j
表示虚数。
go
语言中的强制类型转换类似于c
语言,使用type()
即可。
通过var
关键字声明变量
var variable type
和其他语言不同的是,go
语言的变量类型是放在变量名之后的(为什么这样设计呢?)。并且go
语言声明一个变量后会自动赋初值(这是一个不错的性质)。我们也可以自己赋初值,如下
var a int = 3
定义多个变量
var a, b int = 3, 4
同样作为一个新语言,go
支持类型推导(类似于cpp
的auto
)
var a, b = 3, "hello"
也可以这样写
var (
a = 3
b = "hello"
)
我们也可以将var
省略,不过我们需要通过:=
替代=
(这种写法和python
非常类似)
a, b := 3, "hello"
上述写法有一个限制必须在{}中使用。也就是对于包内的全局变量我们必须使用var
定义。
常量的定义和cpp
类似,使用const
const a = 3
const
数值可作为各种类型使用,也就是对于一些操作我们不需要强转。例如
var c int = int(math.sqrt(a * a))
而如果a
不是const
的话,我们就需要这样写
var c int = int(math.sqrt(float64(a * a)))
我们可以使用const
定义枚举类型
const (
cpp = 0
java = 1
python = 2
)
我们可以使用iota
简化上面的操作,iota
是go
语言的常量计数器,会给被赋值给iota
的变量赋初值0
,后面的变量赋初值+1
(类似于cpp
中的enum
)
const (
cpp = iota // 0
java // 1
python // 2
_
)
其中_
表示跳过,这点和python
很像。
go
的条件语句和python
类似,不用在if
后添加括号
if condition {
} else {
}
go
语言中的if
还支持其他语言中的for
类似功能
if a, b := 3, 3 ; a != b {
}
但是这里有一点要注意,我们不能像其他语言那样去声明一个变量(只能赋值)
if var a, b = 3, 3 ; a != b { // syntax error: var declaration not
// allowed in if initializer
}
go
语言中的switch
语法和其他语言不同,我们不需要写break
(会自动添加)
switch var0 {
case val1:
...
case val2:
...
default:
...
}
如果不想break
的话,我们只需在break
的位置添加fallthrough
即可。
switch
后面也可以不添加表达式
switch {
case val1 == var0:
...
case val2 == var0:
...
default:
...
}
写法上和其他语言类似,唯一的区别是不用写括号
for init; condition; post { }
init
、condition
、post
都是可以省略的。
在go
语言中没有while
关键字,但是我们可以使用for
实现类似功能
for condition { }
也就是我们省略了init
和post
。
在go
语言中我们也有for range
的写法
for key, value := range oldMap {
newMap[key] = value
}
定义函数需要使用func
关键字和python
中的def
类似。函数的定义与变量的定义类似,我们都是和其他语言反过来。
func function_name( [parameter list] ) [return_types] {
}
函数名在前面,返回类型在后面。
我们也可以返回多个值
func swap(x, y string) (string, string) {
return y, x
}
如果其中一个返回值我们不想要的话,可以使用_
替代(和python
类似)
a, _ := swap(a, b)
复合函数的定义也非常简单
func apply(op func(int, int) int, a, b int) int {
return op(a, b)
}
我们在上面定义了一个函数类型参数op
。上面这种东西和python
里面的装饰器
很类似。上面函数的传入操作,我们可以使用匿名函数(go
语言中没有lambda
表达式)
func ( [parameter list] ) [return_types] {
}
也就是省略函数名。
go
语言中支持可变参数列表
func sum(numbers ...int) int {
s := 0
for _, val := range numbers {
s += val
}
return s
}
指针的定义
var var_name *var-type
在go
语言中指针不能做计算,也就是不能++
、--
,我们仅仅访问指针所指向的内容*var_name
。
在go
语言中空指针使用nil
表示。
说道指针,那我们不得不谈引用,在go
中参数通过值传递或者指针传递(没有引用,这是c
语言的特性)。