Go常用类型和函数笔记
Posted 雪狐晨光
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go常用类型和函数笔记相关的知识,希望对你有一定的参考价值。
人生忽如寄,莫负茶汤好天气
map、slice、channel这些数据类型本身就是指针类型的,所以就算是拷贝传值也是拷贝的指针,拷贝后的参数仍然指向底层数据结构,所以修改它们可能会影响外部数据结构的值。
make只能构建slice、map和channel这3种结构的数据对象,因为它们都指向底层数据结构,都需要先为底层数据结构分配好内存并初始化。本文将对这三个特殊的结构进行解析。
1. slice
https://www.cnblogs.com/f-ck-need-u/p/9854932.html
Go中的slice依赖于数组,它的底层就是数组,所以数组具有的优点,slice都有,且slice支持可以通过append向slice中追加元素,长度不够时会动态扩展,通过再次slice切片,可以得到得到更小的slice结构,可以迭代、遍历等。实际上slice是这样的结构:先创建一个有特定长度和数据类型的底层数组,然后从这个底层数组中选取一部分元素,返回这些元素组成的集合(或容器),并将slice指向集合中的第一个元素。换句话说,slice自身维护了一个指针属性,指向它底层数组中的某些元素的集合。 每一个slice结构都由3部分组成:容量(capacity)、长度(length)和指向底层数组某元素的指针,它们各占1个机器字长(1个机器字长,64位机器上一个机器字长为64bit,共8字节大小,32位架构则是32bit,占用4字节)。
slice的本质是[x/y]0xADDR,[
length/capacity]pointer.
1.1 创建初始化
2. channel
3. map
4. interface
接口(interface)是一种类型,用来定义行为(方法)。接口类型的数据结构是2个指针,占用2个机器字长。
参考连接:go接口
4.1 接口存储数据结构
4.2 接口方法集规则
4.3 接口类型作为参数
5. 字符串遍历 字节索引 和字符索引
// 使用字节索引需要转换一下
func main()
str := "Hello 你好"
r := []rune(str) // 8
for i := 0; i < len(r); i++
fmt.Printf("%c", r[i])
// 迭代字符串的时候,是按照字符而非字节进行索引的。
func main()
var a = "Xiaofang,你好"
for index,value := range a
println(index,string(value))
6. 内置函数使用
close
用于关闭channeldelete
用于删除map中的元素copy
用于拷贝sliceappend
用于追加slicecap
用于获取slice的容量len
用于获取- slice的长度
- map的元素个数
- array的元素个数
- 指向array的指针时,获取array的长度
- string的字节数
- channel的channel buffer中的未读队列长度
print
和println
:底层的输出函数,用来调试用。在实际程序中,应该使用fmt中的print类函数complex
、imag
、real
:操作复数(虚数)panic
和recover
:处理错误new
和make
:分配内存并初始化- new适用于为值类(value type)的数据类型(如array,int等)和struct类型的对象分配内存并初始化,并返回它们的指针给变量。如
v := new(int)
- make适用于为内置的引用类的类型(如slice、map、channel等)分配内存并初始化底层数据结构,并返回它们的指针给变量,同时可能会做一些额外的操作
- new适用于为值类(value type)的数据类型(如array,int等)和struct类型的对象分配内存并初始化,并返回它们的指针给变量。如
7. defer- recover-panic
package main
import "fmt"
func main()
println("start main")
b()
println("end main")
func a()
println("start a")
panic("panic in a")
println("end a")
func b()
println("start b")
defer func()
if str := recover(); str != nil
fmt.Println(str)
()
a()
println("end b")
参考文档:
以上是关于Go常用类型和函数笔记的主要内容,如果未能解决你的问题,请参考以下文章
go语言学习笔记 — 进阶 — 接口:使用类型分支,批量判断空接口中变量的类型
go语言学习笔记 — 基础 — 高级数据类型 — 派生类型:指针(pointer)数据容器函数(func)结构体(struct)通道(channel)
go语言学习笔记 — 进阶 — 接口(3.1):接口与类型的关系 —— 一个类型可以实现多个接口