[Journey with golang] 1. Basic knowledge

这一章介绍golang的一些基础知识。golang写起来跟c++很不一样,在我看来,它更像是c++/java/python的混合体,再经过一系列增删之后的东西。

golang最大的特点就是简洁,仅有25个关键字;它虽然是一门静态语言,但支持运行时动态类型;它不仅是强类型语言,还支持隐式类型推导。golang不支持泛型,但支持反射。golang自带gc,并原生支持协程。

package main

import "fmt"

func main() {
    fmt.Println("Hello, world!")
}

第一行定义了一个名为main的package,它是可执行程序的包名。所有go代码头部必须有一个包声明语句,go通过包来管理命名空间。

第三行import引用一个外部包fmt,这是标准IO包。可以通过import来引用标准库、第三方甚至是自定义的包。

其他行的含义都十分显然。

go源代码特点非常明显:以.go为后缀;默认UTF8编码;忽略分号;函数以func开头,且与{同行;main函数所在的包包名必须为main。

go的基本数据类型与c++相比稍有变化,值得注意的是字符不是char,而是rune。

bool不能与int相互转换。

不同类型的int必须进行强制类型转换。

浮点数字面量被自动推断为float64.

字符串与java的string一样,都是常量。但可以通过切片来操作。尾部不包含空字符。对字符串的切片操作返回的子串依然是string而不是slice。

go支持指针。结构体指针访问结构体字段时依然用.而不是->。golang没有->这一操作符。

golang为切片维护三个元素:指向底层数组的指针、切片元素数量和底层数组容量。可以通过数组和内置函数make来创建slice。

map可以通过字面量创建,也可以通过make函数创建。golang内置的map并不是并发安全的,可以通过使用标准包sync里的map来解决。map value的某个元素不能被单独修改,只能通过把value整体替换来解决。

struct中的类型可以为任意类型;struct的存储空间是连续的,其字段按照声明时的顺序存放,字段之间有对齐要求。

golang代码的顺序并不一定是编译后最终可执行程序的指令顺序。

golang只有for循环。

其他内容比较基础,不再赘述。

相关推荐