原创Go语⾔题⽬(基础)
题⽬内容来源于Go语⾔的经典书籍《GO编程语⾔》
题⽬
选择题
1. 下列说法错误的是:
A. main包定义了⼀个独⽴可执⾏的⼆进制程序,以main函数作为程序执⾏的⼊⼝。B. 没有导⼊需要的包或者导⼊了不需要的包都会导致编译失败。
C. 不可以在语句或者声明的末尾添加分号,因为编译器会主动将⼀些换⾏符转换为分号。D. 左⼤括号必须在上⼀条语句的⾏末,不可以另起⼀⾏。
2. 下列说法错误的是:
A. Go语⾔可以有多返回值的函数,在获取返回值的时候要全部取得。
B. Go语⾔不能有未使⽤的局部变量和全局变量,这将导致编译错误,但是可以⽤空标识符获得不需要的值从⽽丢弃。C. 函数的形参和有名的返回值都是函数最外层的局部变量。D. 函数内对引⽤类型的形参进⾏修改会影响到实参
3. 下列关于map说法错误的是:
A. map是键值对的集合,可以提供常数时间的存取操作 B. 键可以是任意类型 C. 值可以是任意类型
D. 如果map中没有⼀个键k1,那么取k1对应的值,其值为对应类型的零值4. 下列关于switch控制流错误的是:A. switch不可以紧跟语句或者函数调⽤
B. 不需要在每⼀个case后写break,默认执⾏完case后的语句会⾃动退出。C. switch可以不带操作对象,即不使⽤⽐较的表达式
D. 可以使⽤fallthrough在执⾏完case后的逻辑语句后继续后⾯的case5. 下列关于变量和指针错误的是:
A. ⼀个变量对应⼀个对应类型值的内存空间。B. ⼀个指针的值是另⼀个变量的地址。
C. 结构体的每个字段都是对应的⼀个变量,都可以被取地址 D. 每⼀个值都会有⼀个内存地址
简答题
1. 单个变量声明语法都有哪些?分别是怎样的赋值或者类型的策略。
2. 以表达式new(T)解释⼀下new函数的使⽤。与之对应的普通变量声明语句怎么表达?
分析题
1. 分析下⾯函数的算法
func (x, y int) int { for y != 0 {
x, y = y, x%y }
return x }
2. 对于⼀个字符串s := \"hello, world\"以下打印输出分别是什么,为什么?
对于⼀个字符串s := \"hello, world\"以下打印输出分别是什么,为什么? fmt.Println(s[len(s)]) fmt.Println(s[0:5])fmt.Println(s[:5])fmt.Println(s[7:]) fmt.Println(s[:])
编程题
1. 斐波那契第n个数的函数
答案
选择题
1. 下列说法错误的是: C
A. main包定义了⼀个独⽴可执⾏的⼆进制程序,以main函数作为程序执⾏的⼊⼝。B. 没有导⼊需要的包或者导⼊了不需要的包都会导致编译失败。
C. 不可以在语句或者声明的末尾添加分号,因为编译器会主动将⼀些换⾏符转换为分号。D. 左⼤括号必须在上⼀条语句的⾏末,不可以另起⼀⾏。 解析:
Go语⾔不需要在末尾添加分号,但是添加分号也不影响使⽤,编译器会主动将特定符号后的换⾏符转换为分号。和C语⾔⼀样,分号后⾯的内容不会处理,所以多余的分号不会影响编译。
2. 下列说法错误的是:B
A. Go语⾔可以有多返回值的函数,在获取返回值的时候要全部取得。
B. Go语⾔不能有未使⽤的局部变量和全局变量,这将导致编译错误,但是可以⽤空标识符获得不需要的值从⽽丢弃。C. 函数的形参和有名的返回值都是函数最外层的局部变量。D. 函数内对引⽤类型的形参进⾏修改会影响到实参 解析:
Go语⾔不能有未使⽤的局部变量,但是未使⽤的全局变量和未使⽤的函数的参数是允许的。
3. 下列关于map说法错误的是:C
A. map是键值对的集合,可以提供常数时间的存取操作 B. 键可以是任意类型 C. 值可以是任意类型
D. 如果map中没有⼀个键k1,那么取k1对应的值,其值为对应类型的零值解析:
map的键可以是任何可以⽤==进⾏⽐较的类型,最常见的例⼦是字符串。可以简单的理解map是使⽤==进⾏⽐较键,进⽽使⽤映射取出值。
4. 下列关于switch控制流错误的是:AA. switch不可以紧跟语句或者函数调⽤
B. 不需要在每⼀个case后写break,默认执⾏完case后的语句会⾃动退出。C. switch可以不带操作对象,即不使⽤⽐较的表达式
D. 可以使⽤fallthrough在执⾏完case后的逻辑语句后继续后⾯的case解析:
for和if控制语句⼀样,switch也可以紧跟⼀个简短的变量声明,⼀个⾃增表达式、赋值语句,或者⼀个函数调⽤。switch不带操作对象时默认⽤true值代替,然 后将每个case的表达式和true值进⾏⽐较
5. 下列关于变量和指针错误的是:D
A. ⼀个变量对应⼀个对应类型值的内存空间。B. ⼀个指针的值是另⼀个变量的地址。
C. 结构体的每个字段都是对应的⼀个变量,都可以被取地址 D. 每⼀个值都会有⼀个内存地址解析:
对于聚合类型每个成员——⽐如结构体的每个字段、或者是数组的每个元素——也都是对应 ⼀个变量,因此可以被取地址。并不是每⼀个 值都会有⼀个内存地址,但是对于每⼀个变量必然有对应的内存地址。
简答题
1. 单个变量声明语法都有哪些?分别是怎样的赋值或者类型的策略。答案:
var a int = 1var a int a := 1
如果省略的是类型信息,那么将根据初始化表达式来推导变量的类型信息。如果初始化表达式被省略,那么将⽤零值初始化该变量。
2. 以表达式new(T)解释⼀下new函数的使⽤。与之对应的普通变量声明语句怎么表达?答案:
表达式new(T)将创建⼀个T类型的匿名变量,初始化为T类型的零值,然后返回变量地址,返回的指针类型为 *T 。与a := new(T)相同⾏为的语句var dummy Ta := &dummy
分析题
1. 分析下⾯函数的算法
func (x, y int) int { for y != 0 {
x, y = y, x%y }
return x }
答案:
计算x, y两个数的最⼤公约数的函数(greatest common divisor, GCD)。
x, y = y, x 是元组赋值的⼀种,可以交换两个变量的值,再利⽤辗转相除法求得两个数的最⼤公约数。元组赋值也可以使⼀系列琐碎赋值更加紧凑i, j, k = 2, 3, 5
2. 对于⼀个字符串s := \"hello, world\"以下打印输出分别是什么,为什么?
fmt.Println(s[len(s)])fmt.Println(s[0:5])fmt.Println(s[:5])fmt.Println(s[7:]) fmt.Println(s[:])
答案:
fmt.Println(s[len(s)]) // panic: index out of rangefmt.Println(s[0:5]) // \"hello\"fmt.Println(s[:5]) // \"hello\" fmt.Println(s[7:]) // \"world\" fmt.Println(s[:]) // \"hello, world\"
如果索引超出字符串范围或者j⼩于i的话将导致panic异常。
不管i还是j都可能被忽略,当它们被忽略时将采⽤0作为开始位置,采⽤len(s)作为结束的位置。
编程题
1. 斐波那契第n个数的函数
func fib(n int) int { x, y := 0, 1
for i := 0; i < n; i++ { x, y = y, x+y }
return x }