科目二错题目录

Posted by xnchen on September 11, 2021

专业级新增

如下go程序的输出结果是()

func main() {
    var data *byte
    var in interface{}
    fmt.Println(data==nil)
    fmt.Println(in==nil)
    in = data
    fmt.Println(in==nil)
}

true true false

内嵌类型的同名方法,会优先调用哪个?

题库

【第3题】 下边常量名中,符合《华为Go语言通用编程规范》要求的是(B)

【分析】: golang常量命名规范,MixedCaps(首字母大写驼峰) 或 mixedCaps(首字母小写驼峰) 。 【考点】:3.2 通用规范理解与应用(Go) 【选项】: A. g_TotalNum B. TotalNum C. gTotalNum D. Total_Num

【第6题】 如下Go程序的输出结果是(D)

func main() {
    s := []int{1, 2}
    s2 := s
    s2 = append(s2, 3)
    sliceAddOne(s)
    sliceAddOne(s2)
    fmt.Println(s, s2)
}

func sliceAddOne(s []int) {
    s = append(s, 0)
    for i := range s {
        s[i]++
    }
}

【分析】: slice参数传递及扩容 【考点】:3.1 编程语言能力(Go) 【选项】: A. [1 2] [1 2 3] B. [2 3 1] [2 3 4 1] C. [2 3] [2 3 4] D. [1 2] [2 3 4]

【第7题】 如下关于Go语言测试覆盖率的描述中,错误的是(B)

【分析】: 测试覆盖率的使用,B选项只能输出覆盖率的总体情况信息 【考点】:3.1 编程语言能力(Go) 【选项】: A. 覆盖率的统计模式有set,count,atomic三种 B. go tool cover -func=coverage.data能输出函数中每个语句的测试覆盖情况 C. 可以先在go test中增加-coverprofile选项输出coverage profile,再使用go tool cover工具分析具体每个函数的覆盖率 D. 在go test中打开-cover, -covermode, -coverpkg, -coverprofile中的任一选项,就可打开测试覆盖率功能

【第21题】 下面关于Go语言map的说法,符合《华为Go语言安全编程规范》的是(C)

【分析】: None 【考点】:3.3 安全规范理解与应用(Go) 【选项】: A. 并发写需要用锁,并发读不需要用锁 B. map并发访问导致的错误不影响程序运行,可以直接忽略 C. 包内使用的map变量,如果只在init函数中修改,那么包内其他地方的读不需要用锁 D. 访问是并发安全的

【第27题】 下面程序中能够确定地输出”Go Goroutine!”的是(D)

【分析】: time.Sleep()暂停goroutine,runtime.Gosched()可以让其他goroutine有机会被执行,当前Goroutine仍有可能会继续执行,在main函数返回前,新的goroutine可能没有机会执行。 runtime.Goexit()会终止当前的goroutine但不影响其他goroutine,直到在所有其他goroutine退出后,程序才异常退出。 【考点】:3.1 编程语言能力(Go) 【选项】: A.

func main() {
    go func() {
        fmt.Println("Go Goroutine!")
    }()
    runtime.Gosched()
}

B.

func main() {
    go func() {
        fmt.Println("Go Goroutine!")
    }()
}

C.

func main() {
    go func() {
        fmt.Println("Go Goroutine!")
    }()

    time.Sleep(time.Microsecond)
}

D.

func main() {
    go func() {
        fmt.Println("Go Goroutine!")
    }()
    runtime.Goexit()
}

【第35题】 关于可变参数的使用,下列Go语言代码的输出是(B)

func main() {
    var a = []interface{}{123, "abc"} // interface{}是类型

    Print(a...)
    Print(a)
}

func Print(a ...interface{}) {
    fmt.Println(a...)
}

【分析】: 对于interface{}类型变长参数的解包。参数后面跟着 “…” 意味着解包,因此fmt.Println打印时候会按照两个不同的参数分别打印。不加上 ”…“ 则参数作为一个单一的slice传入,fmt.Println按照slice打印。 【考点】:3.1 编程语言能力(Go) 【选项】: A.

