一个 GO 面试题

2021-08-05 17:33:08 +08:00
 Vegetable

今天遇到一个面试题,当时我就有点懵

package main

import "log"

func main() {
	a := []byte{'.'} 
	log.Println(a)
	str := "."
	log.Println([]byte(str))
        //这里确认都是 slice,没有 array
}

问:这两个输出结果是不是一致的,为什么?

我当时心里有点懵逼,认真想了很久,完全没 get 到,什么 array slice 一顿回忆,确定 println 一个 slice 和底层的 array 应该没关系,但是后边这个为什么,怎么感觉就是想让我回答不一致呢?

最后我写了:不知道,我认为一致

我回来之后试了一下,两次的确输出的都是[46]。现在我怀疑我哪里看错了吗?这题目究竟是啥意思,给我都整不自信了都

1119 次点击
所在节点    问与答
6 条回复
sadfQED2
2021-08-05 18:12:58 +08:00
单引号和双引号数据类型不一样造成的?
lysS
2021-08-05 20:17:24 +08:00
就是一致的啊
这里有个考点是单引号的是 rune(int32)类型;但无论是 rune 还是 byte(uint8)它两的值都是一样的
thinkingbullet
2021-08-05 20:49:10 +08:00
@lysS byte 不是 uint8 的别名吗 rune 是 int32 的别名 难道是我搞错了?
BeautifulSoap
2021-08-05 21:01:43 +08:00
试了下,即便是 go 刚发布时的版本,两个的输出也都是一致的。所以要么是出题出错了,要么是 lz 题目的代码哪个细节记错或看错了
djoiwhud
2021-08-05 21:38:36 +08:00
我猜测面试官是 c/cpp 转 go 的。c/cpp 里面的字符串要处理\0 的结束符。和数组有点差异。

五六年没写 cpp 了,回这个问题也心虚。就当参考吧。
cloudfstrife
2021-08-06 10:27:50 +08:00
```
package main

import (
"fmt"
"log"
"reflect"
)

func main() {
a := []byte{'.'}
log.Println(a)
str := "."
log.Println([]byte(str))
//这里确认都是 slice,没有 array
b := []byte(str)
fmt.Println(reflect.DeepEqual(a, b))
}
```

执行输出

```
2021/08/06 10:26:12 [46]
2021/08/06 10:26:12 [46]
true
```

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/793900

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX