Go是一门编译型语言,Go语言的工具链将源代码及其依赖转换成计算机的机器指令2。Go语 言提供的工具都通过一个单独的命令 go 调用, go 命令有一系列子命令。最简单的一个子命 令就是run。这个命令编译一个或多个以.go结尾的源文件,链接库文件,并运行最终生成的可 执行文件。
1 hello world:
package main
import "fmt"
func main() {
fmt.Println("Hello, 世界")
}
2结构体
结构体是一种聚合的数据类型,是由零个或多个任意类型的值聚合成的实体。每个值称为结 构体的成员。用结构体的经典案例处理公司的员工信息,每个员工信息包含一个唯一的员工 编号、员工的名字、家庭住址、出生日期、工作岗位、薪资、上级领导等等。所有的这些信 息都需要绑定到一个实体中,可以作为一个整体单元被复制,作为函数的参数或返回值,或 者是被存储到数组中,等等。下面两个语句声明了一个叫Employee的命名的结构体类型,并且声明了一个Employee类型的 变量dilbert:
type Employee struct {
ID int
Name string
Address string
DoB time.Time
Position string
Salary int
ManagerID int
}
var dilbert Employee
这是回顾的一部分结构体,虽然看起来有些c语言的味道,但是C语言是直接影响Go语言设计的语言之一也是不可否认的
基础数据类型 虽然从底层而言,所有的数据都是由比特组成,但计算机一般操作的是固定大小的数,如整 数、浮点数、比特数组、内存地址等。进一步将这些数组织在一起,就可表达更多的对象, 例如数据包、像素点、诗歌,甚至其他任何对象。Go语言提供了丰富的数据组织形式,这依 赖于Go语言内置的数据类型。这些内置的数据类型,兼顾了硬件的特性和表达复杂数据结构 的便捷性。
整型 Go语言的数值类型包括几种不同大小的整形数、浮点数和复数。每种数值类型都决定了对应 的大小范围和是否支持正负符号。让我们先从整形数类型开始介绍。 Go语言同时提供了有符号和无符号类型的整数运算。这里有int8、int16、int32和int64四种截 然不同大小的有符号整形数类型,分别对应8、16、32、64bit大小的有符号整形数,与此对 应的是uint8、uint16、uint32和uint64四种无符号整形数类型。 这里还有两种一般对应特定CPU平台机器字大小的有符号和无符号整数int和uint;其中int是应 用最广泛的数值类型。这两种类型都有同样的大小,32或64bit,但是我们不能对此做任何的 假设;因为不同的编译器即使在相同的硬件平台上可能产生不同的大小。 Unicode字符rune类型是和int32等价的类型,通常用于表示一个Unicode码点。这两个名称可 以互换使用。同样byte也是uint8类型的等价类型,byte类型一般用于强调数值是一个原始的 数据而不是一个小的整数。 最后,还有一种无符号的整数类型uintptr,没有指定具体的bit大小但是足以容纳指针。uintptr 类型只有在底层编程是才需要,特别是Go语言和C语言函数库或操作系统接口相交互的地方。 下面是Go语言中关于算术运算、逻辑运算和比较运算的二元运算符,它们按照先级递减的顺 序的排列: '*' / % << >> & &^ + - | ^ == != < <= > >= ||
二元运算符有五种优先级。在同一个优先级,使用左优先结合规则,但是使用括号可以明确 优先顺序,使用括号也可以用于提升优先级,例如 mask & (1 << 28) 。 如果一个算术运算的结果,不管是有符号或者是无符号的,如果需要更多的bit位才能正确表 示的话,就说明计算结果是溢出了。超出的高位的bit位部分将被丢弃。如果原始的数值是有 符号类型,而且最左边的bit为是1的话,那么最终结果可能是负的,