# Go语言基础

By [myz](https://paragraph.com/@myz) · 2022-03-14

---

[https://tour.go-zh.org/list](https://tour.go-zh.org/list)

[https://github.com/songleo/the-little-go-book\_ZH\_CN](https://github.com/songleo/the-little-go-book_ZH_CN)

1.  package
    
2.  变量，指针，函数，流程控制
    
3.  数组，切片，映射
    
4.  struct，方法，接口
    
5.  并发
    

* * *

Part 1：基础语法
===========

### 包

    package main
    
    import (
        "fmt"
        "math"
    )
    
    func main(){
        ...
    }
    

每个 Go 程序都是由包构成的。程序从 `main` 包开始运行。因此必须在源文件中非注释的第一行指明这个文件属于哪个包。

*   import 导入其他包
    
*   导出名首字母大写
    

[https://learnku.com/go/t/32464](https://learnku.com/go/t/32464)

### 变量

var 声明变量, const 声明常量

    var i int
    const Pi = 3.14
    

*   如果初始值已存在，可以省略类型。
    
*   在函数中，简洁赋值语句 `:=` 可在类型明确的地方代替 `var` 声明。
    
*   没有明确初始值的变量声明会被赋予它们的 **零值**
    
    *   数值类型：`0`
        
    *   bool: `false`
        
    *   string: `””`
        

**基本类型**：

    bool
    
    string
    
    int  int8  int16  int32  int64
    uint uint8 uint16 uint32 uint64 uintptr
    
    byte // uint8 的别名
    
    rune // int32 的别名
        // 表示一个 Unicode 码点
    
    float32 float64
    
    complex64 complex128
    

### 指针

类型 `*T` 是指向 `T` 类型值的指针，其零值为 `nil`。

### 函数

    func split(sum int) (x, y int) { 
        x = sum * 4 / 9 
        y = sum - x 
        return 
    }
    

类型在变量名之后。

*   参数：0个 - 多个。
    
*   返回值：0个-多个，可被命名，会被视作定义在函数顶部的变量
    

**函数值/函数类型**

函数也是值，可以像其它值一样传递，也可以用作函数的参数或返回值。

函数是一种类型

**闭包**

… …

### 流程控制

*   `for`
    

    for i := 0; i < 10; i++
    for sum < 1000 //相当于while
    

*   `if`
    
         同 `for` 一样， `if` 语句可以在条件表达式前执行一个简单的语句, 其中声明的变量可以在对应的 `else` 块中使用。
        
    
*   `switch`
    
    没提到的case自动 `break`
    
    无条件的switch可代替if
    
*   `defer`
    
    会将函数推迟到外层函数返回之后执行 (但其参数会立即求值)。栈，外层函数返回时后进先出。
    

Part 2：struct 和方法
=================

### 1\. struct声明和初始化

    type Vertex struct {
        X, Y int
    }
    func main() {
        v := Vertex{X: 1} //Y: 0 隐式赋予
        p := &v
        v.X = 4    
        p.Y = 1e9  //指向结构体的指针p，可以隐式间接引用
        fmt.Println(v)
    }
    

声明：字段后要带`,`

初始化：`Name：赋值` 未提到的自动赋予零值。

`new(x)` = `&x{ }`

### 2\. 方法

方法就是一类带特殊的 **接收者** 参数的函数。Go 没有类，不过可以为结构体类型定义方法。

只能为同一包里新定义的类型和其指针声明方法。指针接收者的方法可以修改接收者指向的值。

    func (v Vertex) Abs() float64 {
        return math.Sqrt(v.X*v.X + v.Y*v.Y)
    }
    

函数与方法的区别：以指针为接收者的方法被调用时，接收者既能为值又能为指针。

### 3\. 接口

keyword：interface

接口是定义了合约但并没有实现的类型。接口有助于将代码与特定的实现进行分离。

    type Logger interface {
      Log(message string)
    }
    

Part 3：数组和切片，映射
===============

### 1\. 数组：

`var a [6]int{2, 3, 5, 7, 11, 13}`

### 2\. 切片:

### 3\. 映射:

Part 4: 并发
==========

… …

---

*Originally published on [myz](https://paragraph.com/@myz/go)*
