一、 单选

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的值是多少(

A.22B.20C.56D.18

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. 以下属于线性表的是那些(

A. 数组B. 树C. 链表D. 图

三、 填空题

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包,代码实现,并且尽可能保证算法效率高效