本教材由知了传课辛苦制作而成,仅供学习使用,请勿用于商业用途!如进行转载请务必注明出处!谢谢!

一、选择题

1.下面属于关键字的是

A.def B.Class C.func D.struct E.var

答案:C、D、E

关键字有如下25个

2.定义全局变量,正确的做法是?

A.var Name string B.Name := "hallen" C.var Name string = "hallen"
D.var Name = "hallen" E.var Name string := "hallen"

答案:A、C、D

3.关于局部变量的初始化,下面正确的使用方式是?

A. var i int = 10
B. var i = 10
C. i := 10
D. i = 10

参考答案:ABC

4.对于以下的代码,获取成员变量正确的做法是?

type Student struct {
Name string
}

func main() {
var student *Student
student = new(Student)
*student = Student{Name:"hallen"}
}

A.student.Name B.(*student).Name C.(&student.Name) D.*student.Name

答案:A、B

5.字符串拼接正确的是?

A."hello"+"hallen" B."hello"+'h' C."hello'+"hallen"
D.fmt.Printf("%s%s","hello","hallen") E.fmt.Sprintf("%s%s","hello","hallen")

答案:A、E

6.已申明的bool类型变量ok,关于其赋值,下面说法错误的是()

var ok bool
A. ok = true
B. ok = 1
C. ok = bool(1)
D. ok = (1 == 2)

参考答案:BC

8.关于switch语句,下面说法正确的是()

A. 条件表达式必须为常量或者整数
B. 单个case中,可以出现多个结果选项
C. 需要用break来明确退出一个case
D. 只有在case中明确添加fallthrough关键字,才会继续执行紧跟的下一个case

参考答案:BD

9.golang中的引用类型包括()

A. 数组
B. map
C. channel
D. interface
E.数组切片

参考答案:BCDE

10.golang中的指针运算包括()

A. 可以对指针进行自增或自减运算
B. 可以通过“&”取指针的地址
C. 可以通过“*”取指针指向的数据
D. 可以对指针进行下标运算

参考答案:BC

11.关于整型切片的初始化,下面正确的是()

A. s := make([]int)
B. s := make([]int, 0)
C. s := make([]int, 5, 10)
D. s := []int{1, 2, 3, 4, 5}

参考答案:BCD

12.ok是bool型变量,下面if表达式符合编码规范的是()

A. if ok == 1{}
B. if ok{}
C. if ok == false{}
D. if !ok{}

参考答案:BD

13.value是整型变量,下面if表达式符合编码规范的是()

A. if value == 0 {}
B. if value {}
C. if value != 0{}
D. if !value{}

参考答案:AC

14.关于map,下面说法正确的是()

A. map反序列化时json.marshal的入参必须为map的地址
B. 在函数调用中传递map,则子函数中对map元素的增加不会导致父函数中map的修改
C. 在函数调用中传递map,则子函数中对map元素的修改不会导致父函数中map的修改
D. 不能使用内置函数delete删除map的元素

参考答案:A

15.下面赋值正确的是()

A. var x = nil
B. var x interface{} = nil
C. var x string = nil
D. var x error = nil

答案:BD,nil 只能赋值给指针

16.下面代码的结果为?

str := "hallen"
str[0] = 'z'
fmt.Println(str)

A.hallen B.zallen c.compilation error

答案:c,Go 语言中的字符串是只读的,不能进行修改

二、简答题

1.简述数组和切片的区别;程序中什么场景使用数组,什么场景使用切片?

类型区分:数组是值类型,切片是引用
可变性:数组长度不可变,切片长度可变,

数组:已知的长度
切片:一般在参长度可变,未知的长度

2.Go语言局部变量分配在栈还是堆?

Go语言编译器会自动决定把一个变量放在栈还是放在堆,
当发现变量的作用域没有跑出函数范围,就可以在栈上,反之则必须分配在堆。

3.int和uint的区别?两个uint值能不能直接相减?

int是正数和负数都可以
uint不能是负数

uint不能直接相减,如果结果是负数会变成一个很大的uint

4.提示:slice底层是数组,保存了len,capacity和对数组的引用

5.下面代码输出结果为?

func main() {
slice := make([]int, 3)
slice = append(slice , 9, 8, 7)
fmt.Println(slice )
}

答案:[0 0 0 9 8 7]

6.下面代码的区别?那个为nil?

var slice1 []int
var slice2 = []int{} // var slice2 []int = []int{}

答案:s1为nil切片,和nil相等,s2为空切片,和nil不相等

7.分别写出下面代码的执行结果

func Get() (int,int){
return 3,4
}


func main() {
var a int
a,_ = Get() // 结果为a=3
a,_ := Get() // 报错,a已申明,不需要自动推导
a,b := Get() // a=3,b=4
a,b = Get() // 报错,b没有申明
fmt.Println(a)

}

8.go语言中指针运算有哪些?

可以通过“&”取指针的地址

可以通过“*”取指针指向的数据

9.说说各种类型的缺省值?

指针的缺省值是nil,其他的都是对应类型的零值,bool类型的缺省值是false

10.map如何顺序读取?

map不能顺序读取,是因为他是无序的,
想要有序读取,
首先的解决的问题就是,把key变为有序,所以可以把key放入切片,对切片进行排序,遍历切片,通过key取值。


map_data1 := map[string]interface{}{
"name":"hallen",
"age":18,
}

keys := []string{}
for k,_ := range map_data1 {
keys = append(keys,k)
}


sort.Strings(keys)

for _,v := range keys {
fmt.Println(map_data1[v])
}

11.字符串打印时,%v 和 %+v 的区别

“%+v”会以字段键值对的形式key-value格式打印,“%v”只会打印字段值value信息

1472人已阅读,今天你学习了吗?

添加新回复