为了解决在21世纪多核和网络化环境下越来越复杂的编程问题而发明了Go语言,编程语言的演化就像生物物种的演化一样,一个成功的编程语言的后代都会继承他们祖先的优点,当然有时多种语言杂合也会产生令人惊讶的特性,还有一些激进的新特性可能并没有先例,我们可以通过观察编程语言和软硬件环境是如何相互促进,相互影响的演化过程而学到很多.
Go语言有时候被描述成”C类似语言”或者”21世纪的C语言”.Go从C语言继承了相似的表达语法,流程控制,基础数据类型,调用参数传值,指针等很多思想,还有C语言一直所看重的编译后机器码的运行效率以及和现有操作系统的无缝适配.
开始一个 Hello World
文件名后缀 hello.go
1 | package main //声明本文件的package名 |
运行
有两种方式可以运行
- 解释执行(将源码编译成a.out再执行)
1 | $go run hello.go |
- 编译执行
1 | $go build hello.go |
自己的package
可以使用GOPATH环境变量,或是使用相对路径来import你自己的package。
Go的规约是这样的:
1)在import中,你可以使用相对路径,如 ./或 ../ 来引用你的package
2)如果没有使用相对路径,那么,go会去找$GOPATH/src/目录。
使用相对路径:
1 | import` `"./haoel"` `//import当前目录里haoel子目录里的所有的go文件 |
使用GOPATH路径
1 | `import` `"./haoel"` `//import当前目录里haoel子目录里的所有的go文件` |
fmt输出格式
fmt包和libc里的那堆使用printf, scanf,fprintf,fscanf 很相似。下面的东西对于C程序员不会陌生。
注意:println不支持,printf才支持%式的输出:
1 | package main |
也可以使用如\n\t\r这样的和C语言一样的控制字符
变量和常量
变量的声明很像 javascript,使用 var关键字。注意:go是静态类型的语言,下面是代码:
1 | //声明初始化一个变量 |
还有一种定义变量的方式
1 | x := 100 //等价于 var x int = 100; |
常量很简单,使用const关键字:
1 | const s string = "hello world" |
数组
直接看代码
1 | func main() { |
运行结果:
1 | array a: [0 0 0 0 0] |
数组的切片操作
这个就和python类似了
1 | a := [5]int{1, 2, 3, 4, 5} |
分支循环语句
if语句
注意:if 语句没有圆括号,而必需要有花括号
1 | //if 语句 |
switch 语句
注意:switch语句没有break,还可以使用逗号case多个值
1 | switch i { |
for 语句
前面你已见过了,下面再来看看for的三种形式:(注意:Go语言中没有while)
1 | //经典的for语句 init; condition; post |
关于分号
从上面的代码我们可以看到代码里没有分号。其实,和C一样,Go的正式的语法使用分号来终止语句。和C不同的是,这些分号由词法分析器在扫描源代码过程中使用简单的规则自动插入分号,因此输入源代码多数时候就不需要分号了。
规则是这样的:如果在一个新行前方的最后一个标记是一个标识符(包括像int
和float64
这样的单词)、一个基本的如数值这样的文字、或以下标记中的一个时,会自动插入分号:
1 | break continue fallthrough return ++ -- ) } |
通常Go程序仅在for
循环语句中使用分号,以此来分开初始化器、条件和增量单元。如果你在一行中写多个语句,也需要用分号分开。
注意:无论任何时候,你都不应该将一个控制结构((if、for、switch或select)的左大括号放在下一行。如果这样做,将会在大括号的前方插入一个分号,这可能导致出现不想要的结果。
map
map在别的语言里可能叫哈希表或叫dict,下面是和map的相关操作的代码,代码很容易懂
1 | func main(){ |
指针
Go语言一样有指针,看代码
1 | var i int = 1 |
Go具有两个分配内存的机制,分别是内建的函数new和make。他们所做的事不同,所应用到的类型也不同,这可能引起混淆,但规则却很简单。
参考自:
GO 语言简介(上)— 语法