Go语言学习笔记(更新中)

Go语言学习笔记

参考网址

  1. https://www.runoob.com/go/go-tutorial.html
  2. https://tour.go-zh.org/list

认识Go

特色

  1. 简洁、快速、安全
  2. 并行、有趣、开源
  3. 内存管理、数组安全、编译迅速

用途

Go 语言被设计成一门应用于搭载 Web 服务器,存储集群或类似用途的巨型中央服务器的系统编程语言。
对于高性能分布式系统领域而言,Go 语言无疑比大多数其它语言有着更高的开发效率。它提供了海量并行的支持,这对于游戏服务端的开发而言是再好不过了。

运行

  1. 生成二进制文件 go bulid ...
  2. 执行.go文件 go run ...

基础部分

组成部分

· 包的声明 package ...
· 引入包.  import " ... "
· 函数
· 变量
· 语句&表达式
· 注释
  1. package main 定义了包名。你必须在源文件中非注释的第一行指明这个文件属于哪个包,如:package main。package main表示一个可独立执行的程序,每个 Go 应用程序都包含一个名为 main 的包。
  2. import “fmt” 告诉 Go 编译器这个程序需要使用 fmt 包(的函数,或其他元素),fmt 包实现了格式化 IO(输入/输出)的函数。
  3. func main() 是程序开始执行的函数。main 函数是每一个可执行程序所必须包含的,一般来说都是在启动后第一个执行的函数(如果有 init() 函数则会先执行该函数)。
  4. // 是注释,在程序执行时将被忽略。单行注释是最常见的注释形式,你可以在任何地方使用以 // 开头的单行注释。多行注释也叫块注释,均已以 /* 开头,并以 */ 结尾,且不可以嵌套使用,多行注释一般用于包的文档描述或注释成块的代码片段。
  5. fmt.Println(…) 可以将字符串输出到控制台,并在最后自动增加换行字符 \n。 使用 fmt.Print(“hello, world\n”) 可以得到相同的结果。 Print 和 Println 这两个函数也支持使用变量,如:fmt.Println(arr)。如果没有特别指定,它们会以默认的打印格式将变量 arr 输出到控制台。
  6. 当标识符(包括常量、变量、类型、函数名、结构字段等等)以一个大写字母开头,如:Group1,那么使用这种形式的标识符的对象就可以被外部包的代码所使用(客户端程序需要先导入这个包),这被称为导出(像面向对象语言中的 public);标识符如果以小写字母开头,则对包外是不可见的,但是他们在整个包的内部是可见并且可用的(像面向对象语言中的 protected )。

  1. 每个 Go 程序都是由包构成的。程序从 main 包开始运行。本程序通过导入路径 “fmt” 和 “math/rand” 来使用这两个包。按照约定,包名与导入路径的最后一个元素一致。例如,“math/rand” 包中的源码均以 package rand 语句开始。
  2. 在导入过程中可以使用圆括号进行分组同时导入所有需要的包,或者分行分别导入包文件。
  3. 首字母大写的包导出的文件,可以直接进行调用。否则无法直接在包外调用。

变量

  1. 通过var进行声明
  2. 在函数中,简洁赋值语句 := 可在类型明确的地方代替 var 声明。函数外不适用
  3. 变量的基本类型
    bool、int、uint、string、float、complex
  4. 没有初始化的默认为0\false、空字符串
  5. 不同类型之间只能进行显式的转换
  6. 变量名字之前添加const即可声明为常量
  7. 同一句话中可以并行赋值,不需要像C语言中使用中间变量缓存

值类型和引用类型

  1. 所有像 int、float、bool 和 string 这些基本类型都属于值类型,使用这些类型的变量直接指向存在内存中的值;使用等号赋值其实是内存中将 i 的值进行了拷贝;值类型的变量的值存储在栈中。

运算符

  1. 算术运算符
    1. 加+减-乘*除\求余%自增++自减–
  2. 关系运算符
  3. 逻辑运算符
    1. && || !
  4. 位运算符
    1. & | ^ >> <<
  5. 赋值运算符
  6. 其他运算符

流程控制语句

  1. 唯一的循环结构for,初始化语句和后置语句都可以根据情况省略。结构如下:

for 初始化语句 ;判断表达式 ;后置语句{ 循环体 }

  1. for中省去分号以后即变为while循环,省去判断表达式就变成了无限循环
  2. if语句判断表达式 外面没有小括号,但是判断以后的表达式中必须包含大括号。判断之前可以通过;再添加一个初始化的语句,但是作用域只存在于if之中。可以搭配else使用
  3. switch语句,运行第一个值等于条件表达式的 case 语句。可以无条件,此时转化为一连串的if-else
  4. defer 语句会将函数推迟到外层函数返回之后执行。推迟调用的函数其参数会立即求值,但直到外层函数返回前该函数都不会被调用。–类似栈结构。

