golang面试题

作者: hades2013 | 来源:发表于2018-04-22 18:46 被阅读0次

    下面代码中的指针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中的指针运算包括()

    1. 可以通过“&”取指针的地址
    2. 可以通过“*”取指针指向的数据

    关于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集成-----------------错误

    相关文章

      网友评论

        本文标题:golang面试题

        本文链接:https://www.haomeiwen.com/subject/gymclftx.html