Go的数据类型及相关运算与大多数语言类似。拥有其它编程语言基础的读者,如:JavaScript,Java,C++等上手Go并不会很难,也不需要花大量的时间浪费在编程语言的共性上。
Go语言中声明变量的一般形式是使用var
关键字:
var identifier type
需要注意的是,Go和许多编程语言不同,它在声明变量时将变量的类型放在变量的名称之后。其原因如下:
int *a,b;
。在这个例子中,只有a
是指针,而b
不是。如果需要让这两个变量都是指针,则需要将其分开来写。而在Go中,则可以很轻松地将它们都声明成指针类型var a,b *int
var name string
var age int
var sex bool
上述代码也可以合并起来:
var (
name string
age int
sex bool
)
这种合并写法一般用于全局变量的声明。但无论全局还是局部,当一个变量被声明之后,该变量都会赋予对应类型的
零值
。
对于Go来说,它的编译器可以直接根据变量的值来判断该变量的数据类型,例如:
package main
import fm "fmt"
func main() {
var (
name = "Bob"
age = 19
sex = false
)
fm.Println(name) // Bob
fm.Println(age) // 19
fm.Print(sex) // false
}
然而,Go的编译器有时候推断出来的类型并不是我们想要的类型,为了确保能够推断出我们想要的类型,还是需要显示声明数据类型:
var name string = "Bob"
案例
package main
import (
"fmt"
"reflect"
)
func main() {
var weight = 55
fmt.Println(weight)
fmt.Println(reflect.TypeOf(weight)) // int
var height float32 = 175
fmt.Println(height)
fmt.Println(reflect.TypeOf(height)) // float32
}
当你仅仅需要在函数内部声明变量时,可以使用:=
语法:
name := "Bob"
如果想要一次性声明不同种数据类型的变量:
var name string
var age int
var sex bool
name, age, sex = "Bob", 18, false
若不声明,则应该使用:=
来对多个变量赋予不同类型的值
name, age, sex := "Bob", 18, false
对于交换a
和b
两个数的值,我们也可以直接使用下述语法:
a, b = b, a
需要注意的是,Go中有一个特殊变量_
。该变量是一个只写写量,也就意味着你只能写,不能读。这样做是因为 Go
语言中你必须使用所有被声明的变量,但有时你并不需要使用从一个函数得到的所有返回值。因此,你可以使用这个只写变量_
来抛弃一些不用的值。
变量除了可以在全局声明中初始化,也可以在 init()
函数中初始化。这是一类非常特殊的函数,它不能够被人为调用,而是在每个包完成初始化后自动执行,并且执行优先级比 main()
函数高。执行下述程序:
package main
import "fmt"
func init() {
fmt.Println("init.....")
}
func main() {
fmt.Println("main.....")
}
每个源文件可以包含多个 init()
函数,同一个源文件中的 init()
函数会按照从上到下的顺序执行,如果一个包有多个源文件包含 init()
函数的话,则官方鼓励但不保证以文件名的顺序调用。初始化总是以单线程并且按照包的依赖关系顺序执行。
Go的数据类型与其它语言,尤其是JavaScript的数据类型相似,这里不一一举例。后续会在更多的代码示例中看到。
Go的数据类型有:字符串、数组、结构体、指针、接口等。
和大多数语言一样,Go的算术运算包括:+
、-
、*
、/
、%
。
a := 45
b := 15
c := a + b
c := a - b
c := a * b
c := a / b
c := a % b
Go的逻辑运算和大多数语言一样,包括:==
,!=
,<
,>
,>=
,<=
,&&
,||
等
a := 10
b := 15
c := 10
a == b //false
b != c // true
a == b && b != c // false
a == c && a != b // true
位运算只能用于整数类型的变量,且需当它们拥有等长位模式时。Go的位运算包括:&
,|
,^
,&^
,<<
,>>