一、go中,new 和 make 的区别
- new 的作用是初始化一个指向类型的指针(*T)
- new 函数是内建函数,函数定义: func (Type) *Type
- 使用 new 函数来分配空间。传递给 new 函数的是一个 类型,不是一个值。返回值是指向这个新分配的零值的指针
- make 的作用是 给slice 、map、 chan 初始化并且返回引用(T)
- make 函数是内建函数,函数定义: func (Type,size IntegerType)Type
- 第一个参数是类型,第二个参数是长度
- 返回值是一个类型
make(T,args)函数的目的与new(T)不同。它仅仅用于创建slice、map、channel,并且返回类型是T的一个初始化(不是零值)的实例。
二、go中,printf()、Sprintf()、Fprintf()函数的区别用法是什么?
- 都是把格式好的字符串输出,知识输出的目标不一样。
- printf(),是把格式字符串输出到标准输出(一般是屏幕,可以重定向)
- Printf()是和标准输出文件(stdout)关联的,Fprintf()则没有这个限制
- Sprintf()是吧格式字符串输出到指定字符串中,所以参数比Printf多一个char* 。那就是目标字符串地址
- Fprintf()是吧格式字符串输出到指定文件设备中,所以参数比printf多一个文件指针FILE*,主要用于文件操作
- Fprintf()是格式化输出到一个stream,通常是文件
三、go中数组与切片的区别
3.1 数组
- 数组是具有固定长度且拥有零个或者多个相同数据类型元素的序列,数组的长度是数组类型的一部分,所以[3]int 和 [4]int 是两种不同的数组类型
- 数组需要指定大小,不指定也会根据初始化的自动推算出大小,不可改变
- 数组是值传递
- 数组是内置类型,是一组同类型数组的集合,他是值类型,通过从0开始的小标索引访问元素值。在初始化后长度是固定的,无法修改其长度。当作为方法的参数传入时将复制一份数组而不是引用同一指针。数组的长度也是其类型的一部分,通过内置函数len(array)获取其长度。
- 数组定义:
var array [10]int
var array [5]int{1,2,3,4,5}
3.2 切片
- 切片表示一个拥有相同类型元素的可变长度的序列。切片是一种轻量级的数据结构,它有三个属性:指针、长度和容量。
- 切片不需要指定大小
- 切片是地址传递
- 切片可以通过数组来初始化,也可以通过内置函数make()初始化,初始化时 len = cap,在追加元素时如果容量 cap 不足时讲len 的2倍扩容
- 切片定义:
var slice []type = make ([]type ,len )
四、go基本命令
- go env # 用于查看 go 环境变量
- go run # 用于编译并运行 go 源码文件
- go build # 用于编译源码文件、代码包、依赖包
- go get # 用于动态获取远程代码包
- go install # 用于编译go 文件,并将编译结构安装到 bin、pkg 目录
- go clean 用于清理工作目录,删除编译和安装遗留的目标文件
- gobersion # 用于查看go 的版本信息
五、go 语言中的协程
- 协程和线程都可以实现程序的并发执行
- 通过channel 来进行协程间的通信
- 只需要在函数调用前添加go 关键字即可实现 go 的协程,创建并发任务
- 关键字 go 并非执行并发任务,而是创建一个并发任务单元
六、 进程、线程、协程之间的区别
- 进程是资源的分配和调度的一个独立单元,而线程是 CPU 调度的基本单元
- 同一个进程中可以包括多个线程
- 进程结束后它拥有的所有线程都将销毁,而线程的结束不会影响同个进程中的其他线程的结束
- 线程共享整个进程的资源(寄存器、堆栈、上下文),一个进程至少包括一个线程
- 进程的创建调用fork 或者 vfork,而线程的创建调用 pthread_create
- 线程中执行时一般都要进行同步和互斥,因为他们共享同一进程的所有资源
- 进程是资源分配的单位
- 线程是操作系统调度的单位
- 进程切换需要的资源最大,效率很低,线程切换需要的资源一般,效率一般,协程切换任务资源很小,效率高,多进程、多线程根据cpu 核数不一样可能是并行的 ,也可能是并发的。协程的本质就是使用当前进程在不同的函数代码中切换执行,可以理解为并行。协程是一个用户层面的概念,不同协程的魔性实现可能是单线程,也可能是多线程。
- 进程拥有自己独立的堆和栈,既不共享堆,也不共享栈,进程由操作系统调度。(全局变量保存在堆中,局部变量以及函数保存在栈中)
- 线程拥有自己独立的站和共享的堆,共享堆,不共享栈,线程亦由操作系统调度(标准线程是这样的)
- 协程和线程一样共享堆,不共享栈,协程由程序员在协程的代码里显示调度
- 一个应用程序一般对应一个进程,一个进程一般有一个主线程,还有若干的辅助线程,线程之间是平行运行的,在线程里面可以开启协程,让程序在特定的时间内运行。
- 协程和线程的区别是:协程避免了无意义的调度,由此可以提高性能,但也因此,程序员必须自己承担调度的责任,同时,协程也失去了标准线程使用多CPU 的能力。
|