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

82 阅读3分钟

该篇笔记是于第六届字节跳动青训营后端基础班学习时,所写笔记,速成go语言的学习心得笔记。

go初体验(hello world)

不管学什么语言,先跑个hello world,都能够大致了解一下这个语言的特点

package main  //声明main包,表明是可执行程序

import "fmt"  // 导入 fmt 包

func main() {  //main方法,主程序
        fmt.Println("hello world")//打印输出hello world
}

go基础语法

变量声明(var或:=

go语言是一门极简语言,所以在声明变量相对于其他语言更为简洁。

在go中可以使用关键词var声明变量,声明变量的语法为var name type = value。其中name为变量名, type为变量类型 (可省略,会自动识别类型)value为变量值(可省略)。

在go中还可以使用:=操作符,进行变量赋值。这种赋值方式只能用于局部变量,不适用于全局变量。类型也是由系统自动识别,是一种极简赋值方式。

常量声明const

常量与变量不同,常量是不可变的值。常量在定义时,必须赋值

package main 

import "fmt"

func main() {
    var a = "a字符串"
    var b, c int = 1, 2
    var d = true
    var e float64                      // float64,也即我们熟悉的双精度,存储占用8个字节
    
    f := a + "+f字符串"                // String 类型 可以直接用 + 号拼接
    g := float32(e)                   // float32,也即我们常说的单精度,存储占用4个字节
    fmt.Println(a, b, c, e, d, f, g)  //输出: a字符串  1  2  0  true  a字符串+f字符串  0

    const s string = "const_str"
    const h = 500000000
    const i = 3e20 / h
    fmt.Println(s, h, i)	        // 输出:const_str 500000000 6e+11
}

if-else、for循环、分支结构switch

在go语言中if-else也是简化了if后的括号,并且能够在if里进行赋值。

在go语言中,循环只有for,没有while,do while,极大的简化了代码,只用for也能满足所有场景。for是允许单独存在,此时就是一个死循环,可以通过break结束循环。

其他语言的switch,如果case后不加break的话,是会继续往下运行剩下的case,在go语言中,是不需要夹break的。而且在go中switch的功能更加强大,可以使用任意的变量类型。

package main

import "fmt"

func main() {

    if num := 6; num < 0 {
         fmt.Println("num < 0")
    } else if num == 0 {
         fmt.Println("num = 0")
    } else {
         fmt.Println("num > 0")   //输出 num > 0
    }
    
    for i := 0; i < 10; i++ {
        fmt.Print(i)              //输出 0~9
    }

    a := 2
    switch a {
    case 1:
            fmt.Print("one")
    case 2:
            fmt.Print("two")     //输出:two
    default:
            fmt.Print("other")
    }

}

切片

切片是可以改变长度的,还可以像数组一样去取值,还可以用append追加元素,扩充容器,相对于其他语言,这更为便捷。

    s := make([]string, 3) //创建长度为三的字符串数组
    s[0] = "a"          //赋值
    s[1] = "b"
    s[2] = "c"
    fmt.Println(s[1:3]) //输出:[b c]
    fmt.Println(s[:3])  //输出:[a b c]
    fmt.Println(s[1:])  //输出:[b c]

    s = append(s, "d") //扩充容器,追加元素
    s = append(s, "e", "f")  //可同时追加多个元素

    fmt.Println(s, len(s)) //输出:[a b c d e f] 6

map集合

在go语言中的map和java的差不多,写法更为简洁,都是key-value的键值对。[“ ”]中的值就是key。通过这个key来对map中的元素增删改查。

    m := make(map[string]int)
    m["one"] = 1
    m["two"] = 2
    fmt.Println(m, len(m))   //输出:map[one:1 two:2] 2
    fmt.Println(m["one"])    //输出:1
    fmt.Println(m["unknow"]) //输出:0

    r, ok := m["one"]
    fmt.Println(r, ok)       //输出:1 true

    delete(m, "one")         //删除"one"键值对

range

在go语言中,可以使用range关键词来遍历。如果是数组类型,有两个值接收,一个是当前遍历元素的索引,一个是当前遍历元素的值。如果是集合map的话,一个是当前遍历的key,一个是当前遍历的value。这样的遍历方式较于其他语言,更为简单明了,便于开发。

    //数组遍历
    arr := []int{1, 2, 3}
    for i, num := range arr {
        fmt.Println(i, num)          //输出:0 1 	1 2 	2 3
    }
    //集合遍历
    m := map[string]string{"a": "A", "b": "B"}
    for k, v := range m {                //遍历map
        fmt.Println(k, v)            //输出:a A b B
    }