[123 abc]
[123 abc]

B.

123 abc
[123 abc]

C.

123 abc
123 abc

D.

[123 abc]
123 abc

【第38题】 对于下面Go语言程序的输出,描述正确的是(A)

func main() {
    tagsViews := map[string]int{
        "unix":   0,
        "python": 1,
        "go":     2,
        "golang": 3,
        "devops": 4,
        "gc":     5,
    }
    for key, views := range tagsViews {
        fmt.Println("There are", views, "views for", key)
    }
}

【分析】: map类型的遍历是随机的。 【考点】:3.1 编程语言能力(Go) 【选项】: A. 输出的顺序随机排列 B. 输出会根据map的value进行排序 C. 输出会根据map的key进行排序 D. 输出的顺序取决于在代码中添加的先后顺序

【第41题】 有关Go语言常用的格式化输出,描述错误的是(C)

【分析】: 输出类型的是%T,小写的%t输出true/false。 【考点】:3.1 编程语言能力(Go) 【选项】: A. %#v 打印结构体时候可以带着结构体定义,如果结构体实现了GoStringer接口,则会调用该接口。 B. %+v 打印结构体时,可以带上属性名称,更易读。 C. %t 可以输出一个值的类型 D. %v 可以按照一个值的默认打印形式输出

【第42题】 关于Go语言互斥锁,下面说法错误的有(B)

【分析】: 不能直接传递互斥锁 【考点】:3.1 编程语言能力(Go) 【选项】: A. 不要忘记解锁互斥锁,必要时使用defer语句。 B. 在多个函数之间将互斥锁作为参数传递时,可以使用指针,也可以使用值。 C. 不要重复锁定互斥锁。 D. 不要对尚未锁定或者已解锁的互斥锁解锁。

【第43题】 关于Go的os包中的文件访问模式,下面说法错误的是(B)

【分析】: 选项B:由于历史原因,O_RDONLY | O_WRONLY 并非等于 O_RDWR,它们的值一般是 0、1、2。 【考点】:3.1 编程语言能力(Go) 【选项】: A. O_TRUNC:如果可能,打开时清空文件。 B. 可以使用O_RDONLY|O_WRONLY 替换O_RDWR C. O_CREATE:如果不存在将创建一个新文件。 D. O_APPEND:写操作时将数据附加到文件尾部。

【第44题】 关于Go语言 net.Dial的使用,下面错误的是( B)

【分析】: For TCP and UDP networks, the address has the form “host:port”.
【考点】:3.1 编程语言能力(Go) 【选项】: A. net.Dial("tcp", "10.1.1.78:80") B. net.Dial("tcp", "https://www.baidu.com") C. net.Dial("udp", "[fe80::db8]:53") D. net.Dial("tcp", "google.com:http")

【第51题】 关于静态代码分析工具的技术,下面描述正确的是(AD)

【分析】: 静态代码分析工具基本原理 【考点】:3.3 安全规范理解与应用(Go) 【选项】: A. 控制流分析对表达式或变量的取值范围不敏感。 B. 污点分析无需定义外部输入函数。 C. 控制流可以用于发现内存双重释放问题。 D. 污点分析可用来发现注入类的漏洞。

【第54题】 对于在两个包之间进行结构体类型的代码拷贝,符合Go语言官方《Go Code Review Comments》说法是(BD)

【分析】: “CodeReviewComments”:Copying 【考点】:3.2 通用规范理解与应用(Go) 【选项】: A. 从另一个包复制结构体定义的风险在于可能出现结构体类型重名。 B. 从另一个包复制结构体定义的风险在于其字段类型可能为别名,与当前包的类型体系冲突。 C. 对于导出的结构体,可直接拷贝结构体定义及其方法实现。 D. 对于非导出的结构体,可直接拷贝结构体定义及其方法实现。