其他数据类型

  1. 指针 指针保存值的内存地址,其中类型 *T 是指向 T 类型值的指针。其零值为 nil。取地址使用&,指针可以改变本来的值。
  2. 结构体结构如下:访问时使用.即可,结构体字段可以通过结构体指针来访问,直接使用指针即可,无需先取地址。初始化结构体可以选择初始化哪一个。

type 结构体名称 struct
{结构体属性值1,结构体属性值2 …}

  1. 数组 类型 [n]T 表示拥有 n 个 T 类型的值的数组。

var 数组名【数组元素个数】 元素类型

  • 数组切片 通过对原书足额的下标进行确定进而分割数组,区间选择左闭右开。 切片以后的和原来数组共享内存空间,对切片的操作会影响原来的数组属性值。切片拥有 长度 和 容量。进行切片时会改变切片的长度,但是容量会保持不变。切片可以用内建函数 make 来创建,这也是你创建动态数组的方式。当在添加元素到切片之中的时候,如果容量不足,会按照倍增的顺序增加切片的容量。

变量名 := make([]变量类型,切片长度,切片容量)

  1. 映射 映射将键映射到值。nil 映射既没有键,也不能添加键。
  2. 函数值 可以作为参数传递

函数

  1. 函数可以没有参数/多个参数。当连续两个或多个函数的已命名形参类型相同时,除最后一个类型以外,其它都可以省略,另外如果没有返回值,可以省略。函数的形式如下:

func 函数名 (参数1名称,参数1 类型,参数2名称,参数2类型 … ) 返回值1类型 返回值2类型 … {
函数体
}

  1. 函数返回值可以进行命名,如果函数体中没有return 语句会直接返回已经命名的返回值变量。

哈希

其实也可以看作是一个集合,键和值两部分组成,增删改查部分如下

package main

import "fmt"

func main()  {
	var countryMap map[string]string//声明一个集合
	countryMap = make(map[string]string)

	//TODO1: 向map中插入数据
	countryMap["Chinese"] = "北京"
	countryMap["English"] = "伦敦"

	//TODO2: 在map中遍历数据
	for country := range countryMap{//country表示的是mao中的键
		fmt.Println(country,"首都是",countryMap[country])
	}

	//TODO3: 在map中查找数据(ok true or false 表示是否可以查找到)
	capital, ok := countryMap["Chinese"]
	if(ok){
		fmt.Println("Chinese 的首都是", capital)
	}else{
		fmt.Println("Chinese不存在")
	}
	capital, ok = countryMap["US"]
	if(ok){
		fmt.Println("US 的首都是", capital)
	}else{
		fmt.Println("US不存在")
	}
	//TODO4: 根据键删除map中的元素
	delete(countryMap, "English")
	for country := range countryMap{//country表示的是mao中的键
		fmt.Println(country,"首都是",countryMap[country])
	}


}

方法和接口

方法

  1. Go中没有和C++语言中的一样的类,为此我们可以使用结构体类型定义方法。所谓方法,就是一类带有特殊的接受者参数的函数。 方法即函数

func (参数1名称 参数1类型 参数2名称 参数2类型…) 方法名() 返回值类型{方法体}

package main

import (
	"fmt"
	"math"
)

// Vertex 创建一个结构体,其中包含两个float64的变量
type Vertex struct {
	X, Y float64
}

// Abs 接受的参数为结构体,返回一个float64的量
func (v Vertex) Abs() float64 {
	return math.Sqrt(v.X*v.X + v.Y*v.Y)
}

func main() {
	v := Vertex{10, 4}
	fmt.Println(v.Abs())
}

接口

  1. 接口是一组仅包含方法名、参数、返回值的未具体实现的方法的集合。接口设置的一个目的就是为了将变量赋值给接口,用于使用本接口下的关于此变量下的方法。

方法与函数的区别

  1. 接受一个值作为参数的函数必须接受一个指定类型的值,而以值为接收者的方法被调用时,接收者既能为值又能为指针。接口类型的变量可以保存任何实现了这些方法的值。

切片

并发
Go 语言支持并发,我们只需要通过 go 关键字来开启 goroutine 即可。

  1. Go程
    协程 函数名称前+go
    不能被其他杀死
  2. 信道 channel
    向信道发送数据遵循队列的原则,先进先出。
  3. select语句

包依赖工具

Go语言所依赖的所有的第三方库都放在 GOPATH 这个目录下面,从 Go1.13 版本开始,go module 成为了Go语言默认的依赖管理工具。实现了不同的项目依赖于同一个第三方的库的不同版本。
go mod详解
初始化当前文件夹 go mod init
使用go mod tidy进行依赖的检测
监听的端口默认本地网卡的端口号

开发所用的重要函数

  1. err := c.ShouldBindJSON(¶m)
    读取c中对应的json信息,解析成自己想要的格式

你可能感兴趣的:(实习盛宴,golang,后端)