Go语言基础 | 青训营笔记

296 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第1天,今天主要对go语言的基本语法和基本数据结构进行了学习。

1. 本堂课重点内容

  1. go语言开发环境
  2. go语言基础语法
  3. 标准库

2. 详细知识点

2.1 go程序基本结构

一个go语言程序主要会包括以下几个部分:

  • 包声明
  • 引入包
  • 函数
  • 变量
  • 语句 & 表达式
  • 注释

以一个简单的helloworld程序为例,我们可以清晰的感知到这种结构

package main  //包声明
  
import "fmt"  //引入包

//函数
func main() {  
   fmt.Println("Hello, World!") // 语句 & 表达式
}

2.2 go语言基本语法

变量和常量

变量的声明结构:var name type。type有时可以省略。
常量是一个简单值的标识符,程序运行时不会被修改,类型只能是是布尔型、数字型和字符串型。

var a = "initial"
var b, c int = 1, 2
d := a + "foo"

const e = true

判断语句

go语言可以使用if else或者switch来进行判断

  • if else
    if else的使用相较于c或c++,不需要对判断条件使用括号包围
if a == 1 {
    fmt.Println("a == 1")
}
else {
    fmt.Println("a != 1")
}
  • switch
    switch的使用相较于C或c++, 则有很大的不同。一方面,每个case执行完毕后,不需要手动添加break来结束switch(也可以使用fallthrough强制执行后一条语句且不判断true);另一方面,其也不局限于简单的判断表达式的值,只需要每个case条件的为相同类型的表达式。
a := 2
switch a {
    case 1: 
        fmt.Println("one")
    case 2:
        fmt.Println("two")
    default :
        fmt.Println("not one or two")
}

switch {
    case a==1:
        fmt.Println("one")
    case a==2:
        fmt.Println("two")
    default:
        fmt.Println("not one or two")
}

循环语句

go只有for一种循环,使用方法与c的for循环类似,省略三个语句中部分语句可实现while循环的效果。在循环中也可以使用continue和break对循环过程进行控制。

    for i := 1; i < 4; i++ {
        fmt.Println(i)
        if(i==3)
            break;
    }
    
    for i <= 3 {
        i++;
    }

2.3 内置数据结构

数组

go语言中的数组长度一经声明就长度固定不变

    var a [5]int
    a[1] = 1
    var b [3][4] int
    b[1][2] = 2

切片

切片可以理解为一个可变长度的数组,使用make创建,使用append在其末尾添加元素,也可以使用python的切片操作对其进行切分。

    s := make([]string, 3)
    s[0] = "a"
    s = append(s, "d")

map

map的使用类似于python的字典或者c++的unordered_map,其内部是无序的。

    m := make(map[string]int)
    m["one"] = 1
    a := m["one"]
    delete(m, "one")

3. 其他

3.1 string长度之谜

    a := "initial"
    fmt.Println(len(a)) // 7
    fmt.Println(unsafe.Sizeof(a)) // 16

通过上面的案例我们可以看出len函数可以得到string的长度为7,而unsafe.Sizeof得到的结果却是16,与7没有什么关系。这是因为string类型对应一个结构体,结构体声明如下:

type StringHeader struct {
    Data uintptr
    Len int
}

在64位系统上uintptr和int都是8字节,加起来就16了。