Go 常见问题汇总
Go 常见问题汇总,看这一篇就够了
解决 Goland 无法 debug 高版本 Go 问题
因为 Go 版本过高,或者 Go 开发环境配置不正确等各种原因,大部分情况出现在同时使用多个 Go 版本得情况。
Go slice的底层实现原理?
切片是基于数组实现的,它的底层是数组,可以理解为对底层数组的抽象,其占用 24 个字节,包含数据指针(8字节)、切片的长度(8字节)、切片的容量(8字节)三个字段
Go内置函数make和new的区别?
初始化变量一般分为两步:变量声明 + 变量内存分配,在 Go 语言中 var 关键字用来声明变量的,若声明变量是值类型系统会默认为他分配内存空间,并赋该类型的零值。
Go defer关键字的实现原理?
defer 能够让我们推迟执行某些函数调用,推迟到当前函数返回前才实际执行。defer 与 panic 和 recover 结合,形成了Go语言风格的异常与捕获机制。defer 语句经常被用于处理成对的操作,如文件句柄关闭、连接关闭、释放锁。虽然 defer 方便开发者使用,但是也有一定的性能损耗。
Go函数参数传递到底是值传递还是引用传递?
Go语言中所有的传参都是值传递(传值),都是一个副本,一个拷贝。是否可以修改原内容数据,和传值、传引用没有必然的关系。但在Go语言里因为参数是引用类型,虽然只有传值,但是我们还是可以修改原内容数据。
Go函数返回局部变量的指针是否安全?
一般来说,局部变量会在函数返回后被销毁,因此被返回的引用就成为了 “无所指” 的引用,程序会进入未知状态。但这在 Go 中是安全的,Go 编译器将会对每个局部变量进行逃逸分析。如果发现局部变量的作用域超出该函数,则不会将内存分配在栈上,而是分配在堆上,因为他们不在栈区,即使释放函数,其内容也不会受影响。
Go方法值接收者和指针接收者的区别?
如果方法的接收者是指针类型,无论调用者是对象还是对象指针,修改的都是对象本身,会影响调用者;如果方法的接收者是值类型,无论调用者是对象还是对象指针,修改的都是对象的副本,不影响调用者;