- 使用值为nil的slice和map会发生什么?
在nil切片中添加元素成功。在nil的map中添加会panic,因为map没有分配实际内存。为空的切片底层数组的指针为nil,但是len,cap都是0,当append时,go会自动分配新的底 层数组。
2.访问map的key需要注意什么?
当访问map中不存在的key时,go会返回元素对应数据类型的零值:nil或者false和0.所以取值操作总有值返回,不能通过取出来的值来判断key是不是map中。
3.string类型可以修改吗?
不可以,底层是二进制byte。非要修改可以将string转[]byte数组,修改数字后再转string就行。
4.Make与new的区别?
两个不同的内置函数,都可用用来创建新的变量。New用来创建类型的指针,返回指针变量指向零值;make用于创建类型的值,返回该类型的非零值(一般来创建切片,映射,通道)。
(不同)New可以创建任意类型变量,make只能创建引用类型变量。New返回的是指针,make返回的是初始化的值。New创建变量的默认值是0,make要看变量类型。
5.Java和go的区别?
① 特点:java是面向对象语言(封装,继承,多态),使用类和对象来组织代码。Go是静态语言,也可以实现面向对象的特点,而且没有分号。
② 并发:,go有协程,通过channel来通信,java通过线程和锁来实现并发,需要手动操作。
③ 性能:go专门为高并发而生,GO的GC机制也很高效。
④ 生态:java的生态更加强大,有很多框架和库,而go的生态比较小,但也在迅速发展。
6.Go值接收与指针接收区别?
方法可以给用户自定义类型添加新行为,与函数的区别,主要有一个接收者。调用方法时接收者既可以是值类型,也可以是指针类型。
方法调用时,值类型可以调用值接收者和指针接收者。指针类型也可以调用值接收和指针接收方法。
如果方法接收值是值类型,无论调用者是对象还是指针,修改的都只是对象的副本,不影响调用者;如果方法的接受值是指针类型,则调用者修改的是指针指向的对象本身。
使用指针做接收者的原因:方法可以修改接收者指向的值,避免每次调用方法都复制该值(大型结构体时,会更高效)
7.Go的类型转化与断言的区别?
他俩本质都是把一个类型转换成另一个类型,类型断言是对接口变量进行操作的。
类型转换:转换前后两个类型要互相兼容,类型转换在编译期就完成的,并且静态类型检查通过为前提。
断言:将一个接口类型的值转化成其他类型的值。