命名
函数外部定义的包级名字,如果首字母大写,则可以被其它包访问。
var
:变量
const
:常量
type
:类型
func
:函数
变量
变量声明
var 变量名 变量类型 = 初始值
其中变量类型
和初始值
可以省略其一。
如果省略变量类型
,那么会根据初始值
自动推倒变量类型
;如果省略初始值
,那么会进行默认初始化为对应变量类型
的零值
。
短变量声明
a, b := "hi", true
简短变量声明左边的变量至少有一个是新的变量,否则需要使用多重赋值。
比较下面两份代码:
var cwd string
func init() {
cwd, err := os.Getwd() // 这里声明了新的cwd变量,并没有对全局的cwd赋值
if err != nil {
log.Fatalf("os.Geted failed: %v", err)
}
log.Printf("Working directory = %s", cwd)
}
var cwd string
func init() {
var err error
cwd, err = os.Getwd()
if err != nil {
log.Fatalf("os.Geted failed: %v", err)
}
log.Printf("Working directory = %s", cwd)
}
数据类型
Go语言将数据类型分为4类:
- 基础类型:数字、字符串、布尔型
- 复合类型:数组、结构体
- 引用类型:指针、切片、字典、函数、通道
- 接口类型:
基础类型
Unicode字符rune
类型与int32
类型等价
byte
与uint8
等价
字符串不可变。
rune
与string
的转换:
s := "hello"
s2r := []rune(s)
r2s := string(s2r)
byte
与string
的转换:
s := "world"
s2b := []byte(s)
b2s := string(s2b)
- strings 包提供了许多如字符串的查询、替换、比较、截断、拆分和合并等功能。
- bytes 包也提供了许多类似功能的函数,但是针对和字符个有着相同结构的[]byte 类型。
- strconv 包提供了布尔型、整型数、浮点数和对应字符串的相互转换,还提供了双引号相关的转换。
- unicode 包提供了 IsDigit、IsLetter、IsUpper 和 IsLower 等类似功能,它们用于给字符分类。
- path 和 path/filepath 包提供了关于文件路径的操作。
复合类型
数组
与其它语言的数组基本一致。
Slice
s := []int{0, 1, 2, 3, 4} // slice
z := [...]int{0, 1, 2} // array
sl := make([]int, len, cap) // slice
// append底层实现可能类似cpp中的vector
s = append(s, 5)
s = append(s, 6, 7, 8)
Map
mp := make(map[string]int)
ages := map[string]int{
"alice": 31,
"bob": 32,
}
delete(ages, "alice") // 删除元素
for k, v := range ages {
fmt.Println("%s\t%d\n", k, v)
}
// check if map contains a specific element
val, ok := ages["jiang"]
if !ok {
// no
// val == 0
}
结构体
匿名成员:
type Point struct {
X, Y int
}
type Circle struct {
Point
Radius int
}
type Wheel struct {
Circle
Spokes int
}
var w Wheel
w.X = 10 // equivalent to w.Circle.Point.X = 10
w.Y = 20
w.Radius = 100
w.Spokes = 30
JSON
import "encoding/json"
json.Marshal()
json.MarshalIndent()
json.Unmarchal()