【第55题】 关于Go语言的接口,下列说法符合Go语言惯例的是(AC)

【分析】: CodeReviewComments,effective go中关于接口的建议 【考点】:3.2 通用规范理解与应用(Go) 【选项】: A. 应该从使用者的角度定义接口 B. 在没有使用者之前不要定义接口:如果没有实际的使用者,就很难看到接口是否是必要的。 C. 对于功能模块抽象模块接口,通过interface提供对外功能。 D. 应该从实现者的角度定义接口

【第57题】 有关go指针和c指针之间的传递,下列说法正确的是()

【分析】: None 【考点】:3.1 编程语言能力(Go) 【选项】: A. C代码中可以针对传入的go指针进行任意的操作运算 B. go指针是指向Go代码分配的内存的指针,c指针是指向C代码分配的内存的指针 C. cgo指针传递规则在运行时检查,可以通过GODEBUG=cgocheck=0关闭 D. 可以将go指针传递到C代码中,前提是它所指向的内存不包含任何其他go指针

【第58题】 关于使用cgo的优缺点,下面说法正确的是(ABDEF)

【分析】: 基本上go开发中,能不用cgo就不用。除非需要的功能只有c实现而且重构代价很高,才选择使用。 【考点】:3.1 编程语言能力(Go) 【选项】: A. 使用cgo会使得编译构建变得复杂,尤其在涉及交叉编译的时候 B. cgo往往使得构建出的可执行程序包含动态链接库,增加了部署难度 C. c语言运行效率要高于go语言,因此能用cgo就尽量使用cgo D. 代码中使用cgo会导致go语言的构建速度变慢 E. cgo使得go程序的内存管理变得复杂而且不安全 F. go所提供的一系列工具,例如race decector, pprof等,无法检查cgo代码

关于go vender,下面说明错误的是(C)

【分析】:go vender无法精确的引用外部包进行版本控制,不能指定引用某个特定版本的外部包;只是在开发时,将其拷贝过来,但是一旦外部包升级,vendor下的代码不会跟着升级, 而且vendor下面并没有元文件记录引用包的版本信息,这个引用外部包升级产生很大的问题,无法评估升级带来的风险;

将源码拷贝到当前工程的vendor目录下,这样打包当前的工程代码到任意机器的$GOPATH/src下都可以通过编译,避免项目代码外部依赖过多,或迁移后需要多次go get 外包依赖包;而且通过go get 重新拉去的外部依赖包的版本可能和工程开发时使用的不一致,导致编译错误问题。

A go vendor的基本思路是将引用的外部包的源码放在当前工程的vendor目录下 B 编译go代码会优先从vendor目录先寻找依赖包 C 可以指定引用某个特定版本的外部包 D 有了vendor目录后,大包当前的工程代码到其他机器的GOPATH/src下也可以通过编译

Go 1.12版本可以不能发布golang源码,可以发布Binary Only (BCD)

1.只发布静态库 2.发布STUB发件, 3.发布STUB发件, 4.编译器版本一致

go程序异常设计符合正确的是

【分析】:尝试恢复合理处理

1.异常,直接panic 2.异常后尝试恢复 3.全异常,简化逻辑 4,第三方不处理异常,直接返回上层调用者

链接:https://www.nowcoder.com/questionTerminal/05031b1c496b4ff79bf85eed75f7ae25 来源:牛客网

关于Go变量的使用,以下代码编译错误的是哪个?(B)

【分析】:f作用域只在if里

  • var b,f,s=true, 2.3, "four" fmt.Printf("%v, %v, %v\n", b, f, s)
    
  • if f, err := os.Open("test.png"); err != nil {     return } f.Close()
    
  • func delta(old, new int) int { return new - old }
    
  • medals := []string{"gold", "sliver", "bronze"} fmt.Printf("nedals: %v\n", medals)
    

