说明:
注释:
本文中出现的所有题目均来自于网络
本人只是对其进行解答和注释
所有题目均为个人解答方案,如有纰漏或更好的解答欢迎指正
如果有需要更详细解答的题目也可以留言
- 关于局部变量的初始化,下面正确的使用方式是:
A. var i int = 10
B. var i = 10
C. i := 10
D. i = 10
[答案]:ABC
[解析&扩展]:
这题类似于第一题,于全局变量不同的是,局部变量可以使用:=
自动推导的方式,而全局变量不可以,必须使用var关键字。因此ABC均正确。D既没有使用:=
自动推导类型,也没有使用var关键字声明。
- 关于 const 常量定义,下面正确的使用方式是:
A.
const Pi float64 = 3.14159265358979323846
const zero= 0.0
B.
const (
size int64= 1024
eof = -1
)
C.
const (
ERR_ELEM_EXISTerror = errors.New("element already exists")
ERR_ELEM_NT_EXISTerror = errors.New("element not exists")
)
D.
const u, vfloat32 = 0, 3
const a,b, c = 3, 4, "foo"
[答案]:ABD
[解析&扩展]:
A: 正常的常量申明,正确--const在声明并初始化的时候可以不需要指定数据类型,因此正确。
B: var和const都可以使用小括号来声明多个变量/常量,这样可以免去在每一个变量前面都需要使用关键字声明。因此B正确。
C:无法把一个错误信息转化为const,因此C错误。
D:const于var都可以使用平行赋值的方式初始化,因此D正确。
- 关于布尔变量 b 的赋值,下面错误的用法是:
A. b = true
B. b = 1
C. b = bool(1)
D. b = (1 == 2)
[答案]:BC
[解析&扩展]:
A,D是对布尔变量的赋值,因此正确。(判断两个数是否相等会产生一个布尔值)
B是无法将int转化为bool--golang不支持隐式转化。
C则是使用了go中不存在的语法,因此错误。
- 下面的程序可能的运行结果是:
func main() {
if true {
defer fmt.Printf("1")
} else {
defer fmt.Printf("2")
}
fmt.Printf("3")
}
A. 321
B. 32
C. 31
D. 13
[答案]:C
[解析&扩展]:
defer的执行机制是先进后出--即在代码中优先到达的defer语句,反而会后被执行。但是defer是在整个函数调用结束,之后才执行(但是会在return之前)所以:
main函数优先被执行完成,所以会输出3,由于if语句的判断条件恒为true,所以只有第一个defer语句会被执行,第二个并不会,所以会输出1,并且在main函数的输出语句之后,因此,会输出31。
PS: 这一类问题可以在编译器中加断点然后单步执行,查看程序执行顺序。
- 关于 switch 语句,下面说法正确的有:
A. 条件表达式必须为常量或者整数
B. 单个 case 中,可以出现多个结果选项
C. 需要用 break 来明确退出一个 case
D. 只有在 case 中明确添加 fallthrough 关键字,才会继续执行紧跟的下一个 case
[答案]:BD
[解析&扩展]:
A: 最简单的反驳,字符也是可以的,因此A错误。
B: 一个case可以有多个触发条件,避免了代码的冗余,因此B正确。
C: GO中每一个case执行完成之后会默认结束此case,并不用break,因此错误。
D: 每一个case执行结束后都会默认结束switch语句,除非有fallthrough关键字,才会接着执行后面的case,因此D正确。
- golang 中没有隐藏的 this 指针,这句话的含义是:
A. 方法施加的对象显式传递,没有被隐藏起来
B. golang 沿袭了传统面向对象编程中的诸多概念,比如继承、虚函数和构造函数
C. golang 的面向对象表达更直观,对于面向过程只是换了一种语法形式来表达
D. 方法施加的对象不需要非得是指针,也不用非得叫 this
[答案]:ACD
[解析&扩展]:
A:如java,C++会在类的内部实现中使用this关键字表示调用该方法的对象,但是在golang中方法有明确的接收者(写在func关键字和函数名之间),因此并不需要使用this关键字。所以A正确。
B: golang并没有提供继承,只是通过结构体嵌套变相的实现了继承,至于虚函数那是C++中的概念,golang中并未提及,因此B错误。
C:虽然golang是面向接口(interface)编程,但是也可以实现面向对象,因为结构体在golang中的灵活,所以也变得更加直观,因此C正确。
D: 非指针结构体也可以调用其方法,所以D正确。
- golang 中的引用类型包括:
A. 数组切片
B. map
C. channel
D. interface
[答案]:ABCD
[解析&扩展]:
就和人类包括日本人一样,没有理由,因为golagn在设计最初就是把他们设计成引用类型的。
- golang 中的指针运算包括:
A. 可以对指针进行自增或自减运算
B. 可以通过 & 取指针的地址
C. 可以通过 * 取指针指向的数据
D. 可以对指针进行下标运算
[答案]:BC
[解析&扩展]:
B,C是指针的两个操作方式,即取地址和解引用,因此正确。
A,D都是对指针的非法操作--可能导致内存泄漏。因此错误。
- 关于 main 函数(可执行程序的执行起点),下面说法正确的是:
A. main 函数不能带参数
B. main 函数不能定义返回值
C. main 函数所在的包必须为 main 包
D. main 函数中可以使用 flag 包来获取和解析命令行参数
[答案]:ABCD
[解析&扩展]:
同17,因为就是这样设计的,想要知道为什么,只有问golang最初的设计者。
- 下面赋值正确的是:
A. var x = nil
B. var x interface{} = nil
C. var x string = nil
D. var x error = nil
[答案]:BD
[解析&扩展]:
A: nil不能直接付给一个未初始化的变量,因此错误。
B:空接口可以接受任何参数,包括nil,因此正确。
C:同A。
D:error类型可以为nil--最常见的如各种函数的返回值中,第二个返回值往往就是bool或者error,在调用完之后需要判断error是否为nil。因此D正确。