Go 语言基础(一) | 青训营笔记

76 阅读4分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天

基础语法

认识Go

先从输出一个Hello,World开始!

标准输出是fmt.Println()。

main包是程序的入口文件。

package main
​
import (//引入fmt(format)包(输入输出字符串,格式化字符串)
   "fmt"
)
​
func main() {
   fmt.Println("Hello, world")
}

基础语法 - 变量

注意:在go语言中字符类型不是char,而是byte

var可以用来定义任意类型变量,var后面带一个类型是强制某一类型

go中可以简写,用 := 的方式代替var,这样的效果和var一样,定义任意类型变量,只能用在函数内部,全局变量要用var。

const 可以代替var,只能声明一个常量,不可修改。

package main
​
import (
   "fmt"
   "math"
)
​
func main() {
    var o byte = "p"
    fmt.Println(o)
    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)
    fmt.Println(g)
​
    const s string = "constant"
    const h = 300000
    const i = 3e20 / h
    fmt.Println(s, h, i, math.Sin(h), math.Sin(i))
}

基本语法 - 输入输出

如果我们未为一个变量初始化,则必须显式指定变量类型

%v%d%f%t%c
按数据原格式十进制整形单精度浮点型(float32)布尔型字符型
%s%T%o%x和%X%e和%E
字符串型变量的数据类型八进制十六进制,前者的字母用大写表示,后者用小写表示科学计数法

标准输入是fmt.Scanf()

  • 输入整型

    fmt.Scanf("%d", &a) fmt.Printf("整型:%d", a)

  • 输入浮点型

    fmt.Scanf("%f", &b) fmt.Printf("浮点型:%f", b)

  • 输入字符串

    fmt.Scanf("%s", &str) fmt.Printf("字符串:%s", str)

  • 输入布尔类型

    fmt.Scanf("%t", &c) fmt.Printf("布尔:%t", c)

  • 输入字符类型

    fmt.Scanf("%c", &d) fmt.Printf("字符:%c", d)

基础语法 - if else

if不能不用括号,必须要用大括号,else也是,不能和C++一样省略括号, else和else if要紧贴着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")
    }
}

基础语法 - 循环

Go 语言只有for循环,没有C语言中的while和do while循环。

定义一个死循环 for{...}

循环中有变量,不需要写括号。for j := 7; j < 9; j ++ {...}

基础语法 - switch

需要注意的是,与其他语言恰好相反,switch 语句中每个 casebreak 是隐式存在的,也就是说,每个 case 的逻辑会在执行完毕后立刻退出,而不是跳转到下一个 case

要想跳转到下一个 case,则应该使用 fallthrough 关键字,需要注意的是,fallthrough 关键字只能存在于 case 的末尾

package main
​
import (
   "fmt"
   "time"
)
​
func main() {
    a := 2
    switch a {
        case 1:
            fmt.Println("one")
            fallthrough
        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()
    fmt.Println(t)
    switch {
        case t.Hour() < 12:
        fmt.Println("It's before noon")
        default:
        fmt.Println("It's after noon")
    }
}

基础语法 - 数组

数组是定长的,用的不多,用的更多的是切片slice,就在下一节有介绍。

定义一个int数组 var a [5]int,同样也能用 := 来定义一个数组,b := [5]int{1, 2, 3, 4, 5};定义一个二维数组 var twoD [2][3]int,用%2d可以格式化输出内容,方便阅读。

基础语法 - 切片

对于make来说,是Go语言之用来分配内存的函数,使用在slice(切片),map(哈希表),chan(通道)这三种数据类型上面。因为这三种数据类型的特殊性,用来分配和初始化这三种数据类型。

切片是可变长度的数组

make(type,length,capacity)创建切片

需要注意的是,切片的 长度(length)容量(capacity) 是两个完全不同的东西,前者才是切片实际的长度,后者则是一个阈值,当切片长度达到该阈值时才会对切片进行扩容。在实际测试当中,有定义的长度的切片能够比无定义长度的切片性能更优,因为已经分配了长度,每次使用不需要先扩容。

切片可以用 append 来往后增加。

定义一个map s := make([]string, 3)

给map增加东西 s = append(s, "d"),还可以增加多个 s = append(s, "e", "f")

map中可以使用切片 fmt.Println(s[2:5])