Go 面试每天一篇(第 49 天)

点击上方蓝色“Golang来啦”关注我哟

加个“星标”,天天 15 分钟,一起学 Go

新的一周,加油干!

你好哇,欢迎来答题,一起来看下

1.下面代码有什么问题?

1type foo struct {
2    bar int
3}
4
5func main() {
6    var f foo
7    f.bar, tmp := 1, 2
8}

参考答案及解析:编译错误:

1non-name f.bar on left side of :=

:= 操作符不能用于结构体字段赋值。

2.下面的代码输出什么?

1func main() {  
2    fmt.Println(~2) 
3}

参考答案及解析:编译错误。

1invalid character U+007E '~'

很多语言都是采用 ~ 作为按位取反运算符,Go 里面采用的是 ^ 。按位取反之后返回一个每个 bit 位都取反的数,对于有符号的整数来说,是按照补码进行取反操作的(快速计算方法:对数 a 取反,结果为 -(a+1) ),对于无符号整数来说就是按位取反。例如:

1func main() {
2    var a int8 = 3
3    var b uint8 = 3
4    var c int8 = -3
5
6    fmt.Printf("^%b=%b %d\n", a, ^a, ^a) // ^11=-100 -4
7    fmt.Printf("^%b=%b %d\n", b, ^b, ^b) // ^11=11111100 252
8    fmt.Printf("^%b=%b %d\n", c, ^c, ^c) // ^-11=10 2
9}

另外需要注意的是,如果作为二元运算符,^ 表示按位异或,即:对应位相同为 0,相异为 1。例如:

1func main() {
2    var a int8 = 3
3    var c int8 = 5
4
5    fmt.Printf("a: %08b\n",a)
6    fmt.Printf("c: %08b\n",c)
7    fmt.Printf("a^c: %08b\n",a ^ c)
8}

给大家重点介绍下这个操作符 &^,按位置零,例如:z = x &^ y,表示如果 y 中的 bit 位为 1,则 z 对应 bit 位为 0,否则 z 对应 bit 位等于 x 中相应的 bit 位的值。

不知道大家发现没有,我们还可以这样理解或操作符 | ,表达式 z = x | y,如果 y 中的 bit 位为 1,则 z 对应 bit 位为 1,否则 z 对应 bit 位等于 x 中相应的 bit 位的值,与 &^ 完全相反。

1var x uint8 = 214
2var y uint8 = 92
3fmt.Printf("x: %08b\n",x)     
4fmt.Printf("y: %08b\n",y)       
5fmt.Printf("x | y: %08b\n",x | y)     
6fmt.Printf("x &^ y: %08b\n",x &^ y)

输出:

1x: 11010110
2y: 01011100
3x | y: 11011110
4x &^ y: 10000010

解析若有不妥之处,欢迎在留言区交流、指正!

看下今天的题目:

1func main() {
2    var ch chan int
3    select {
4    case v, ok := <-ch:
5        println(v, ok)
6    default:
7        println("default") 
8    }
9}

2.下面这段代码输出什么?

 
   

答案以及解析会在下一篇文章中给出,鼓励大家在留言区留下答案,抱团学习,日拱一卒,每天进步一点

ps:看完文章如果有收获,顺手花 1s 时间帮点下文末右下方的「在看」,感激!

所有学习上的成功,都只依靠两件事 -- 策略和坚持,而坚持本身就是最重要的策略!

推荐阅读:

如果我的文章对你有所帮助,点赞、转发都是一种支持!

640?

Go 面试每天一篇(第 49 天)_第1张图片

你可能感兴趣的:(Go 面试每天一篇(第 49 天))