企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
## 写出以下代码出现的问题 ~~~go package main import ( "fmt" ) func main() { var x string = nil if x == nil { x = "default" } fmt.Println(x) } ~~~ golang 中字符串是不能赋值`nil`的,也不能跟`nil`比较。 ## 写出以下打印内容 ~~~go package main import "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) } ~~~ ## 找出下面代码的问题 ~~~go package main import "fmt" type query func(string) string func 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)`,实际上代码执行后会启动 4 个协程,但是因为`ch`是非缓冲的,只可能有一个协程写入成功。而其他三个协程会一直在后台等待写入。 ## 写出以下打印结果,并解释下为什么这么打印的。 ~~~go package main import ( "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) } ~~~ golang 中的切片底层其实使用的是数组。当使用`str1[1:]`使,`str2`和`str1`底层共享一个数组,这回导致`str2[1] = "new"`语句影响`str1`。 而`append`会导致底层数组扩容,生成新的数组,因此追加数据后的`str2`不会影响`str1`。 但是为什么对`str2`复制后影响的确实`str1`的第三个元素呢?这是因为切片`str2`是从数组的第二个元素开始,`str2`索引为 1 的元素对应的是`str1`索引为 2 的元素。 ## 写出以下打印结果 ~~~go package main import ( "fmt" ) type Student struct { Name string } func main() { fmt.Println(&Student{Name: "menglu"} == &Student{Name: "menglu"}) fmt.Println(Student{Name: "menglu"} == Student{Name: "menglu"}) } ~~~ 个人理解:指针类型比较的是指针地址,非指针类型比较的是每个属性的值。 ## 写出以下代码的问题 ~~~go package main import ( "fmt" ) func main() { fmt.Println([...]string{"1"} == [...]string{"1"}) fmt.Println([]string{"1"} == []string{"1"}) } ~~~ 数组只能与相同纬度长度以及类型的其他数组比较,切片之间不能直接比较。。 ## 下面代码写法有什么问题? ~~~go package main import ( "fmt" ) type Student struct { Age int } func main() { kv := map[string]Student{"menglu": {Age: 21}} kv["menglu"].Age = 22 s := []Student{{Age: 21}} s[0].Age = 22 fmt.Println(kv, s) } ~~~ golang 中的`map`通过`key`获取到的实际上是两个值,第一个是获取到的值,第二个是是否存在该`key`。因此不能直接通过`key`来赋值对象。