rest|golang笔记 | 面试题整理( 二 )


8、defer的执行顺序是什么?
defer语句并不会马上执行 , 而是会进入一个栈 , 函数return前 , 会按先进后出的顺序执行 。 也说是说最先被定义的defer语句最后执行 。


注:先进后出的原因是后面定义的函数可能会依赖前面的资源 , 自然要先执行;否则 , 如果前面先执行 , 那后面函数的依赖就没有
9、defer函数遇到return以后是怎么执行的?

先defer再return , 函数执行之后 , return返回之前 , 按照先进后出的顺序执行
10、对于进程 , 线程 , 协程的理解是什么?
  • 线程可以理解为轻量级的进程 协程可以理解为轻量级的线程
  • 协程最大的优势就是可以轻松的创建上百万个 , 而不会导致系统资源衰减
详解请参考:进程、线程、协程
11、有时候会遇到一些空的结构体 , 这个目的是什么?
空结构体不占任何内存 , 使用空结构体 , 可以帮咱们节省内存空间 , 提升性能golang
12、map怎么顺序读取?
map不能顺序读取 , 是因为他是无序的 , 想要有序读取 , 首先的解决的问题就是 , 把key变为有序 , 所以可以把key放入切片 , 对切片进行排序 , 遍历切片 , 通过key取值 。
代码示例:
package main

import (
  \"fmt\"
  \"sort\"
)

func main()  {
  map1 := make(map[int
string)
  map1[1
 = \"红孩儿\"
  map1[2
 = \"牛魔王\"
  map1[3
 = \"白骨精\"
  map1[4
 = \"小钻风\"
  map1[5
 = \"黄袍怪\"
  map1[6
 = \"孔雀大明王\"
  map1[7
 = \"白毛鼠\"

  //获取所有的key , 取值后存储到切片
  keys := make([
int0len(map1))
  for k_ := range map1{
    keys = append(keysk)
  
  fmt.Println(keys)


  //对key值进行排序
  //内置函数sort包下的排序方法
  sort.Ints(keys)
  fmt.Println(keys)
  for _key := range keys{
    fmt.Println(key\"-->\"map1[key
)
  

  //冒泡排序方法
  for i := 1;i<len(keys);i++ {
    for j := 0;j<len(keys)-1;j++ {
      if keys[j
 > keys[j+1
 {
        keys[j
keys[j+1
 = keys[j+1
keys[j

      
    
    
  for i := 1;i<=len(keys);i++ {
    fmt.Println(i\"-->\"map1[i
)
  


13、你在项目里面会用到什么数据结构 , 例如map、slice
都会用到 , 包括基本数据类型:int、float、string、bool, 复合数据类型有:指针、数组、切片、字典(map)、通道、结构和接口

注:map和slice也会用到 , 当有明确的key值时 , 使用map , 如果没有明显的key , 就使用切片
14、如果用range修改切片元素的值 , 会发生什么?

我们经常会使用到range来帮助我们遍历一些数据 , 通常情况下都是查看操作多一些 , 但是当我们需要对其原地址上的内容进行变更时 , 通常都是使用 for i:=0; i<len(); i++ 来修改值 。 在使用range的时候 , 通常会将该数据结构进行拷贝 , 来遍历这一份拷贝后的副本 , 使用的是一个值传递 , 如果我们进行修改 , 修改的就只是副本 , 对原地址上的值不会产生任何影响 。