- 今天写了一个的笔试,当时有很多知识感觉很熟悉,但是就是不确定。
- 就是我知道这道题很简单,但是我没有动手实现过这样的代码,我不确定最终结果是什么
- 我认真思索了下,还是我对基础知识掌握不够牢固
- 下面是我对这次笔试一些题的记录
关于接口的继承问题
- 当实现接口的方法,用带指针的结构体实现的时候。
- 将结构体强转为接口时,只能强转结构体的指针,而结构体本身不可以,会报错,如下所示:
type phone interface { call() } type xiaomi struct { } //如果这个带指针 * func (this *xiaomi) call() { fmt.Println("小米手机") } func main() { var p phone = new(xiaomi) var p phone = &xiaomi{} var p phone = xiaomi{} } 复制代码
iota的问题
- iota在const中使用,而且iota是从0开始的,会自增,所以我们经常可以是用iota定义一些字段,让他的值自增,写起来更方便
- 但是多个const中的iota,在每一个const中都是从0开始的
- iota的作用域只有一个const
const ( a = iota b ) const ( c = iota d ) 结果 a,b,c,d = 0,1,0,1 复制代码
数组的问题
- 数组的长度是数组数据类型的一部分
- 在定义数组的时候,就已经有长度,而且会把数组给初始化
- 数组初始化之后,会把所有的值初始化为默认值(int是0,bool是false)
var a [4]int fmt.Println(a) 复制代码
- 上面这个结果是 0,0,0,0
var a = [4]int{1, 2, 3} fmt.Println(a) 复制代码
- 下面这个结果是[1 2 3 0]
协程的问题
- 得到的结果不是1,2,3 。也不是3,3,3。而是不确定,因为不知道执行时间,虽然都会被阻塞
- 因为for循环很快,但是速度是无法确定,而且引用了外部变量
- 这就变成了一个闭包,i的值是会变化的
wg.Add(3) for i := 0; i < 3; i++ { go func() { fmt.Println(i) wg.Done() }() } wg.Wait() 复制代码
不会输出2
var s = make(chan int, 1) go func() { s <- 1 s <- 2 fmt.Println(2) }() <-s 复制代码
defer的问题
- 会输出的结果是4,因为c是一个具名变量,defer在return执行之后,函数结束之前执行
- 先执行C++,此时c=1
- 然后执行return, c = a+b ,c =3
- 然后执行defer, c++ , c=4
- defer可以捕获panic
- 因此defer的执行时机是panic之前
- 而defer的执行顺序是栈-后进先出
- 但是panic之后的defer不会被压入栈
defer func() { fmt.Println("a") }() defer func() { fmt.Println("b") }() panic("c") defer func() { fmt.Println("d") }() 复制代码
结果如下: