GO面试题

2 篇文章 0 订阅


一、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 的能力。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值