从 Hello World 开始入门

先由打印一个 hello world 开始入门吧

1
2
3
4
5
6
7
package main  

import "fmt"

func main() {
fmt.Printf("hello, world")
}

现在介绍一下这段程序的组成和每个语句的含义吧

  1. 在所有的 go 语言程序中都是由函数和变量组成,这些函数和变量被组织在一个个 go 源文件中,这些源文件按照作者的意图可以被组织为一个 package。
  2. 要使用一个包的函数,就要先 import 进来
  3. main 包必须要有一个 main 函数作为程序的执行入口
  4. go 语言中的字符串是不可以修改的

数组、字符串和切片

先介绍一下在 go 中最常用的三个数据结构

数组

go 语言中的数组是一个长度不可变的序列,因此实际开发中很少使用数组,一般都是用切片(可以理解为可变长度的数组)

数组的定义:

1
2
3
4
var a [3]int                 // 长度为3,初始值为0
var b = []int{1, 2, 3} // 长度为3,元素为:1,2,3
var c = []int{2: 3, 1: 2 }// 通过索引指定元素的值,元素为:0,2,3
var d = []int{1, 2, 4: 5, 6} // 定义长度为 6 的 int 型数组, 元素为 1, 2, 0, 0, 5,

第三和第四种写法都运用了指定索引的方式来初始化数组值

GO 语言中的数组和 C 中的有很大的区别,GO 的数组是值语义的,也就是说它并不是一个指向第一个元素的指针,而是包含所有元素的值。因此,当一个很大的数组被赋值或被传递时,实际上会复制整个数组,从而造成很大的开销。为了避免不必要的开销,可以传递一个指向数组的指针。要注意数组指针不等于数组

1
2
3
4
5
6
7
8
9
var a = []int{1, 2, 3}
var b = &a

fmt.Println(a[0], b[0]) // 1 1
fmt.Println(a[1], b[0]) // 2 2

for i, v := range b {
fmt.Println(i, v)
}

虽然 b 是指向数组 a 的指针,通过 b 访问数组元素的方式和 a 一样,也可以通过 for range 遍历数组指针的元素

介绍几种遍历数组的方法

1
2
3
4
5
6
7
8
9
10
for i := range a {
fmt.Printf("a[%d], %d", i, a[i])
}
for i, v := range a {
fmt.Printf("a[%d], %d", i, v)
}

for i := 0; i < len(a); i++ {
fmt.Printf("a[%d]: %d\n", i, a[i])
}

字符串

字符串是一个不可变的字节序列,与数组不同,字符串每一个元素是不可变的

切片