diff --git a/README.md b/README.md index a5a2730..2bbadb1 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,7 @@ - [Go 语言笔试面试题(基础语法)](https://geektutu.com/post/qa-golang-1.html) - [Go 语言笔试面试题(实现原理)](https://geektutu.com/post/qa-golang-2.html) - [Go 语言笔试面试题(并发编程)](https://geektutu.com/post/qa-golang-3.html) +- [Go 语言笔试面试题(代码输出)](https://geektutu.com/post/qa-golang-c1.html) ## 相关链接 diff --git a/qa-golang/qa-golang-2.md b/qa-golang/qa-golang-2.md index 0db6986..ecac810 100644 --- a/qa-golang/qa-golang-2.md +++ b/qa-golang/qa-golang-2.md @@ -80,10 +80,11 @@ func main() { } ``` +`foo()` 函数中,如果 v 分配在栈上,foo 函数返回时,`&v` 就不存在了,但是这段函数是能够正常运行的。Go 编译器发现 v 的引用脱离了 foo 的作用域,会将其分配在堆上。因此,main 函数中仍能够正常访问该值。 + -`foo()` 函数中,如果 v 分配在栈上,foo 函数返回时,`&v` 就不存在了,但是这段函数是能够正常运行的。Go 编译器发现 v 的引用脱离了 foo 的作用域,会将其分配在堆上。因此,main 函数中仍能够正常访问该值。 ## Q3 2 个 interface 可以比较吗? diff --git a/qa-golang/qa-golang-c1.md b/qa-golang/qa-golang-c1.md new file mode 100644 index 0000000..e01efe2 --- /dev/null +++ b/qa-golang/qa-golang-c1.md @@ -0,0 +1,176 @@ +--- +title: Go 语言笔试面试题(代码输出) +seo_title: 极客面试 +date: 2020-10-10 23:10:10 +description: Go 语言/golang 笔试题,面试题,基础语法与内部实现原理,包括不限于垃圾回收机制(GC)、面向对象、并发编程等。 +tags: +- Go +nav: 面试 +categories: +- Go 语言面试题 +image: post/qa-golang/go_questions.jpg +github: https://github.com/geektutu/interview-questions +--- + +![golang interview questions](qa-golang/go_questions.jpg) + +**[Go 语言笔试面试题汇总](https://geektutu.com/post/qa-golang.html),[Github](https://github.com/geektutu/interview-questions)** + +## 常量与变量 + +1. 下列代码的输出是: + +```go +func main() { + const ( + a, b = "golang", 100 + d, e + f bool = true + g + ) + fmt.Println(d, e, g) +} + +``` + +
+答案 +
+ +golang 100 true + +在同一个 const group 中,如果常量定义与前一行的定义一致,则可以省略类型和值。编译时,会按照前一行的定义自动补全。即等价于 + +```go +func main() { + const ( + a, b = "golang", 100 + d, e = "golang", 100 + f bool = true + g bool = true + ) + fmt.Println(d, e, g) +} +``` + +
+
+ +2. 下列代码的输出是: + +```go +func main() { + const N = 100 + var x int = N + + const M int32 = 100 + var y int = M + fmt.Println(x, y) +} +``` + +
+答案 +
+ +编译失败:cannot use M (type int32) as type int in assignment + +Go 语言中,常量分为无类型常量和有类型常量两种,`const N = 100`,属于无类型常量,赋值给其他变量时,如果字面量能够转换为对应类型的变量,则赋值成功,例如,`var x int = N`。但是对于有类型的常量 `const M int32 = 100`,赋值给其他变量时,需要类型匹配才能成功,所以显示地类型转换: + +```go +var y int = int(M) +``` + +
+
+ + +3. 下列代码的输出是: + +```go +func main() { + var a int8 = -1 + var b int8 = -128 / a + fmt.Println(b) +} +``` + +
+答案 +
+ +-128 + +int8 能表示的数字的范围是 [-2^7, 2^7-1],即 [-128, 127]。-128 是无类型常量,转换为 int8,再除以变量 -1,结果为 128,常量除以变量,结果是一个变量。变量转换时允许溢出,符号位变为1,转为补码后恰好等于 -128。 + +对于有符号整型,最高位是是符号位,计算机用补码表示负数。补码 = 原码取反加一。 + +例如: + +```bash +-1 : 11111111 +00000001(原码) 11111110(取反) 11111111(加一) +-128: +10000000(原码) 01111111(取反) 10000000(加一) + +-1 + 1 = 0 +11111111 + 00000001 = 00000000(最高位溢出省略) +-128 + 127 = -1 +10000000 + 01111111 = 11111111 +``` + +
+
+ +4. 下列代码的输出是: + +```go +func main() { + const a int8 = -1 + var b int8 = -128 / a + fmt.Println(b) +} +``` + +
+答案 +
+ +编译失败:constant 128 overflows int8 + +-128 和 a 都是常量,在编译时求值,-128 / a = 128,两个常量相除,结果也是一个常量,常量类型转换时不允许溢出,因而编译失败。 + +
+
+ +## 作用域 + +1. 下列代码的输出是: + +```go +func main() { + var err error + if err == nil { + err := fmt.Errorf("err") + fmt.Println(1, err) + } + if err != nil { + fmt.Println(2, err) + } +} +``` + +
+答案 +
+ +1 err + +`:=` 表示声明并赋值,`=` 表示仅赋值。 + +变量的作用域是大括号,因此在第一个 if 语句 `if err == nil` 内部重新声明且赋值了与外部变量同名的局部变量 err。对该局部变量的赋值不会影响到外部的 err。因此第二个 if 语句 `if err != nil` 不成立。所以只打印了 `1 err`。 + +
+
+ + diff --git a/qa-golang/qa-golang.md b/qa-golang/qa-golang.md index e3cf28c..c53af48 100644 --- a/qa-golang/qa-golang.md +++ b/qa-golang/qa-golang.md @@ -9,7 +9,6 @@ nav: 面试 categories: - Go 语言面试题 image: post/qa-golang/go_questions.jpg -top: 3 github: https://github.com/geektutu/interview-questions --- @@ -50,4 +49,9 @@ github: https://github.com/geektutu/interview-questions - 01 无缓冲的 channel 和有缓冲的 channel 的区别? - 02 什么是协程泄露(Goroutine Leak)? -- 03 Go 可以限制运行时操作系统线程的数量吗? \ No newline at end of file +- 03 Go 可以限制运行时操作系统线程的数量吗? + +## [代码输出](https://geektutu.com/post/qa-golang-c1.html) + +- 变量与常量 +- 作用域 \ No newline at end of file