go语言环境安装正确的是(CD):

1.环境变量仅配置GOPATH变量 // 还需要GOROOT 2.除安装go编译器外,必须安装gotest工具链 // gotest在go中自带 3.除安装go编译器外,还必须设置环境变量以及创建工具空间 // 工具空间即workspace,GOPATH的值 4.go编译器安装采用源码编译包或者二进制包

检测go语言程序中数据竞争

go run -race

如果要观测gc相关的信息,下面()可以收集相关信息(ACD)

【分析】:Stack函数用于查看运行时的调用栈

go tool trace可以将GC统计信息以可视化的方式展现出来。

img

image-20210914120033415

在目录/opt/png中存放了png.h和libpng.so两个文件,现在要在go代码中调用动态库libpng.so中的函数,下面正确的调用方式是(D)

image-20210914154840227

垃圾回收结束后,标记情况正确的是(B)

image-20210914160503852

有序的双向链表,存储一个支持增删改三个功能的键值系统,这三个功能中有几个功能能做到时间复杂度为O(1) ?

【解析】:有序,所以增删改都需要找位置,所以是O(n),故有0个功能

以下关于开源软件patch管理说法不正确的是(B)

华为修改开源软件的patch代码量,必须严格控制修改代码,建议不超过5%

开源社区发布的补丁要和自研修补的补丁做成一个patch,进行统一管理

基于开源软件修改自研,patch中可以包含开源权利人声明

原则上为区分次言和开源代码,确保使用和修改可追溯,开源修改的patch文件,需要独立存放管理

下面正确地描述了SaaS和SOA的是(D)

【解析】:SaaS:Software as a Service,“按需即用软件”(即“一经要求,即可使用”),是一种软件交付模式。在这种交付模式中,软件仅需通过网络,不须经过传统的安裝步骤即可使用,软件及其相关的数据集中托管于云端服务。

SOA:Service-Oriented Architecture,面向服务的架构。

A. SaaS和SOA本质都是基于服务的思想,只是说法不同

B. SaaS必须以SOA技术为基础

C. SaaS环境下考虑可伸缩模型时,我们一般采用增强扩展,SOA技术能很好地支持增强扩展

D. SaaS是向用户交付应用功能的方法,而SOA是应用系统的一种设计技术

关于开源软件生命周期管理原则如下,选项描述正确的是(C)

【解析】:EOM(end of marketing)产品生命周期

原则上,开源软件的生命周期信息不向客户、渠道和合作伙伴发布。原则上,开源软件的生命周期信息不向客户、渠道和合作伙伴发布。

原则上需保证同一时间同一个开源软件只有一个可配套版本,最多2个可配套版本。

a原则上开源软件的生命周期,应该向客户渠道和合作伙伴发布

b同一时间,同一个开源软件,尽可能提供多个可配套产品选型使用的版本

c产品选择配套的开源软件版本,eom时间不早于产品软件版本的tr 5过点时间

d产品只应关注直接选用的开源软件,对于产品配套的平台中使用的开源软件,不需要关注,由平台的开发团队负责开源软件生命周期配套和归一化

关于开源软件使用下列说法错误的是(ABC)

a产品A自研开发且对外开源xxcomb软件,并捐献到apache基金会,成为项目顶级项目产品币使用社区xxcomn应认定xxcomb软件为自研软件

b某产品开发一款仅给内部一线行销员工使用的APP,并上架华为手机应用市场开放下载(但必须华为员工账号产能登录使用),该AAPP通过静态编译方式使用了一款AGPL开源软件,由于只是内部一线行销员工才能登录使用,可以不需要履行开源义务

c某员工在业余时间以个人名义在github开源了x项目,该员工在公司办公环境下载该x项目代码集成产品a中使用,产品a不需要履行开源义务

d公有云服务产品a通过静态链接的方式集成使用了license为GPL v2.0的开源软件服务产品a可以不履行代码开源义务

image-20210914165228924