Go 语言入门指南:基础语法和常用特性解析(上) | 青训营

54 阅读3分钟

Go语言入门指南(上)

基础语法

  1. 程序框架 一个常见的Go语言程序,一般包括三个部分。 第一行 package main 声明了本程序属于 main 包。 第二行 import 导入外部包。 之后则是函数程序的主体部分,此处主函数作为程序的入口。

    package main
    
    import {
        "fmt"
    }
    
    func main() {
        fmt.Println("hello world")
    }
    
  2. 变量 变量声明时未初始化,则设置为默认零值。 一般有如下四种变量声明方式,第一种与第二种最为常用,根据是否需要设置特殊初始值决定使用哪一种。

    s := ""
    var s string
    var s = ""
    var s string = ""
    
  3. 条件 条件语句相比C语言省略了括号,但是要保证左大括号与 if 属于同一行。 其中,条件也可以带上初始化内容,必须需要一个布尔值变量作为条件判断。 else ifelse 可选择是否添加。

    if num := 9; num < 0 {
        fmt.Println(num, "1")
    } else if num < 10 {
        fmt.Println(num, "2")
    } else {
        fmt.Println(num, "3")
    }
    
  4. 循环 Go语言只存在一种循环,即 for 循环。 一般形式为 for initialization; condition; post {} ,但也可以省略其中部分,若只有条件或所有内容都无可以不带分号。 可以使用 continuebreak 来控制循环。

    for n := 0; n < 5; n++ {
        if n%2 == 0 {
            continue
        }
        fmt.Println(n)
    }
    
    for i <= 3 {
        fmt.Println(i)
        i = i + 1
    }
    
    for {
        fmt.Println("loop")
        break
    }
    
  5. switch switch 语句也有两种形式,可以选择是否带参数,不带参数的 switch 需要在 case 后添加布尔表达式。

    a := 2
    switch a {
    case 1:
        fmt.Println("one")
    case 2, 3:
        fmt.Println("two or three")
    default:
        fmt.Println("other")
    }
    
    t := time.Now()
    switch {
    case t.Hour() < 12:
        fmt.Println("Before noon")
    default:
        fmt.Println("After noon")
    }
    
  6. 数组 数组声明形式与变量类似,也可以自带初始化。 其访问内容的形式和C语言相同,以 twoD[2][2] 的形式利用索引值访问。

    var a [5]int
    a[4] = 100
    b := [5]int{1, 2, 3, 4, 5}
    var twoD [2][3]int
    
  7. 切片 切片 slice 可以看作动态数组,其遍历形式也保持左闭右开形式,如 s[0:len(s)] 会遍历切片 s 中所有内容,若省略冒号左或右侧的数,则默认为两端的值,即 s[0:] 也会遍历所有内容。 创建切片如下第一段代码的形式,可以利用 make 函数。其访问内容方式同数组。 追加内容如下第二段代码形式。 切片的拷贝则可以调用 copy 函数。

    // create
    s := make([]string, 3)
    good := []string{"g", "o", "o", "d"}
    
    // append
    s = append(s, "d")
    s = append(s, "e", "f")
    
    // copy
    c := make([]string, len(s))
    copy(c, s)
    
  8. map Go语言中的 map 是无序的,且保证访问内容是常量时间。 以下代码展示了创建、访问、删除和初始化的方法。

    // create
    m := make(map[string]int)
    m["one"] = 1
    
    // get
    r, ok := m["unknow"]
    fmt.Println(r, ok) // 0 false
    
    // delete
    delete(m, "one")
    
    // initialization
    m2 := map[string]int{"one": 1, "two": 2}
    var m3 = map[string]int{"one": 1, "two": 2}
    
  9. range rangefor 循环的搭配使用可以实现遍历数组,切片或 map 等数据结构。 它会返回索引值和内容。

    // traversal of array
    nums := []int{2, 3, 4}
    sum := 0
    for i, num := range nums {
    }
    
    // traversal of map
    m := map[string]string{"a": "A", "b": "B"}
    for k, v := range m {
    }
    
  10. 函数 在一个包内函数的声明和调用顺序无严格要求。 函数声明需要写明参数类型、返回值等信息,且Go语言支持多返回值。

    func add(a int, b int) int {
        return a + b
    }
    
    func add2(a, b int) int {
        return a + b
    }
    
    func exists(m map[string]string, k string) (v string, ok bool) {
        v, ok = m[k]
        return v, ok
    }