笔试总结

68 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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{}
}

image-20220929212040911.png

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

image.png

  • defer可以捕获panic
  • 因此defer的执行时机是panic之前
  • 而defer的执行顺序是栈-后进先出
  • 但是panic之后的defer不会被压入栈
	defer func() {
		fmt.Println("a")
	}()
	defer func() {
		fmt.Println("b")
	}()
	panic("c")
	defer func() {
		fmt.Println("d")
	}()

结果如下:

image.png