Golang面试题总结
面试题纠错
- 数组作为参数传递是,传递的是值,但切片作为参数传递时,传递的是地址值,所以数组中的值是不可更改的,但是切片中的值可以修改。
func changes(i []int) []int{ i[0]=0 return i } func changea(i [3]int) [3]int{ i[0]=0 return i } func main(){ a:=[3]int{1,2,3} //数组a s:=[]int{4,5,6} //切片s changea(a) fmt.Println(a) changes(s) fmt.Println(s) } 输出结果: [1 2 3] [0 5 6] Process finished with exit code 0
- golang中的map是hash的表现,每次遍历的顺序可以不一样
- Go中可以抛出一个panic异常,然后再defer中通过recover()捕获这个异常,然后正常处理,如果同时有多个defer,那么异常会被最近的recover()捕获并正常处理。recover必须在derfer函数中运行,多层嵌套依然无效,必须在defer函数中直接调用才有效。
package main import ( "fmt" ) func main() { defer_call() } func defer_call() { defer func() { fmt.Println("打印前") }() defer func() { // 必须要先声明defer,否则recover()不能捕获到panic异常 if err := recover();err != nil { fmt.Println(err) //err 就是panic传入的参数 } fmt.Println("打印中") }() defer func() { fmt.Println("打印后") }() panic("触发异常") } 输出内容为: 打印后 触发异常 打印中 打印前 Process finished with exit code 0
- init()方法在任何包中都可以出现,建议保重只含一个init()函数比较好,容易理解,但是main()只能出现在Package main中,go程序会自动调用init和main。
- golang中的方法和函数是不一样的,官方解释:方法是包含了接收者的函数
函数的固定格式:func 函数名 (参数)(可选) 返回值(可选) {}
方法在func之后是接受着而不是函数名: func (p *myint/p myint) mydouble() int {}
接收者好比一个类,这些方法是他的成员函数 - golang中的引用类型包括,切片,map,channel和interface
- main 不能带参数,没有返回值必须在main包,可以使用flag包获取和解析命令行参数
- 当为变量赋nil值时,变量必须有类型,interface{} error都行,string为空是"",不是nil
- s:={1,2,3, 换行一定要加,否则报错
4,5,5,} - golang中没有前置自增自减 i、--i,只可以后置自增自减
- 源文件为slice.go,那么测试文件名为:slice_test.go,go test 要求测试函数前缀必须为Test
- golang中的闭包问题,先来解释下什么是闭包
闭包:闭包是指可以包含自由(未绑定特定对象)变量的代码块:这些变量不是这个代码块内或者任何全局上下文中定义的,而是在定义代码块中的环境中定义的(局部变量)
在一个for range循环中如果你不带参数传值的话,那么取得值为循环的最后一个值,如果传递了值,则会输出处理之后的每个迭代中的值,但并不一定是按照顺序输出。例子可以查看关于golang闭包中所谓的“坑”,
您可能感兴趣的文章:
go golang 笔试题 面试题 笔试 面试
golang基础教程
Golang面试题总结
Golang 在 VSCode 中的调试配置
golang面试官:for select时,如果通道已经关闭会怎么样?如果select中只有一个case呢?
golang for循环_golang面试官:for select时,如果通道已经关闭会怎么样?如果select中只有一个case呢?...
不要等离职了,才知道for select时,如果通道已经关闭会怎么样?
:first-child和:last-child学习笔记
后端面试(Golang)可能会碰上的附加智力题
c builder case内是局部变量吗_golang面试官:for select时,如果通道已经关闭会怎么样?如果只有一个...