Golang

关注公众号 jb51net

关闭
首页 > 脚本专栏 > Golang > Golang面试常见陷阱及应对

Golang基础常识性面试中常见的六大陷阱及应对技巧总结

作者:少林码僧

Go是一门简单有趣的语言,但与其他语言类似,它会有一些技巧,这篇文章主要给大家介绍了关于Golang基础常识性面试中常见的六大陷阱及应对技巧的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

一、nil slice & empty slice

1、nil切片与空切片底层

图片

图片

2、创建nil slice 和empty slice

package main
import "fmt"
func main() {
  var nilSlice []string  // 创建一个 nil 切片
  emptySlice0 := make([]int, 0)  // 方法1:创建一个空切片(零切片)
  var emptySlice1 = []string{}   // 方法2:创建一个空切片
  fmt.Printf("\nnilSlice---> Nil:%v Len:%d Capacity:%d", nilSlice == nil, len(nilSlice), cap(nilSlice))
  fmt.Printf("\nemptySlice0---> nil:%v Len:%d Capacity:%d", emptySlice0 == nil, len(emptySlice0), cap(emptySlice0))
  fmt.Printf("\nemptySlice1---> nil:%v Len:%d Capacity:%d", emptySlice1 == nil, len(emptySlice1), cap(emptySlice1))
  // nil切片和空切片都可以正常 append数据
  nilSlice = append(nilSlice, "sss")
}
/*
Nil:true Len:0 Capacity:0
nil:false Len:0 Capacity:0
nil:false Len:0 Capacity:0[sss]
 */

二、类型强转产生内存拷贝

1、字符串转数组发送内存拷贝

2、字符串转数组不内存拷贝方法

package main

import (
   "fmt"
   "reflect"
   "unsafe"
)

func main() {
   a :="aaa"
   ssh := *(*reflect.StringHeader)(unsafe.Pointer(&a))
   b := *(*[]byte)(unsafe.Pointer(&ssh))
   fmt.Printf("%v---%T",b,b)  // [97 97 97]---[]uint8
}

三、拷贝大切片一定代价大吗?

type SliceHeader struct {
  Data uintptr
  Len  int
  Cap  int
}

四、map不初始化使用会怎么样

package main

func main() {
  var m1 map[string]string    // 创建一个 nil map
  println("m1为nil: ", m1==nil)
  // 报错 => panic: assignment to entry in nil map
  //m1["name"] = "tom"

  var m2 =  make(map[string]string)  // 创建一个空map
  m2["name"] = "jack"                // 空map可以正常
  println("m2为nil: ", m2==nil)
}

五、map会遍历删除安全吗?

六、for循环append坑

1、坑1:添加元素变覆盖

package main
import "fmt"
func main() {
  s := []int{1,2,3,4,5}
  for _, v:=range s {
    s =append(s, v)
    fmt.Printf("len(s)=%v\n",len(s))
  }
}
/*
len(s)=6
len(s)=7
len(s)=8
len(s)=9
len(s)=10
 */

2、坑2:值全部一样

package main
import "fmt"
func main() {
  var nums = []int{1, 2, 3, 4, 5}
  var res []*int
  for _, num := range nums {
    res = append(res, &num)
    //fmt.Println("num:", num)
  }
  for _, r := range res {
    fmt.Println("res:", *r)
  }
}
/*
res: 5
res: 5
res: 5
res: 5
res: 5
 */

3、解决方法

package main
import "fmt"
func main() {
  var nums = []int{1, 2, 3, 4, 5}
  var res []*int
  for i := 0; i < len(nums); i++ {
    res = append(res, &nums[i])
  }
  fmt.Println("res:", res)
  for _, r := range res {
    fmt.Println("res:", *r)
  }
}
package main
import "fmt"
func main() {
  var nums = []int{1, 2, 3, 4, 5}
  var res []*int
  for _, num := range nums {
    numTemp := num // 创建一个新的临时变量
    res = append(res, &numTemp)
  }
  for _, r := range res {
    fmt.Println("res:", *r)
  }
}
/*
res: 1
res: 2
res: 3
res: 4
res: 5
 */

总结

到此这篇关于Golang基础常识性面试中常见的六大陷阱及应对技巧总结的文章就介绍到这了,更多相关Golang面试常见陷阱及应对内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文