持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情
- 今天写了一个的笔试,当时有很多知识感觉很熟悉,但是就是不确定。
- 就是我知道这道题很简单,但是我没有动手实现过这样的代码,我不确定最终结果是什么
- 我认真思索了下,还是我对基础知识掌握不够牢固
- 下面是我对这次笔试一些题的记录
关于接口的继承问题
- 当实现接口的方法,用带指针的结构体实现的时候。
- 将结构体强转为接口时,只能强转结构体的指针,而结构体本身不可以,会报错,如下所示:
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")
}()
结果如下: