go面试题收集
数据结构 数据类型总结 Go语言将数据类型分为四类:基础类型、复合类型、引用类型和接口类型。 基础数据类型包括: 基础类型: 布尔型、整型、浮点型、复数型、字符型、字符串型、错误类型。 复合数据类型包括: 指针、数组、切片、字典、通道、结构体、接口。 什么是反射 在计算机科学领域,反射是指一类应用,它们能够自描述和自控制。 在go中,编译时不知道类型的情况下,可更新变量、运行时查看值、调用方法以及直接对他们的布局进行操作的机制,称为反射。 场景:无法透视一个未知类型的时候,这时候就需要有反射来帮忙你处理,反射使用TypeOf和ValueOf函数从接口中获取目标对象的信息,轻松完成目的。 rune与byte的区别 byte是uint8、rune为uint32,一个仅限于ascii码的值,一个支持更多的值。rune比byte能表达更多的数。 golang默认使用utf8编码,一个中文占用3字节,一个utf8数字占用1字节,utf8字母占用1字节 切片 切片的扩容:切片扩容,一般方式:上一次容量的2倍,超过1024字节,每次扩容上一次的1/4 切片的截取:在截取时,capacity 不能超过原slice的 capacity new() 与 make() 的区别 new(T) 和 make(T, args) 是Go语言内建函数,用来分配内存,但适用的类型不用。 new函数用于分配指定类型的零值对象,并返回指向其内存地址的指针。例如,new(int)将分配一个类型为int且值为0的对象,并返回一个指向该地址的指针。可以使用*运算符访问指针指向的值。 make函数用于创建和初始化内置类型(如map、slice、channel)的数据结构,并返回其指针。它比new函数更加复杂很多,因为它需要知道类型的大小和结构,以便为其分配内存并初始化其字段或元素。例如,make(map[string]int)将创建一个空的map。它有一个string类型的键和一个int类型的值。 nil切片和空切片指向的地址一样吗? nil切片和空切片指向的地址==不一样==。nil空切片引用数组指针地址为0(无指向任何实际地址) 空切片的引用数组指针地址是有的,且固定为一个值 什么是Receiver Golang的Receiver是绑定function到特定type成为其method的一个参数,即一个function加了receiver就成为一个type的method。 构体方法跟结构体指针方法的区别(Receiver和指针Receiver的区别) T 的方法集仅拥有 T Receiver。 *T 方法集则包含全部方法 (Receiver + *Receiver)。 sync.once 是 Golang package 中使方法只执行一次的对象实现,作用与 init 函数类似。但也有所不同 init 函数是在文件包首次被加载的时候执行,且只执行一次 sync.Onc 是在代码运行中需要的时候执行,且只执行一次 当一个函数不希望程序在一开始的时候就被执行的时候,我们可以使用 sync.Once 实现:sync.Once 的源码实现非常简单,采用的是双重检测锁机制 (Double-checked Locking),是并发场景下懒汉式单例模式的一种实现方式 首先判断 done 是否等于 0,等于 0 则表示回调函数还未被执行 加锁,确保并发安全 在执行函数前,二次确认 done 是否等于 0,等于 0 则执行 将 done 置 1,同时释放锁 疑问一: 为什么不使用乐观锁 CAS 简单的来说就是 f() 的执行结果最终可能是不成功的,所以你会看到现在采用的是双重检测锁机制来实现,同时需要等 f() 执行完成才修改 done 值 疑问二: 为什么读取 done 值的方式没有统一 比较 done 是否等于 0,为什么有的地方用的是 atomic....