- 切片是指针类型,数组是值类型;
- 数组的长度是固定的,而切片不是(切片可以看成动态的数组);
- 切片比数组多一个容量(cap)属性;
- 切片的底层是数组。
相互转化
- 因切片和数组的类型不同,不能彼此直接赋值。可以使用[:]方式将数组转换成切片。
// 初始化一个数组 a0 := [2]int{1, 2} // 初始化一个切片 s1 := make([]int, 5, 5) fmt.Println(a0) fmt.Println(s1) // 无法将 'a0' (类型 [2]int) 用作类型 []int // s1 = a0 // 无法将 's1' (类型 []int) 用作类型 [2]int // a0 = s1 // 可以使用[:]方式将数组转换成切片 fmt.Println(copy(s1, a0[:])) fmt.Println(a0) fmt.Println(s1) fmt.Println(copy(a0[:], s1)) fmt.Println(a0) fmt.Println(s1)简述Go语言中的零值
- Go 语言原生 map 并不是线程安全的,对它进行并发读写 *** 作的时候,需要加锁。
- 而 sync.map 则是一种并发安全的 map(Go 1.9 引入)。
- 暂停程序业务逻辑,找出不可达对象,然后坐上标记并回收标记好的对象。
- 程序找出它所有可达的对象,并做上标记。
- 清除未标记的对象。
- 停止暂停,让程序继续跑。然后循环重复这个过程,直到process程序生命周期结束。
- 只要是新创建的对象,默认的颜色都是标记为“白色”;
- 每次GC回收开始,然后从根节点开始遍历所有对象,把遍历到的对象从白色集合放入“灰色”集合;
- 遍历灰色集合,将灰色对象引用的对象从白色集合放入灰色集合,之后将此灰色对象放入黑色集合;
- 重复第3步, 直到灰色中无任何对象;
- 回收所有的白色标记表的对象。
-
GC开始将栈上的对象全部扫描并标记为黑色(之后不再进行第二次重复扫描,无需STW)。
-
GC期间,任何在栈上创建的新对象,均为黑色。
-
被删除的对象标记为灰色。
-
被添加的对象标记为灰色。
Go语言的并发模型有哪几种?Go 1.3 - 普通标记清除法,整体过程需要启动STW,效率极低。
Go 1.5 - 三色标记法,堆空间启动写屏障,栈空间不启动,全部扫描之后,需要重新扫描一次栈(需要STW),效率普通。
Go 1.8 - 三色标记法,混合写屏障机制,栈空间不启动,堆空间启动。整个过程几乎不需要STW,效率较高。
Go语言中实现了两种并发模型,一种线程与锁并发模型,另一种是CSP(communicating sequential processes)通信顺序进程模型。
CSP 并发模型- 并发实体(通常可以理解为执行线程),它们相互独立(没有共享内存空间),且并发执行;
- 并发实体之间使用通道发送信息。无论在通道中放数据还是从通道中取数据,都会导致并发实体的阻塞,直到通道中的数据被取出或者通道中被放入新的数据,并发实体通过这种方式实现同步。
用户线程由用户空间的代码创建、管理和销毁,线程的调度由用户空间的线程库完成(可能是编程语言层次的线程库),无需切换内核态,资源消耗少且高效。对 CPU 的竞争是以所属进程的维度参与的,同一进程下的所有用户级线程只能分时复用进程被分配的 CPU 时间片,所以无法很好利用 CPU 多核运算的优势。我们一般情况下说的线程其实是指用户线程;
内核级线程内核线程由 *** 作系统管理和调度,能够直接 *** 作计算机底层的资源,线程切换的时候 CPU 需要切换到内核态。它能够很好利用多核 CPU 并行计算的优势,开发人员可以通过系统调用使用内核线程。
两级线程两级线程模型相当于用户级线程和内核级线程的结合,一个进程将会对应多个内核线程,由进程内的调度器决定进程内的线程如何与申请的内核线程对应。
MPG(machine processor goroutine)模型MPG 线程模型对两级线程模型进行一定程度的改进
- machine:一个 machine 对应一个内核线程,相当于内核线程在 Golang 进程中的映射
- processor:一个 prcessor 表示执行 Go 代码片段的所必需的上下文环境,可以理解为用户代码逻辑的处理器
- goroutine:是对 Golang 中代码片段的封装,其实是一种轻量级的用户线程。
-
如果 slice == nil,那么 len、cap 结果都等于 0。
s00 := make([]int, 0) fmt.Println(len(s00)) fmt.Println(cap(s00)) var s01 []int fmt.Println(len(s01)) fmt.Println(cap(s01))
0
0
0
0 -
使用:=创建切片,cap、len的结果为切片的长度。
// 使用:=创建切片 s1 := []int{1, 2, 3} fmt.Println(len(s1)) fmt.Println(cap(s1))
3
3
-
使用make创建切片,若指定cap,则cap为指定的cap;若未指定cap,则cap等于len。切片容量 ≥ 切片长度。
// 使用make创建切片 var s2 = make([]int, 3) fmt.Println(len(s2)) fmt.Println(cap(s2)) var s3 = make([]int, 3, 5) fmt.Println(len(s3)) fmt.Println(cap(s3))
3
3
3
5 -
当切片的底层数组不足以容纳所有给定值时,它就会分配一个更大的数组,切片会指向这个新分配的数组(通常以 2 倍容量重新分配底层数组)。
// 切片扩容 var s4 = make([]int, 3, 5) fmt.Println(len(s4)) fmt.Println(cap(s4)) s4 = append(s4, 1,2,3,4,5,6) fmt.Println(len(s4)) fmt.Println(cap(s4))
3
5
9
10在大批量添加数据时,建议一次性分配足够大的空间,以减少内存分配和数据复制开销。或初始化足够长的 len 属性,改用索引号进行 *** 作。及时释放不再使用的 slice 对象,避免持有过期数组,造成 GC 无法回收。
- string是字符串类型,*string是字符串指针类型。
- 当其对应的变量为空时,string类型存入数据库的为空字符串,*string类型存入数据库的为nil(null)。
go build [-o output] [-i] [build flags] [packages]
Windows平台-o:指定输出目录与打包后的文件名,代替默认的包名。
-i:安装作为目标的依赖关系的包(用于增量编译提速)
set GOARCH=amd64 set GOOS=windows
go build main.goLinux平台
set GOARCH=amd64 set GOOS=linux
go build main.go
数据库 简述悲观锁和乐观锁 悲观锁GOOS:目标 *** 作系统
- darwin
- freebsd
- linux
- windows
- android
- dragonfly
- netbsd
- openbsd
- plan9
- solaris
GOARCH:目标处理器的架构
- arm
- arm64
- 386
- amd64
- ppc64
- ppc64le
- mips64
- mips64le
- s390x
总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做 *** 作之前先上锁。
乐观锁总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制和CAS算法实现。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库提供的类似于write_condition机制,其实都是提供的乐观锁。
数据库范式- 第一范式(1NF):数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项。
- 第二范式(2NF):要求数据库表中的每个实例或记录必须可以被唯一地区分。
- 第三范式(3NF):要求一个关系中不包含已在其它关系已包含的非主关键字信息。
- 巴斯-科德范式(BCNF):任何非主属性不能对主键子集依赖。
- 第四范式(4NF)
- 第五范式(5NF,又称完美范式)
- 添加索引
- 读写分离
- 字段冗余
- 分库分表
法一:
- 以100为粒度寻找对应得百区间
- 以10为粒度寻找对应得十区间
- 以1为粒度寻找对应得个区间
法二:
网络 简述TCP和UDP的区别二分查找
这是个挖坑的问题!!!
只能说自己没努力,任何客观的解释都无效!
当项目进度明显完不成,作为Leader你应该怎么办?加班!!!
参考文档https://www.cnblogs.com/HinaChan/p/14842521.html#
https://cloud.tencent.com/developer/article/1444356
https://www.topgoer.com/go%E5%9F%BA%E7%A1%80/%E5%9F%BA%E6%9C%AC%E7%B1%BB%E5%9E%8B.html
http://dockone.io/article/10491
https://blog.csdn.net/qq_40694036/article/details/101170698
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)