字符串
1.字符串 01.字符串底层 1.1 字符串底层结构 一个字符串是一个不可改变的字节序列,字符串通常是用来包含人类可读的文本数据。 和数组不同的是,字符串的元素不可修改,是一个只读的字节数组。 每个字符串的长度虽然也是固定的,但是字符串的长度并不是字符串类型的一部分。 Go语言字符串的底层结构在 reflect.StringHeader 中定义 1234type StringHeader struct { Data uintptr Len int} 字符串结构由两个信息组成 第一个是字符串指向的底层字节数组 第二个是字符串的字节的长度 而slice 包含一个数据指针、一个长度和一个容量,当容量不够时会重新申请新的内存,Data 指针将指向新的地址,原来的地址空间将被释放 字符串其实是一个结构体,因此字符串的赋值操作也就是 reflect.StringHeader 结构体的复制过程,并不会涉及底层字节数组的复制。 我们可以看看字符串“Hello, world”本身对应的内存结构: 字符串虽然不是切片,但是支持切片操作,不同位置的切片底层也访问的...
go mod包管理工具
1.go mod包管理工具 01.Golang 中包的介绍和定义 包(package)是多个 Go 源码的集合,是一种高级的代码复用方案 Go 语言为我们提供了很多内置包,如 fmt、strconv、strings、sort、errors、time、encoding/json、os、io 等。 Golang 中的包可以分为三种:1、系统内置包 2、自定义包 3、第三方包 1、系统内置包 fmt、strconv、strings、sort、errors、time、encoding/json、os、io 等 2、自定义包 开发者自己写的包 3、第三方包 属于自定义包的一种,需要下载安装到本地后才可以使用 如前面给大家介绍的"github.com/shopspring/decimal"包解决 float 精度丢失问题 02.Golang包管理工具go mod 在 Golang1.11 版本之前如果我们要自定义包的话必须把项目放在 GOPATH 目录。 Go1.11 版本之后无需手动配置环境变量,使用 go mod 管理项目 也不需要非得把...
流程控制
1.流程控制 01.if else(分支结构) 1.1 if 条件判断基本写法 1234567891011121314package mainimport ( "fmt")func main() { score := 65 if score >= 90 { fmt.Println("A") } else if score > 75 { fmt.Println("B") } else { fmt.Println("C") }} 1.2 if 条件判断特殊写法 if 条件判断还有一种特殊的写法,可以在 if 表达式之前添加一个执行语句,再根据变量值进行判断 1234567891011121314package mainimport "fmt"func main() { //这里的 score 是局部作用域 if score := 56; score >= 90 ...
interface接口
1.interface接口 01.Golang接口的定义 1.1 Golang 中的接口 在Go语言中接口(interface)是一种类型,一种抽象的类型。 接口(interface)定义了一个对象的行为规范,只定义规范不实现,由具体的对象来实现规范的细节。 实现接口的条件 一个对象只要全部实现了接口中的方法,那么就实现了这个接口。 换句话说,接口就是一个需要实现的方法列表。 1.2 定义一个Usber接口 定义一个 Usber 接口让 Phone 和 Camera 结构体实现这个接口 123456789101112131415161718192021222324252627282930313233343536package mainimport "fmt"//1.接口是一个规范type Usber interface { start() stop()}//2.如果接口里面有方法的话,必要要通过结构体或者通过自定义类型实现这个接口type Phone struct { Name string}//3.手机要...
结构体
1.结构体 01.结构体基础 1.1 什么是结构体 Go语言中没有“类”的概念,也不支持“类”的继承等面向对象的概念。 Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性。 1.2 自定义类型 在 Go 语言中有一些基本的数据类型,如 string、整型、浮点型、布尔等数据类型 Go 语言中可以使用 type 关键字来定义自定义类型。 将 myInt 定义为 int 类型,通过 type 关键字的定义,myInt 就是一种新的类型,它具有 int 的特性 1type myInt int 1.3 类型别名 Golang1.9 版本以后添加的新功能。 类型别名规定:TypeAlias 只是 Type 的别名,本质上 TypeAlias 与 Type 是同一个类型 就像 一个孩子小时候有大名、小名、英文名,但这些名字都指的是他本人。 1type TypeAlias = Type 1.4 自定义类型和类型别名的区别 类型别名与自定义类型表面上看只有一个等号的差异 结果显示 a 的类型是 main.newInt,表 示 main 包下定义的 newInt ...
指针
1.指针 01.关于指针 要搞明白 Go 语言中的指针需要先知道 3 个概念:指针地址、指针类型、指针取值 指针地址(&a) 指针取值(*&a) 指针类型(&a) —> *int 改变数据传指针 变量的本质是给存储数据的内存地址起了一个好记的别名。 比如我们定义了一个变量 a := 10 ,这个时候可以直接通过 a 这个变量来读取内存中保存的 10 这个值。 在计算机底层 a 这个变量其实对应了一个内存地址。 指针也是一个变量,但它是一种特殊的变量,它存储的数据不是一个普通的值,而是另一个变量的内存地址。 Go 语言中的指针操作非常简单,我们只需要记住两个符号:&(取地址)和 *(根据地址取值) 12345678package mainimport "fmt"func main() { var a = 10 fmt.Printf("%d \n",&a) // &a 指针地址 (824633761976) fmt.Printf("%d \n"...
Map
1.map 01.map介绍 1.1 map说明 map 是一种无序的基于 key-value 的数据结构,Go 语言中的 map 是引用类型,必须初始化才能使用。 Go 语言中 map 的定义语法如下:map[KeyType]ValueType 其中: KeyType:表示键的类型。 ValueType:表示键对应的值的类型。 map 类型的变量默认初始值为 nil,需要使用 make()函数来分配内存。 其中 cap 表示 map 的容量,该参数虽然不是必须的。 注意:获取 map 的容量不能使用 cap, cap 返回的是数组切片分配的空间大小, 根本不能用于map。 要获取 map 的容量,可以用 len 函数。 02.定义map 2.1 map定义:法1 123456789101112package mainimport ( "fmt")func main() { scoreMap := make(map[string]int, 8) scoreMap["张三"] = 90 scoreMap["小明&...
切片
1.切片 01.切片基础 1.1 切片的定义 切片(Slice)是一个拥有相同类型元素的可变长度的序列。 它是基于数组类型做的一层封装。 它非常灵活,支持自动扩容。 切片是一个引用类型,它的内部结构包含地址、长度和容量。 声明切片类型的基本语法如下: 123// var name []T// 1、name:表示变量名// 2、T:表示切片中的元素类型 12345678910111213141516package mainimport "fmt"func main() { // 切片是引用类型,不支持直接比较,只能和 nil 比较 var a []string //声明一个字符串切片 fmt.Println(a) //[] fmt.Println(a == nil) //true var b = []int{} //声明一个整型切片并初始化 fmt.Println(b) //[] fmt.Println(b == nil) //false var c = []...
数组
1.数组 01.切片基础 1.1 Array介绍 数组是指一系列同一类型数据的集合。 数组中包含的每个数据被称为数组元素(element),这种类型可以是任意的原始类型,比如 int、string 等 一个数组包含的元素个数被称为数组的长度。 在 Golang 中数组是一个长度固定的数据类型,数组的长度是类型的一部分,也就是说 [5]int 和 [10]int 是两个不同的类型。 Golang中数组的另一个特点是占用内存的连续性,也就是说数组中的元素是被分配到连续的内存地址中的,因而索引数组元素的速度非常快。 和数组对应的类型是 Slice(切片),Slice 是可以增长和收缩的动态序列,功能也更灵活 但是想要理解 slice 工作原理的话需要先理解数组,所以本节主要为大家讲解数组的使用。 1.2 数组定义 1var 数组变量名 [元素数量]T 比如:var a [5]int, 数组的长度必须是常量,并且长度是数组类型的一部分 一旦定义,长度不能变。 [5]int 和[4]int 是不同的类型。 12345678910111213package mainimport &...
基本数据类型
1.基本数据类型 01.内置类型 1.1 值类型: 1234567boolint(32 or 64), int8, int16, int32, int64uint(32 or 64), uint8(byte), uint16, uint32, uint64float32, float64stringcomplex64, complex128array // 固定长度的数组 1.2 引用类型:(指针类型) 123slice // 序列数组(最常用)map // 映射chan // 管道 02.内置函数 Go 语言拥有一些不需要进行导入操作就可以使用的内置函数。 它们有时可以针对不同的类型进行操作,例如:len、cap 和 append,或必须用于系统级的操作,例如:panic。 因此,它们需要直接获得编译器的支持。 12345678910111213append // 用来追加元素到数组、slice中,返回修改后的数组、sliceclose // 主要用来关闭channeldelete // 从...










