Go基础语法 | 青训营笔记

76 阅读3分钟

1. Go的基础语法

1.1 Hello World

package main
​
import "fmt"func main() {
fmt.Println("hello world")
}

Go和Python类似,不需要打 ;来作为结尾

1.2 变量与常量

1.2.1 变量

变量有两种声明与初始化方式:

  1. 使用 var,变量名后面可用类型关键字,用= 来初始化
  2. 使用 := 来声明并初始化变量

1.2.2 常量

用 const关键字,表示这是一个常量。类型关键字可省略

package main

import (
"fmt"
"math"
)

func main() {

    var a = "initial"

    var b, c int = 1, 2

    var d = true

    var e float64

    f := float32(e)

    g := a + "foo"
    fmt.Println(a, b, c, d, e, f) // initial 1 2 true 0 0
    fmt.Println(g)                // initialapple

    const s string = "constant"
    const h = 500000000
    const i = 3e20 / h
    fmt.Println(s, h, i, math.Sin(h), math.Sin(i))

}

1.3 条件控制语句

Go中有两种,一种是if-else,一种是 switch-case

1.3.1 if-else

  1. 不需要用括号包括条件
  2. 条件后需要直接跟花括号
  3. else 需要在if 的花括号后面使用
package main

import "fmt"

func main() {

	if 7%2 == 0 {
		fmt.Println("7 is even")
	} else {
		fmt.Println("7 is odd")
	}

	if 8%4 == 0 {
		fmt.Println("8 is divisible by 4")
	}

	if num := 9; num < 0 {
		fmt.Println(num, "is negative")
	} else if num < 10 {
		fmt.Println(num, "has 1 digit")
	} else {
		fmt.Println(num, "has multiple digits")
	}
}

1.3.2 switch-case

  • go中的支持任意类型的变量而不仅仅是int类型。

  • 条件不需要括号

  • 花括号和语句同行

  • case 执行不需要break,默认会跳出

  • case 可以替代if-else。go源码对switch的实现是用if-else来实现的。

package main

import (
	"fmt"
	"time"
)

func main() {

	a := 2
	switch a {
	case 1:
		fmt.Println("one")
	case 2:
		fmt.Println("two")
	case 3:
		fmt.Println("three")
	case 4, 5:
		fmt.Println("four or five")
	default:
		fmt.Println("other")
	}

	t := time.Now()
	switch {
	case t.Hour() < 12:
		fmt.Println("It's before noon")
	default:
		fmt.Println("It's after noon")
	}
}

1.4  for 循环

  1. go代码中唯一的循环结构
  2. 不需要括号
  3. 不写循环条件相当于无限循环,也可以写类似C的for循环。
package main

import "fmt"

func main() {

	i := 1
	for {
		fmt.Println("loop")
		break
	}
	for j := 7; j < 9; j++ {
		fmt.Println(j)
	}

	for n := 0; n < 5; n++ {
		if n%2 == 0 {
			continue
		}
		fmt.Println(n)
	}
	for i <= 3 {
		fmt.Println(i)
		i = i + 1
	}
}

1.5 数组和切片

 1.5.1 array

  1. 数组就和我们在C中一样,长度固定类型确定的元素序列。
  2. 支持二维数组
  3. 在初始化和声明的时候,必须在 [] 内声明长度,否则是切片
package main

import "fmt"

func main() {

	var a [5]int
	a[4] = 100
	fmt.Println("get:", a[2])
	fmt.Println("len:", len(a))

	b := [5]int{1, 2, 3, 4, 5}
	fmt.Println(b)

	var twoD [2][3]int
	for i := 0; i < 2; i++ {
		for j := 0; j < 3; j++ {
			twoD[i][j] = i + j
		}
	}
	fmt.Println("2d: ", twoD)
}

 1.5.2 slice

  1. 类似C++ 的 vector,是长度可变的数组。
  2. 有两种声明方式,一种是make,一种是和数组类似,但是不指定长度。
  3. 在使用append 的时候,需要赋值操作才能改变原数组的长度,其实是要接收长度变化后的结果。
package main

import "fmt"

func main() {

	s := make([]string, 3)
	s[0] = "a"
	s[1] = "b"
	s[2] = "c"
	fmt.Println("get:", s[2])   // c
	fmt.Println("len:", len(s)) // 3

	s = append(s, "d")
	s = append(s, "e", "f")
	fmt.Println(s) // [a b c d e f]

	c := make([]string, len(s))
	copy(c, s)
	fmt.Println(c) // [a b c d e f]

	fmt.Println(s[2:5]) // [c d e]
	fmt.Println(s[:5])  // [a b c d e]
	fmt.Println(s[2:])  // [c d e f]

	good := []string{"g", "o", "o", "d"}
	fmt.Println(good) // [g o o d]
}

 1.6 map

  1.  类似哈希表 ,本质上是 key-value 的键值对。
  2. r后面加ok获取状态
package main

import "fmt"

func main() {
	m := make(map[string]int)
	m["one"] = 1
	m["two"] = 2
	fmt.Println(m)           // map[one:1 two:2]
	fmt.Println(len(m))      // 2
	fmt.Println(m["one"])    // 1
	fmt.Println(m["unknow"]) // 0

	r, ok := m["unknow"]
	fmt.Println(r, ok) // 0 false

	delete(m, "one")

	m2 := map[string]int{"one": 1, "two": 2}
	var m3 = map[string]int{"one": 1, "two": 2}
	fmt.Println(m2, m3)
}

1.7 range

Go 语言中 range 关键字用于 for 循环中迭代数组(array)、切片(slice)、通道(channel)或集合(map)的元素。在数组和切片中它返回元素的索引和索引对应的值,在集合中返回 key-value 对。

  1. for 循环的 range 格式可以对 slice、map、数组、字符串等进行迭代循环
  2. key 和 value 是可以省略
package main

import "fmt"

func main() {
	nums := []int{2, 3, 4}
	sum := 0
	for i, num := range nums {
		sum += num
		if num == 2 {
			fmt.Println("index:", i, "num:", num) // index: 0 num: 2
		}
	}
	fmt.Println(sum) // 9

	m := map[string]string{"a": "A", "b": "B"}
	for k, v := range m {
		fmt.Println(k, v) // b 8; a A
	}
	for k := range m {
		fmt.Println("key", k) // key a; key b
	}
}