语法找错题
大约 3 分钟
语法找错题
写出以下代码出现的问题
package main
import (
"fmt"
)
func main() {
var x string = nil
if x == nil {
x = "default"
}
fmt.Println(x)
}
golang 中字符串是不能赋值 nil
的,也不能跟 nil
比较。
写出以下打印内容
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)
}
找出下面代码的问题
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
是非缓冲的,只可能有一个协程写入成功。而其他三个协程会一直在后台等待写入。
写出以下打印结果,并解释下为什么这么打印的。
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 的元素。
写出以下打印结果
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"})
}
个人理解:指针类型比较的是指针地址,非指针类型比较的是每个属性的值。
写出以下代码的问题
package main
import (
"fmt"
)
func main() {
fmt.Println([...]string{"1"} == [...]string{"1"})
fmt.Println([]string{"1"} == []string{"1"})
}
数组只能与相同纬度长度以及类型的其他数组比较,切片之间不能直接比较。。
下面代码写法有什么问题?
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
来赋值对象。