原创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后的逻辑语句后继续后面的case

5. 下列关于变量和指针错误的是:
A. 一个变量对应一个对应类型值的内存空间。
B. 一个指针的值是另一个变量的地址。
C. 结构体的每个字段都是对应的一个变量,都可以被取地址
D. 每一个值都会有一个内存地址

 

简答题

1. 单个变量声明语法都有哪些?分别是怎样的赋值或者类型的策略。

 

2. 以表达式new(T)解释一下new函数的使用。
与之对应的普通变量声明语句怎么表达?

 

分析题

1. 分析下面函数的算法

func gcd(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控制流错误的是:A
A. 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 = 1
var a int
a := 1
如果省略的是类型信息,那么将根据初始化表达式来推导变量的类型信息。如果初始化表达式被省略,那么将用零值初始化该变量。

 

2. 以表达式new(T)解释一下new函数的使用。
与之对应的普通变量声明语句怎么表达?

答案:

表达式new(T)将创建一个T类型的匿名变量,初始化为T类型的零值,然后返回变量地址,返回的指针类型为 *T 。
与a := new(T)相同行为的语句
var dummy T
a := &dummy

 

分析题

1. 分析下面函数的算法

func gcd(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 range
fmt.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 
}

 

posted @ 2020-05-12 19:39  塘浅  阅读(818)  评论(0)    收藏  举报