1、写出下例代码出现的问题。
package mainimport ( "fmt")func main() { var x string = nil if x == nil { x = "default" } fmt.Println(x)}
解析:Go中字符串类型不能赋值nil,也不能跟nil进行对比。
2、写出下例代码打印的内容。
package mainimport ( "fmt")const ( a = iota b = iota)const ( name = "menglu" c = iota d = iota)func main() { fmt.Println(a) fmt.Println(b) fmt.Println(c) fmt.Println(d)}
代码打印结果如下:
3、找出下例代码的问题。
package mainimport ( "fmt")type query func(string) stringfunc exec(name string, vs ...query) string { ch := make(chan string) fn := func(i int) { ch <- vs[i](name) } for i, _ := range vs { go fn(i) } return <-ch}func main() { ret := exec("111", func(n string) string { return n + "func1" }, func(n string) string { return n + "func2" }, func(n string) string { return n + "func3" }, func(n string) string { return n + "func4" }) fmt.Println(ret)}
解析:上述代码存在内存泄露问题,出错的位置是go fn(i),实际上代码执行后会启动四个协程,但是因为ch是非缓冲的,所以只可能有一个协程写入成功,而其它三个协程会一直在后台等待写入。
4、写出下例代码打印的内容,并说出原因。
package mainimport ( "fmt")func main() { str1 := []string{"a", "b", "c"} str2 := str1[1:] str2[1] = "new" fmt.Println(str1) str2 = append(str2, "z", "x", "y") fmt.Println(str1) fmt.Println(str2)}
代码打印结果如下:
解析:Go中切片底层使用的其实是数组,当使用str1[1:]时,str2和str1在底层共享一个数组,这会导致str2[1]="new"语句影响str1。
append则会使底层数组扩容,生成新的数组,因此追加数据后的str2不会影响str1。
但是为什么对str2赋值后影响的却是str1的第三个元素呢?
因为切片str2是从数组第二个元素开始的,str2索引1对应的就是str1索引为2的那个元素。
5、写出下例代码打印的内容。
package mainimport ( "fmt")type Student struct { Name string}func main() { fmt.Println(&Student{Name: "1"} == &Student{Name: "1"}) fmt.Println(Student{Name: "2"} == Student{Name: "2"})}
输出结果如下:
解析:指针类型比较的是指针地址,非指针类型比较的是每个属性的值。
6、找出下例代码的问题。
package mainimport ( "fmt")func main() { fmt.Println([...]string{"1"} == [...]string{"1"}) fmt.Println([]string{"1"} == []string{"1"})}
解析:数组只能与相同纬度、长度以及类型的其它数组做比较,两切片之间不能直接相互比较。
7、下例代码这么写有什么问题?
package mainimport ( "fmt")type Student struct { Age int}func main() { kv := map[string]Student{"test": {Age: 21}} kv["test"].Age = 22 s := []Student{{Age: 21}} s[0].Age = 22 fmt.Println(kv, s)}
解析:Go中的map通过key获取到的实际上是两个值,第一个不用说就是想获取到的那个值,第二个值就是是否存在该key,因此不能直接通过key来赋值对象。
扫码关注公众号,获取更多优质内容。



