栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Golang面试题目-常见语法问题(四)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Golang面试题目-常见语法问题(四)

1、写出下例代码出现的问题。

package main​import (  "fmt")​func main() {  var x string = nil  if x == nil {    x = "default"  }​  fmt.Println(x)}

解析:Go中字符串类型不能赋值nil,也不能跟nil进行对比。

2、写出下例代码打印的内容。

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)}

代码打印结果如下:

3、找出下例代码的问题。

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),实际上代码执行后会启动四个协程,但是因为ch是非缓冲的,所以只可能有一个协程写入成功,而其它三个协程会一直在后台等待写入。

4、写出下例代码打印的内容,并说出原因。

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)  fmt.Println(str2)}

代码打印结果如下:

解析:Go中切片底层使用的其实是数组,当使用str1[1:]时,str2和str1在底层共享一个数组,这会导致str2[1]="new"语句影响str1。

append则会使底层数组扩容,生成新的数组,因此追加数据后的str2不会影响str1。

但是为什么对str2赋值后影响的却是str1的第三个元素呢?

因为切片str2是从数组第二个元素开始的,str2索引1对应的就是str1索引为2的那个元素。

5、写出下例代码打印的内容。

package main​import (  "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 main​import (  "fmt")​func main() {  fmt.Println([...]string{"1"} == [...]string{"1"})  fmt.Println([]string{"1"} == []string{"1"})}

解析:数组只能与相同纬度、长度以及类型的其它数组做比较,两切片之间不能直接相互比较。

7、下例代码这么写有什么问题?

package main​import (  "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来赋值对象。

扫码关注公众号,获取更多优质内容。

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/270028.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号