var slice []type = make([]type, len)
19.new和make的区别new 的作用是初始化一个指向类型的指针 (*T)。new 函数是内建函数,函数定义:func new(Type) *Type 。使用 new 函数来分配空间 。传递给 new 函数的是一个类型,不是一个值 。返回值是指向这个新分配的零值的指针 。
make 的作用是为 slice,map 或 chan 初始化并返回引用 (T) 。make 函数是内建函数,函数定义:func make(Type, size IntegerType) Type;第一个参数是一个类型,第二个参数是长度;返回值是一个类型 。
make(T, args) 函数的目的与 new(T) 不同 。它仅仅用于创建 Slice, Map 和 Channel,并且返回类型是 T(不是T*)的一个初始化的(不是零值)的实例 。
20.Printf()、Sprintf()、Fprintf()函数的区别用法是什么都是把格式好的字符串输出,只是输出的目标不一样 。
Printf(),是把格式字符串输出到标准输出(一般是屏幕,可以重定向) 。Printf() 是和标准输出文件 (stdout) 关联的,Fprintf 则没有这个限制 。
Sprintf(),是把格式字符串输出到指定字符串中,所以参数比printf多一个char* 。那就是目标字符串地址 。
Fprintf(),是把格式字符串输出到指定文件设备中,所以参数比 printf 多一个文件指针 FILE* 。主要用于文件操作 。Fprintf() 是格式化输出到一个stream,通常是到文件 。
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] = 7fmt.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] = 7fmt.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语言中的引用类型包含哪些切片(slice)、字典(map)、通道(channel)、接口(interface) 。
26.说说go语言的main函数main 函数不能带参数;main 函数不能定义返回值 。main 函数所在的包必须为 main 包;main 函数中可以使用 flag 包来获取和解析命令行参数 。
27.go语言触发异常的场景有哪些
- 空指针解析
- 下标越界
- 除数为0
- 调用 panic 函数