Go语言面试题--进阶语法(32)
文章目录
- 1.关于 channel 下面描述正确的是?
- 2.下面的代码有什么问题?
- 3.下面的代码有什么问题?
- 4.下面代码输出什么?
1.关于 channel 下面描述正确的是?
A. close() 可以用于只接收通道;
B. 单向通道可以转换为双向通道;
C. 不能在单向通道上做逆向操作(例如:只发送通道用于接收);
参考答案及解析:C。
2.下面的代码有什么问题?
type T struct {
n int
}
func getT() T {
return T{}
}
func main() {
getT().n = 1
}
参考答案及解析:编译错误:
cannot assign to getT().n
直接返回的 T{} 无法寻址,不可直接赋值。
修复代码:
type T struct {
n int
}
func getT() T {
return T{}
}
func main() {
t := getT()
p := &t.n // <=> p = &(t.n)
*p = 1
fmt.Println(t.n)
}
3.下面的代码有什么问题?
package main
import "fmt"
func main() {
s := make([]int, 3, 9)
fmt.Println(len(s))
s2 := s[4:8]
fmt.Println(len(s2))
}
参考答案及解析:代码没问题,输出 3 4。从一个基础切片派生出的子切片的长度可能大于基础切片的长度。假设基础切片是 baseSlice,使用操作符 [low,high],有如下规则:0 <= low <= high <= cap(baseSlice),只要上述满足这个关系,下标 low 和 high 都可以大于 len(baseSlice)。
4.下面代码输出什么?
type N int
func (n N) test(){
fmt.Println(n)
}
func main() {
var n N = 10
p := &n
n++
f1 := n.test
n++
f2 := p.test
n++
fmt.Println(n)
f1()
f2()
}
参考答案及解析:13 11 12。知识点:方法值。当指针值赋值给变量或者作为函数参数传递时,会立即计算并复制该方法执行所需的接收者对象,与其绑定,以便在稍后执行时,能隐式第传入接收者参数。