下面代码中的指针p为野指针,因为返回的栈内存在函数结束时会被释放()
说法错误
GO语言的内存回收机制规定,只要有一个指针指向引用一个变量,那么这个变量就不会被释放,因此在GO语言中返回函数参数或临时变量是安全的。
关于golang接口和类的说法,下面说法正确的是
A 一个类只需要实现了接口要求的所有函数,我们就说这个类实现了该接口
正确
B实现类的时候,只需要关心自己应该提供哪些方法,不用再纠结接口需要拆得多细才合理
正确
C类实现接口时,需要导入接口所在的包
错误 :实现接口时,不需要提前导入,都是隐式默认的
D接口由使用方按自身需求来定义,使用方无需关心是否有其他模块定义过类似的接口
正确
go语言的接口是非入侵式接口
当程序运行时,如果遇到引用空指针、下标越界或显式调用panic函数等情况,则先触发panic函数的执行,然后调用延迟函数。调用者继续传递panic,因此该过程一直在调用栈中重复发生:函数停止执行,调用延迟执行函数。如果一路在延迟函数中没有recover函数的调用,则会到达该携程的起点,该携程结束,然后终止其他所有携程,其他携程的终止过程也是重复发生:函数停止执行,调用延迟执行函数。这一说法是否正确。
说法错误
当内置的panic()函数调用时,外围函数或方法的执行会立即终止。然后,任何延迟执行(defer)的函数或方法都会被调用,就像其外围函数正常返回一样。最后,调用返回到该外围函数的调用者,就像该外围调用函数或方法调用了panic()一样,因此该过程一直在调用栈中重复发生:函数停止执行,调用延迟执行函数等。当到达main()函数时不再有可以返回的调用者,因此这个过程会终止,并将包含传入原始panic()函数中的值的调用栈信息输出到os.Stderr。
同级文件的包名不允许有多个。这一说法是否正确。
正确
当函数deferDemo返回失败时,并不能destroy已create成功的资源()
4155837_1512461512530_88DCD8D6C3D99F2A1936A490D23B7A49.png错误
函数返回失败有3种情况:
一是第一次分配资源失败,直接返回,这时并没有分配成功的资源;
二是第一次分配资源成功,第二次分配资源失败,函数返回,第二次和第三次的资源都未成功分配,此时err不为nil,第一次分配成功的资源通过defer释放;
三是第一二次资源分配成功,第三次资源分配失败,函数返回,第一二次分配成功的资源通过defer释放;
如果第三次资源分配也成功了,则函数不会返回失败
关于channel的特性,下面说法正确的是()
给一个 nil channel 发送数据,造成永远阻塞
正确
从一个 nil channel 接收数据,造成永远阻塞
正确
给一个已经关闭的 channel 发送数据,引起 panic
正确
从一个已经关闭的 channel 接收数据,如果缓冲区中为空,则返回一个零值
正确
关于整型切片的初始化,下面正确的是()
s := make([]int)
错误
s := make([]int, 0)
正确
s := make([]int, 5, 10)
正确
s := []int{1, 2, 3, 4, 5}
正确
可以声明一个未指定大小的数组来定义切片 var identifier []type 切片不需要说明长度,或使用make函数来创建切片 var slice1 []type = make([]type ,Len) 也可以指定容量 make([]T ,length, capacity)
对于局部变量整型切片x的赋值,新起一行时,上一行必须是逗号或者右括号
关于GoMock,下面说法正确的是()
GoMock可以对interface打桩
正确
GoMock可以对类的成员函数打桩
错误
GoMock可以对函数打桩
错误
GoMock打桩后的依赖注入可以通过GoStub完成
正确
mock对象的注入
mock对象的行为都注入到控制器以后,我们接着要将mock对象注入给interface,使得mock对象在测试中生效。
在使用GoStub框架之前,很多人都使用土方法,比如Set。这种方法有一个缺陷:当测试用例执行完成后,并没有回滚interface到真实对象,有可能会影响其它测试用例的执行。所以,笔者强烈建议大家使用GoStub框架完成mock对象的注入。
全局变量可通过GoStub框架打桩
过程可通过GoStub框架打桩
函数可通过GoStub框架打桩
interface可通过GoMock框架打桩
反射最常见的使用场景是做对象的序列化(serialization,有时候也叫Marshal & Unmarshal)。例如,Go语言标准库的encoding/json、encoding/xml、encoding/gob、encoding/binary等包就大量依赖于反射功能来实现。
golang虽然没有显式的提供继承语法,但是通过匿名组合实现了继承。
go语言中的++、--操作符都是后置操作符,必须跟在操作数后面,并且它们没有返回值,所以它们不能用于表达式。
只要两个接口拥有相同的方法列表(次序不同不要紧),那么它们就是等价的,可以相互赋值。 Go语言接口是否可以赋值,是在编译期就确定的。接口的查询是在运行期确定。
关于main函数(可执行程序的执行起点),下面说法正确的是()
main函数不能带参数 ---------正确
main函数不能定义返回值----------正确
main函数所在的包必须为main包----------正确
main函数中可以使用flag包来获取和解析命令行参数-------------正确
golang中的指针运算包括()
- 可以通过“&”取指针的地址
- 可以通过“*”取指针指向的数据
关于go vet,下面说法正确的是()
go vet可以检测出死代码------------正确
go vet可以使用绝对路径、相对路径或相对GOPATH的路径指定待检测的包----------正确
go vet是golang自带工具go tool vet的封装--------------正确
当执行go vet database时,可以对database所在目录下的所有子文件夹进行递归检测-------------错误
go tool vet package1 package2 ;go tool vet 才可以递归。
关于goconvey,下面说法正确的是()
goconvey是一个支持golang的单元测试框架-----------------正确
goconvey能够自动监控文件修改并启动测试,并可以将测试结果实时输出到web界面-------------正确
goconvey提供了丰富的断言简化测试用例的编写---------------正确
goconvey无法与go test集成-----------------错误
网友评论