一些 Golang 的内置包
Reflect
Go中每个接口变量都对应一个pair(value, concrete type), value是这个变量的值,而concrete type是这个变量在runtime系统中看见的类型。反射就是检查接口变量内部pair的机制
Type & Value
reflect包提供了Type和Value两种核心类型,代表Go中的变量值和变量类型。可通过TypeOf和ValueOf方法获取变量的Type和Value。
reflect的TyepOf和ValueOf函数签名如下:
1 | func TypeOf(i interface{}) Type |
这两函数先将传进来的变量转化为接口,再调用反射机制来实现对变量类型和值的查看
Type和Value也提供了一些方法:
- Type
- Kind() 对应的底层类型,返回Kind(本质是uint)
- Elem() 返回元素的类型Type,参数必须是array,chan,map,pointer,slice等
- Value
- Kind()
- Elem() 接口或指针对应的值
- Type()
- Interface() 以空接口的形式返回Value的值
Field & Method
对于struct变量,可以通过NumField和NumMethod来遍历该结构体的字段和方法
1 | type AnoStruct struct { |
CanSet & Setxx
可以通过反射修改原变量
1 | // 必须传入指针配合Elem()方法来修改原变量的值 |
Call
可通过反射调用函数
1 | func (v* AnoStruct) DoSomething(val string) { |
Sort
掌握Sort包的一些函数可以方便刷lc(不是
sort.Interface
1 | package sort |
sort.Sort
sort.Sort
函数可对一个数组类型变量中的元素进行排序,且该数组类型变量需要实现sort.Interface
接口。
1 | package demo/sort/Sort |
sort.Slice
sort.Sort()
的使用方法过于麻烦,相比下使用sort.Slice()
方法能更轻松实现数组的自定义排序。其第一个参数就是待排序数组,第二个参数就是指明排序方法的less
函数
1 | package demo/sort/Slice |
sort.Ints / sort.Float64s
sort中有int和float数组的升序排序函数sort.Ints(x []int)
和sort.Float64(x []float64)
。
1 | package demo/sort/Ints |
sort.Search
sort.Search(n int, f func(i int) bool) int
用于返回$[0, n)$中最小的能够满足参数f的索引值。
1 | package demo/sort/Seach |
sort.SearchInts(x []int, target int)
,sort.SearchFloat64s(x []float64, target float64)
和sort.SearchStrings(x []string, target string)
作用与之类似,不展开描述。
Container
container下包含了三个包:list
、heap
和ring
,对应数据结构中的双向链表、堆、环形链表。
List
实现源码:
1 | type Element struct { |
节点Element的Value的类型为空接口,故可以插入任意类型的数据。以下是List的方法
- 初始化:
list.New() *List
- 增:
(s *list)PushFront(x any)
(s *list)PushBack(x any)
(s *list)PushFrontList(other *List)
(s *list)PushBackList(other *List)
(s *list)InsertAfter(v any, mark *Element)
(s *list)InsertBefore(v any, mark *Element)
- 删
(s *list)Remove(e *Element) any
, 返回被删除节点的值(s *list)Init() *List
, 清空列表
- 改
(s *list)MoveToFront(e *Element)
(s *list)MoveToBack(e *Element)
(s *list)MoveBefore(e, mark *Element)
(s *list)MoveAfter(e, mark *Element)
- 查
(s *list)Back() *Element
(s *list)Front() *Element
(s *list)Len() int
O(1)
可通过Element的Next() *Element
和Prev() *Element
方法进行节点操作
heap
和sort包一样,heap也有一个Interface类型。
1 | type Interface interface { |
所有实现该接口的类型也能用container/heap
包提供函数构建最大堆/最小堆(由sort.Interface的Swap函数决定)。
常用的heap包提供的函数有:
- 初始化
Init()
, 即buildHeap()
- 增
Push(h Interface, v any)
- 删
Pop(h Interface)
Remove(h Interface, i int)
, 删除下标为i的元素
- 改
Fix(h Interface, i int)
,若下标i处被修改,可使用Fix函数创新从i处构造堆
ring
实现源码:
1 | type Ring struct { |
ring的一些方法
- 创建:
New(i int)
,i为节点个数
- 增:
(s *Ring)Link(r *Ring) *Ring
, 当前环s与r拼接,使s的下个元素为r,并返回原本s的下个元素
- 删:
(s *Ring)Unlink(n int) *Ring
,删除从s.Next()开始的n % s.Len()
个元素,返回被删除的环
- 查:
(s *Ring)Next() *Ring
(s *Ring)Prev() *Ring
(s *Ring)Len() int
- 其他:
(s *Ring)Do(f func(a any))
,对环的每个元素调用f函数(s *Ring)Move(n int) *Ring
,s移动|n|%s.Len()
个位置,Move(1)==Next()
,Move(-1)==Prev()
Buffer
Golang标准库下的缓冲区,可存储字节。
声明
1 | var buffer bytes.Buffer |
写入
1 | buffer.Write(s []byte) (n int, err error) |
读出
1 | buffer.Read(p []byte) (n int, err error) |
Regexp
正则表达式
构建正则对象
1 | reg := regexp.MustCompile(s string) // s为正则表达式 |
判定字符串是否符合正则表达式
1 | flag, err := regex.MatchString(reg string, s string) |