文本描述
Go语言笔试面试题(代码输出) 2020-10-10 23:10:10 golang interview questions Go语言笔试面试题汇总,Github 常量与变量 1. 下列代码的输出是: func main() { const ( a, b = "golang", 100 d, e f bool = true g ) fmt.Println(d, e, g) } 答案 golang 100 true 在同一个 const group中,如果常量定义与前一行的定义一致,则可以省略类型和 值。编译时,会按照前一行的定义自动补全。即等价于 func main() { const ( a, b = "golang", 100 d, e = "golang", 100 f bool = true g bool = true ) fmt.Println(d, e, g) } 2. 下列代码的输出是: 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,赋值给其 他变量时,需要类型匹配才能成功,所以显示地类型转换: var y int = int(M) 3. 下列代码的输出是: 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。 对于有符号整型,最高位是是符号位,计算机用补码表示负数。补码 =原码取反加 一。 例如: -1 : 11111111 00000001(原码) -128: 11111110(取反) 01111111(取反) 11111111(加一) 10000000(加一) 10000000(原码) -1 + 1 = 0 11111111 + 00000001 = 00000000(最高位溢出省略) -128 + 127 = -1 10000000 + 01111111 = 11111111 4. 下列代码的输出是: func main() { const a int8 = -1 var b int8 = -128 / a fmt.Println(b) } 答案 编译失败:constant 128 overflows int8 -128和 a都是常量,在编译时求值,-128 / a = 128,两个常量相除,结果也是一 个常量,常量类型转换时不允许溢出,因而编译失败。 作用域 1. 下列代码的输出是: 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 :=表示声明并赋值,=表示仅赋值