GO后端开发|青训营笔记

127 阅读4分钟

GO后端开发|青训营笔记

这是我参与「第五届青训营 」伴学笔记创作活动的第1天,在过去的几天时间里,我通过在后端青训营的学习,大致了解了Go语言编程的基础以及工程应用。

1.GO语言的安装与配置

  • 访问GO官网 go.dev/ ,点击 Download ,下载对应平台安装包,安装即可
  • 早期的GO语言通过GOPATH来进行依赖管理,所以对于没有接触过Go Module依赖管理(后面的工程进阶课程中会涉及)的初学者来说需要配置GOPATH环境变量。

1.1 配置GOPATH

GOPATH是一个环境变量,用来表明你写的go项目的存放路径

GOPATH路径最好只设置一个,所有的项目代码都放到GOPATHsrc目录下。

以Windows系统为例,按照如下步骤将GOPATH添加的环境变量:

1.我的电脑->属性->高级系统设置

image.png

2.检查系统变量中是否有GOPATH,如果没有则自己创建一个,设置其值为go项目的文件目录

image.png

3.在path中添加GOPATH

image.png

4.在GOPATH目录下新建三个文件夹

bin:用来存放编译后生成的可执行文件 pkg:用来存放编译后生成的归档文件 src:用来存放源码文件

1.2 IDE选择

可以选择安装 VS Code , 或者 Goland ,对于 VS Code,需要安装 Go 插件

2.GO语言基础语法

2.1 GO语言内置类型

2.1.1 值类型

    bool
    int(32 or 64), int8, int16, int32, int64
    uint(32 or 64), uint8(byte), uint16, uint32, uint64
    float32, float64
    string
    complex64, complex128
    array    -- 固定长度的数组

2.1.2 引用类型

    slice   -- 序列数组(最常用)
    map     -- 映射
    chan    -- 管道

2.1.3 内置函数

    append          -- 用来追加元素到数组、slice中,返回修改后的数组、slice
    close           -- 主要用来关闭channel
    delete            -- 从map中删除key对应的value
    panic            -- 停止常规的goroutine  (panicrecover:用来做错误处理)
    recover         -- 允许程序定义goroutine的panic动作
    real            -- 返回complex的实部   (complexreal imag:用于创建和操作复数)
    imag            -- 返回complex的虚部
    make            -- 用来分配内存,返回Type本身(只能应用于slice, map, channel)
    new                -- 用来分配内存,主要用来分配值类型,比如intstruct。返回指向Type的指针
    cap                -- capacity是容量的意思,用于返回某个类型的最大容量(只能用于切片和 mapcopy            -- 用于复制和连接slice,返回复制的数目
    len                -- 来求长度,比如string、array、slice、map、channel ,返回长度
    printprintln     -- 底层打印函数,在部署环境中建议使用 fmt 包

2.2 变量

变量声明的一般语法如下:

    var 变量名字 类型 = 表达式

在函数内部,有一种称为简短变量声明语句的形式可用于声明和初始化局部变量。它以“名字 := 表达式”形式声明变量,变量的类型根据表达式来自动推导。下面是lissajous函数中的三个简短变量声明语句(§1.4):

    anim := gif.GIF{LoopCount: nframes}
    freq := rand.Float64() * 3.0
    t := 0.0

2.3 接口

Go 语言提供了另外一种数据类型即接口,它把所有的具有共性的方法定义在一起,任何其他类型只要实现了这些方法就是实现了这个接口。

package main  

import (  
    "fmt"  
)  

type Phone interface {  
    call()  
}  

type NokiaPhone struct {  
}  

func (nokiaPhone NokiaPhone) call() {  
    fmt.Println("I am Nokia, I can call you!")  
}  

type IPhone struct {  
}  

func (iPhone IPhone) call() {  
    fmt.Println("I am iPhone, I can call you!")  
}  

func main() {  
    var phone Phone  

    phone = new(NokiaPhone)  
    phone.call()  

    phone = new(IPhone)  
    phone.call()  

}

在上面的例子中,定义了一个接口Phone,接口里面有一个方法call()。结构体NokiaPhone和IPhone实现了call方法,所以实现了这个接口。

2.3.1 空接口类型

空接口是接口类型的特殊形式,空接口没有任何方法,因此任何类型都无须实现空接口。从实现的角度看,任何值都满足这个接口的需求。因此空接口类型可以保存任何值,也可以从空接口中取出原值。

var any interface{}

any = 1
fmt.Println(any)

any = "hello"
fmt.Println(any)

any = false
fmt.Println(any)

对代码的说明:

  • 第 1 行,声明 any 为 interface{} 类型的变量。
  • 第 3 行,为 any 赋值一个整型 1。
  • 第 4 行,打印 any 的值,提供给 fmt.Println 的类型依然是 interface{}。
  • 第 6 行,为 any 赋值一个字符串 hello。此时 any 内部保存了一个字符串。但类型依然是 interface{}。
  • 第 9 行,赋值布尔值。