今天遇到一个面试题,当时我就有点懵
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]。现在我怀疑我哪里看错了吗?这题目究竟是啥意思,给我都整不自信了都
1
sadfQED2 2021-08-05 18:12:58 +08:00 via Android
单引号和双引号数据类型不一样造成的?
|
2
lysS 2021-08-05 20:17:24 +08:00
就是一致的啊
这里有个考点是单引号的是 rune(int32)类型;但无论是 rune 还是 byte(uint8)它两的值都是一样的 |
3
thinkingbullet 2021-08-05 20:49:10 +08:00
@lysS byte 不是 uint8 的别名吗 rune 是 int32 的别名 难道是我搞错了?
|
4
BeautifulSoap 2021-08-05 21:01:43 +08:00
试了下,即便是 go 刚发布时的版本,两个的输出也都是一致的。所以要么是出题出错了,要么是 lz 题目的代码哪个细节记错或看错了
|
5
djoiwhud 2021-08-05 21:38:36 +08:00 via Android
我猜测面试官是 c/cpp 转 go 的。c/cpp 里面的字符串要处理\0 的结束符。和数组有点差异。
五六年没写 cpp 了,回这个问题也心虚。就当参考吧。 |
6
cloudfstrife 2021-08-06 10:27:50 +08:00 1
```
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 ``` |