我已经从事后端开发很多年,近期花了大量时间整理了一份《golang面试题100道》,涵盖了go开发需要掌握的基础知识、核心要点。题目的答案尽量做到简洁、条理性。

Go语言数据类型有哪些?

基本数据类型:数字、布尔型、字符串;

派生数据类型:指针、数组、结构体(struct)、通道(channel)、切片(slice)、函数、接口(interface)、map。

Go程序中的包是什么?

Go语言是使用包来组织源代码的,包(package)是多个Go 源码的集合,是一种高级的代码复用方案。 Go语言中为我们提供了很多内置包,如fmt、os、io 等。 任何源代码文件必须属于某个包,同时源码文件的第一行有效代码必须是 package pacakgeName 语句,通过该语句声明自己所在的包。

Go支持什么形式的类型转换?

第一种:显式类型转换

第二种:编译器处理的隐式类型转换

第三种:类型断言

可以使用cap()函数的数据类型?

数组,使用cap返回数组的元素个数;

slice,使用cap返回 slice 的最大容量;

channel,使用cap返回 channel 的容量。

如何在运行时检查变量类型?

1、使用类型断言:

2、使用reflect包函数

make的作用是什么?和new的区别?

make作用是为slice、map、chan分配内存并返回一个初始化的值。

区别:

1、new(T)为每个类型分配一片内存,而make专门用于为slice,map和chan三种类型分配内存。

2、两者的返回值不同,new的返回值类型为一个指向新分配好的内存空间的一个指定类型的指针。而make的返回值类型为它传入类型的本身。

Go语言中值传递和地址传递(引用传递)有什么区别?如何运用?

Go都是值传递,所有的传参都是值传递(传值),都是一个副本、一个拷贝。

因为拷贝的内容有时候是非引用类型(int、string、struct等这些),这样就在函数中就无法修改原内容数据。

有的是引用类型(指针、map、slice、chan等这些),这样就可以修改原内容数据。

defer的作用和特点是什么?

作用:

defer语句用于延迟调用,defer会在当前函数返回之前执行defer注册的函数。

特点:

多个defer的执行顺序是后进先出LIFO,也就是先执行最后一个defer,最后执行第一个defer;

defer语句的作用域一定要在函数内;

defer在panic异常场景也能确保调用,recover必须和defer结合才有意义。

Go的内存模型中为什么小对象多了会造成GC压力?

通常小对象过多会导致GC三色法消耗过多的CPU。优化思路是,减少对象的分配,尽量做到对象的重用。