go 语言常见问题(3)

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

for 循环支持 continue 和 break 来控制循环,但是它提供了一个更高级的break,可以选择中断哪一个循环 for 循环不支持以逗号为间隔的多个赋值语句,必须使用平行赋值的方式来初始化多个变量。

22. 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)
 }
}

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

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

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

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

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

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

26. go语言中指针运算有哪些

可以通过“&”取指针的地址;可以通过“*”取指针指向的数据。

26. 说说go语言的main函数

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

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

  • 空指针解析
  • 下标越界
  • 除数为0
  • 调用 panic 函数

28. 说说go语言的beego框架

  • beego 是一个 golang 实现的轻量级HTTP框架
  • beego 可以通过注释路由、正则路由等多种方式完成 url 路由注入
  • 可以使用 bee new 工具生成空工程,然后使用 bee run 命令自动热编译

29. 说说go语言的goconvey框架

  • goconvey 是一个支持 golang 的单元测试框架
  • goconvey 能够自动监控文件修改并启动测试,并可以将测试结果实时输出到web界面
  • goconvey 提供了丰富的断言简化测试用例的编写

30. GoStub的作用是什么

  • GoStub 可以对全局变量打桩
  • GoStub 可以对函数打桩
  • GoStub 不可以对类的成员方法打桩
  • GoStub 可以打动态桩,比如对一个函数打桩后,多次调用该函数会有不同的行为

你可能感兴趣的:(golang,爬虫,开发语言)