面试题

参考资料

Golang 常见面试题

go语言的31个坑

面试题解析

https://toutiao.io/posts/qepeli/preview

string 和 []byte 互转

string 不能直接和 byte 数组转换,但是 string 可以和 byte 的切片转换。注意:string 和 []byte 的类型转换涉及内存拷贝,一些情况下频繁使用会造成性能瓶颈。

参考:Golang中[]byte与string转换

string 转为[]byte

var str string = "test"
var data []byte = []byte(str)

[]byte 转为 string

var data [10]byte 
byte[0] = 'T'
byte[1] = 'E'
var str string = string(data[:])

panic: assignment to entry in nil map

通过var m map[string]int得到的值是 nil, 不指向任何内存地址。需要通过make方法分配确定的内存地址。

这个问题官方文档中解释如下:

This variable m is a map of string keys to int values: var m map[string]int Map types are reference types, like pointers or slices, and so the value of m above is nil; it doesn’t point to an initialized map. A nil map behaves like an empty map when reading, but attempts to write to a nil map will cause a runtime panic; don’t do that. To initialize a map, use the built in make function: m = make(map[string]int)

同为引用类型的 slice,在使用append 向 nil slice 追加新元素就可以,原因是append方法在底层为 slice 重新分配了相关数组让 nil slice 指向了具体的内存地址

nil map doesn’t point to an initialized map. Assigning value won’t reallocate point address. The append function appends the elements x to the end of the slice s, If the backing array of s is too small to fit all the given values a bigger array will be allocated. The returned slice will point to the newly allocated array.

结构体初始化并赋值

type ListNode struct{
	Value int
	Next *ListNode
}

func main() {
	var head *ListNode
    // panic: runtime error: invalid memory address or nil pointer dereference
	head.Value = 10
}

var 没有初始化结构体的实例,故没有地址,所以在给 head.value 赋值的时候触发了 nil pointer 的 panic。