一、 单选
1. 关于类型转换,下面语法正确的是( )
A.type MyInt iint var i int = 1var j MyInt = IB.type MyInt intvar i int= 1var j MyInt = (MyInt)iC.type MyInt intvar i int= 1var j MyInt = MyInt(i)D.type MyInt intvar i int= 1var j MyInt = i.(MyInt) |
2. 阅读以下代码,写出输出结果( )
func main(){ var a int =10 fmt.Println(a) { a:=9 fmt.Println(a) a=8 } fmt.Println(a)}A. 10 10 10B. 10 9 9C. 10 9 10 D. 10 9 8 |
3. 下面的程序的运行结果是( )
func main() { if (true) { defer fmt.Printf("1") } else { defer fmt.Printf("2") } fmt.Printf("3")}A. 321B. 32C. 31D. 13 |
4. (1+6)/2*4^2+10%3<<3的值是多少( )
5. 关于函数声明,下面语法错误的是( )
A. func f(a, b int) (value int, err error)B. func f(a int, b int) (value int, err error)C. func f(a, b int) (value int, error)D. func f(a int, b int) (int, int, error) |
6. 关于无缓冲和有冲突的channel,下面说法正确的是( )
A. 无缓冲的channel是默认的缓冲为1的channelB. 无缓冲的channel和有缓冲的channel都是同步的C. 无缓冲的channel和有缓冲的channel都是非同步的D. 无缓冲的channel是同步的,而有缓冲的channel是非同步的 |
7. 以下代码,最终输出的结果是什么( )
type student struct { Name string Age int} func main() { m := make(map[string]*student) stus := []student{ {Name: "zhou", Age: 24}, {Name: "li", Age: 23}, {Name: "wang", Age: 22}, } for _, stu := range stus { m[stu.Name] = &stu } for _, v := range m { fmt.Println(v.Name, " ", v.Age) }} A.Zhou 24Li 23wang 22 B.wang 22wang 22wang 22 C.Zhou 24Zhou 24Zhou 24 D.wang 22Li 23Li 23 |
二、 多选
1. 下面属于go语言关键字的是( )
A. funcB. defC. structD. class |
2. 定义一个包内全局字符串变量,下面语法正确的是( )
A. var str stringB. str := ""C. str = ""D. var str = "" |
3. 通过指针变量 p 访问其成员变量 name,下面语法正确的是( )
A. p.nameB. (*p).nameC. (&p).nameD. p->name |
4. 关于接口和类的说法,下面说法正确的是( )
A. 一个类只需要实现了接口要求的所有函数,我们就说这个类实现了该接口B. 实现类时只需要关心自己应该实现哪些方法即可C. 类实现接口时,需要导入接口所在的包D. 接口由使用方按自身需求来定义,使用方无需关心接口具体如何实现的 |
5. 关于字符串连接,下面语法正确的是( )
A. str := 'abc' + '123'B. str := "abc" + "123"C. str := '123' + "abc"D. fmt.Sprintf("abc%d", 123) |
6. 关于协程,下面说法正确是( )
A. 协程和线程都可以实现程序的并发执行B. 线程比协程更轻量级C. 协程不存在死锁问题D. 通过channel来进行协程间的通信 |
7. 关于init函数,下面说法正确的是( )
A. 一个包中,可以包含多个init函数B. 程序编译时,先执行导入包的init函数,再执行本包内的init函数C. main包中,不能有init函数D. init函数可以被其他函数调用 |
8. 关于循环语句,下面说法正确的有( )
A. 循环语句既支持for关键字,也支持while和do-whileB. 关键字for的基本使用方法与C/C++中没有任何差异C. for循环支持continue和break来控制循环,但是它提供了一个更高级的label,可以选择中断哪一个循环D. for循环不支持以逗号为间隔的多个赋值语句 |
9. 对于变量声明下面那些是错误的( )
A.var 2abc stringB.姓名:= "小明"C.var a$b int =123 D.var func int |
10. 关于局部变量的初始化,下面正确的使用方式是( )
A. var i int = 10B. var i = 10C. i := 10D. i = 10 |
11. 对add函数调用正确的是( )
func add(args ...int) int { sum :=0 for _,arg := range args { sum += arg } return sum} A. add(1, 2)B. add(1, 3, 7)C. add([]int{1, 2})D. add([]int{1, 3, 7}...) |
12. 关于switch语句,下面说法正确的有( )
A. 条件表达式必须为常量或者整数B. switch中,可以出现多个条件相同的caseC. 需要用break来明确退出一个caseD. 只有在case中明确添加fallthrough关键字,才会继续执行紧跟的下一个case |
13. golang中的引用类型包括( )
A.切片B. mapC. channelD. interface |
14. golang中的指针运算包括( )
A. 可以对指针进行自增或自减运算B. 可以通过“&”取指针的地址C. 可以通过“*”取指针指向的数据D. 可以对指针进行下标运算 |
15. 关于main函数,下面说法正确的是( )
A. main函数不能带参数B. main函数不能定义返回值C. main函数所在的包必须为main包才能作为函数入口D. main函数中可以使用flag包来获取和解析命令行参数 |
16. 下面赋值正确的是( )
A. var x = nilB. var x interface{} = nilC. var x string = nilD. var x error = nil |
17. 关于整型切片的初始化,下面正确的是( )
A. s := make([]int)B. s := make([]int, 0)C. s := make([]int, 5, 10)D. s := []int{1, 2, 3, 4, 5,} |
18. 以下不能正确定义数组和赋初值的语句是( )
A. var a=[5]int(1,2,3,4,5)B. var b=[...]int{1,2,3,4,5}C. var c[5]int={1,2,3,4,5}D. var d=[5]int{2: 4,4:61} |
19. 对于局部变量整型切片x的赋值,下面定义正确的是( )
A.x := []int{1, 2, 3,4, 5, 6,} B.x :=[]int{1, 2, 3,4, 5, 6} C.x :=[]int{1, 2, 3,4, 5, 6} D.x :=[]int{1, 2, 3, 4, 5, 6,} |
20. 关于变量的自增和自减操作,下面语句正确的是( )
A.i := 1i++ B.i := 1j = i++ C.i := 1++i D.i := 1i-- |
21. 关于GetPodAction定义,下面赋值正确的是( )
type Fragment interface {Exec(transInfo *TransInfo) error} type GetPodAction struct {} func (g GetPodAction) Exec(transInfo*TransInfo) error { ...return nil} A. var fragment Fragment = new(GetPodAction)B. var fragment Fragment = GetPodActionC. var fragment Fragment = &GetPodAction{}D. var fragment Fragment = GetPodAction{} |
22. 关于接口,下面说法正确的是( )
A. 只要两个接口拥有相同的方法列表,那么它们就是等价的,可以相互赋值B. 如果接口A的方法列表是接口B的方法列表的子集,那么接口B可以赋值给接口AC. 接口不可以继承D. 接口可以继承 |
23. 关于channel,下面语法正确的是( )
A. var ch chan intB. ch := make(chan int)C. <- chD. ch <- |
24. 关于同步锁,下面说法正确的是( )
A. 当一个goroutine获得了Mutex后,其他goroutine就只能乖乖的等待,除非该goroutine释放这个MutexB. RWMutex在读锁占用的情况下,会阻止写,但不阻止读C. RWMutex在写锁占用情况下,会阻止任何其他goroutine(无论读和写)进来,整个锁相当于由该goroutine独占D. Lock()操作需要保证有Unlock()或RUnlock()调用与之对应,否则编译错误 |
25. golang中大多数数据类型都可以转化为有效的JSON文本,下面哪种类型除外( )
A. 指针B. channelC. mapD. 函数 |
26. flag是bool型变量,下面if表达式符合编码规范的( )
A. if flag == 1B. if flagC. if flag == falseD. if !flag |
27. value是整型变量,下面if表达式符合编码规范的是( )
A. if value == 0B. if valueC. if value != 0D. if !value |
28. 关于函数返回值的错误设计,下面说法正确的是( )
A. 如果失败原因只有一个,则返回boolB. 如果失败原因超过一个,则返回errorC. 如果没有失败原因,则不返回bool或errorD. 如果重试几次可以避免失败,则不要立即返回bool或error |
29. 关于slice或map操作,下面正确的是( )
A.var s []ints[0] = 6 B.var m map[string]intm["one"]= 1 C.var s []ints =make([]int, 0)s =append(s,1) D.var m map[string]intm =make(map[string]int)m["one"]= 1 |
30. 关于channel的特性,下面说法正确的是( )
A. 给一个 nil channel 发送数据,造成永远阻塞B. 从一个 nil channel 接收数据,造成永远阻塞C. 给一个已经关闭的 channel 发送数据,引起 panicD. 从一个已经关闭的 channel 接收数据,如果缓冲区中为空,则返回一个零值 |
31. 下面会触发异常的是( )
A. 判断空指针是否为nilB. 下标越界C. 除数为0D. 调用panic函数 |
32. 关于cap函数的适用类型,下面说法正确的是( )
A. arrayB. sliceC. mapD. channel |
33. 关于select机制,下面说法正确的是( )
A. select机制用来处理异步IO问题B. select机制最大的一条限制就是每个case语句里必须是一个IO操作C. golang在语言级别支持select关键字D. select块中有case子句,没有default子句 |
34. 以下哪些类型可以使用make分配内存( )
A.SliceB.Map C.chanD.Struct |
35. 以下属于线性表的是那些( )
三、 填空题
1. 声明一个key为字符串型value为整型的map变量m( )
2. 声明一个参数和返回值均为整型的函数变量f( )
3. 声明一个只用于读取int数据的单向channel变量ch( )
4. 假设源文件的命名为slice.go,则测试文件的命名为( )
5. go test要求测试函数的前缀必须命名为( )
6. 下面的程序的运行结果是( )
for i := 0; i < 5; i++ { defer fmt.Printf("%d ", i)} |
7. 下面的程序的运行结果是( )
func main() { x := []string{"a", "b","c"} for v := range x { fmt.Print(v) }} |
8. 下面的程序的运行结果是( )
func main() { i := 1 j := 2 i, j = j, i fmt.Printf("%d%d\n", i, j)} |
9. 下面的程序的运行结果是( )
type Slice []int func NewSlice() Slice { return make(Slice, 0)} func (s Slice) Add(elem int) *Slice { s = append(s, elem) fmt.Print(elem) return &s} func main() { s := NewSlice() defer s.Add(1).Add(2) s.Add(3)} |
四、 判断题
1. interface是一个值类型( )
2. 使用map不需要引入任何库( )
3. map的遍历是有序的( )
4. 指针是基本类型( )
5. interface{}是可以指向任意对象的类型( )
6. Golang不支持自动垃圾回收( )
7. Golang支持反射,反射最常见的使用场景是做对象的序列化( )
8. 下面代码中两个斜点之间的代码,比如json:"x",作用是X字段在从结构体实例编码到JSON数据格式的时候,使用x作为名字,这可以看作是一种重命名的方式( )
type Position struct { X int `json:"x"` Y int `json:"y"` Z int `json:"z"`} |
9. Go通过成员变量或函数首字母的大小写来决定其作用域( )
10. 下面的程序的运行结果是xello( )
func main() { str := "hello" str[0] = ‘x‘ fmt.Println(str)} |
11. 匿名函数可以直接赋值给一个变量或者直接执行( )
12. 如果调用方调用了一个具有多返回值的方法,但是却不想关心其中的某个返回值,可以简单地用一个下划线“_”来跳过这个返回值,该下划线对应的变量叫匿名变量( )
13. 错误是业务过程的一部分,而异常不是( )
14. panic 比defer执行的优先级高( )
五、 简答题
1. cap()和len()函数的区别是什么?
2. 如何将[]byte和[]rune类型的值转换为字符串?
3. 简述go语⾔中make和new的区别。
4. 简述闭包的⽣命周期和作⽤范围。
5. 测试⽂件必须以什么结尾?功能测试函数必须以什么开头?压⼒测试函数必须以什么开头?
六、 编程题
1. 写一个函数判断一个字符串是否是回文(上海自来水来自海上),要求不借助额外临时变量
2. 编程实现:使用2个协程交替执行,使其能顺序输出1-20的自然数,一个子协程输出奇数,另一个输出偶数
3. 如果a+b+c=1000,且a*a+b*b=c*c(a,b,c为自然数),如何求出所有a,b,c可能的组合?不使用数学公式和math包,代码实现,并且尽可能保证算法效率高效