go进阶语法10问

2023-12-13 06:36:37

1.说说go语言中的for循环

for 循环支持 continue 和 break 来控制循环,但是它提供了一个更高级的break,可以选择中断哪一个循环 for 循环不支持以逗号为间隔的多个赋值语句,必须使用平行赋值的方式来初始化多个变量。
2.Array 类型的值作为函数参数
在 C/C++ 中,数组(名)是指针。将数组作为参数传进函数时,相当于传递了数组内存地址的引用,在函数内部会改变该数组的值。
在 Go 中,数组是值。作为参数传进函数时,传递的是数组的原始值拷贝,此时在函数内部是无法更新该数组的。

2.Array 类型的值作为函数参数

在 C/C++ 中,数组(名)是指针。将数组作为参数传进函数时,相当于传递了数组内存地址的引用,在函数内部会改变该数组的值。
在 Go 中,数组是值。作为参数传进函数时,传递的是数组的原始值拷贝,此时在函数内部是无法更新该数组的。

// 数组使用值拷贝传参
func main() {
 x := [3]int{1,2,3}

 func(arr [3]int) {
  arr[0] = 7
  fmt.Println(arr) // [7 2 3]
 }(x)
 fmt.Println(x)   // [1 2 3] // 并不是你以为的 [7 2 3]
}

想改变数组,直接传递指向这个数组的指针类型。

// 传址会修改原数据
func main() {
 x := [3]int{1,2,3}

 func(arr *[3]int) {
  (*arr)[0] = 7 
  fmt.Println(arr) // &[7 2 3]
 }(&x)
 fmt.Println(x) // [7 2 3]
}

直接使用 slice:即使函数内部得到的是 slice 的值拷贝,但依旧会更新 slice 的原始数据(底层 array)

// 错误示例
func main() {
 x := []string{"a", "b", "c"}
 for v := range x {
  fmt.Println(v) // 1 2 3
 }
}


// 正确示例
func main() {
 x := []string{"a", "b", "c"}
 for _, v := range x { // 使用 _ 丢弃索引
  fmt.Println(v)
 }
}

3.说说go语言中的switch语句

单个 case 中,可以出现多个结果选项。只有在 case 中明确添加 fallthrough关键字,才会继续执行紧跟的下一个 case。

4.说说go语言中有没有隐藏的this指针

方法施加的对象显式传递,没有被隐藏起来。

golang 的面向对象表达更直观,对于面向过程只是换了一种语法形式来表达方法施加的对象不需要非得是指针,也不用非得叫 this。

5.go语言中的引用类型包含哪些

切片(slice)、字典(map)、通道(channel)、接口(interface)。

6.说说go语言的main函数

main 函数不能带参数;main 函数不能定义返回值。main 函数所在的包必须为 main 包;main 函数中可以使用 flag 包来获取和解析命令行参数。

7.go语言触发异常的场景有哪些

空指针解析

下标越界

除数为0

调用 panic 函数

8.说说go语言的beego框架

beego 是一个 golang 实现的轻量级HTTP框架

beego 可以通过注释路由、正则路由等多种方式完成 url 路由注入

可以使用 bee new 工具生成空工程,然后使用 bee run 命令自动热编译

9.说说go语言的goconvey框架

goconvey 是一个支持 golang 的单元测试框架

goconvey 能够自动监控文件修改并启动测试,并可以将测试结果实时输出到web界面

goconvey 提供了丰富的断言简化测试用例的编写

10.GoStub的作用是什么

GoStub 可以对全局变量打桩

GoStub 可以对函数打桩

GoStub 不可以对类的成员方法打桩

GoStub 可以打动态桩,比如对一个函数打桩后,多次调用该函数会有不同的行为

文章来源:https://blog.csdn.net/ldxxxxll/article/details/134852594
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。