背景

Google工程师Valentin Deleplace出了1道对于变量初始化的题目,原本认为很简略,没想到答复正确率不到30%,拿进去和大家分享下。

题目

// quiz.gopackage mainimport "fmt"func main() {    var a *int    *a = 5.0    fmt.Println(*a)}
  • A: 5
  • B: 5.0
  • C: panic
  • D: 编译谬误

解析

这道题次要考查2个知识点:

  • 变量零值。题目中a是一个指针类型的变量,var a *int这行代码没有对变量a初始化赋值,所以变量a的值是零值,指针的零值是nil,所以a的值是nil
  • 变量初始化赋值。如果对int类型的变量赋值为浮点数5.0是非法的,因为5.0是untyped float constant,是能够在不损失精度的状况下转换为5的。如果是赋值为5.1那就非法了,因为要损失小数点前面的精度,编译报错如下:

    ./quiz1.go:8:7: cannot use 5.1 (untyped float constant) as int value in assignment (truncated)

所以本题答案是C,编译的时候不会报错,然而运行的时候因为a 的值是nil,对nil*操作就会引发panic,具体panic内容为:panic: runtime error: invalid memory address or nil pointer dereference

思考题

题目1:

// quiz1.gopackage mainimport "fmt"func main() {    var a *int = new(int)    *a = 5.0    fmt.Println(*a)}

题目2:

// quiz2.gopackage mainimport "fmt"func main() {    var a *int = new(int)    var b float32 = 5.0    *a = b    fmt.Println(*a)}

题目3:

// quiz3.gopackage mainimport "fmt"func main() {    var a *int = new(int)    *a = 5.1    fmt.Println(*a)}

想晓得答案的能够给公众号发送音讯init获取答案。

总结

Go语言里不同类型的变量的零值不一样,给大家总结了各个类型的变量的零值:

  • 数值:所有数值类型的零值都是0

    • 整数,零值是0。byte, rune, uintptr也是整数类型,所以零值也是0。
    • 浮点数,零值是0
    • 复数,零值是0+0i
    • 整数类型的变量是能够用untyped float constant进行赋值的,只有不损失精度即可。
  • bool,零值是false
  • 字符串,零值是空串""
  • 指针:var a *int,零值是nil

    num := 100var a * int = &num
  • 切片:var a []int,零值是nil

    var a []int = []int{1,2}list := [6]int{1,2} //size为6的数组,后面2个元素是1和2,前面的是默认值0
  • map:var a map[string] int,零值是nil

    dict := map[string] int{"a":1, "b":2}
  • 函数:var a func(string) int,零值是nil

    function := func(str string) string {  return str}result := function("hello fans")fmt.Println("result=", result)
  • 构造体: var instance Struct,零值是nil

    type Circle struct {  redius float64}var c1 Circlec1.radius = 10.00
  • channel:var a chan int,通道channel,零值是nil

    var a chan int = make(chan int)var b = make(chan string)c := make(chan bool)
  • 接口:var a interface_type,接口interface,零值是nil

    type Animal interface {  speak()}type Cat struct {  name string  age int}func(cat Cat) speak() {  fmt.Println("miao...")}// 定义一个接口变量avar a Animal = Cat{"gaffe", 1}a.speak() // miao...

开源地址

文章和示例代码开源在GitHub: Go语言高级、中级和高级教程。

公众号:coding进阶。关注公众号能够获取最新Go面试题和技术栈。

集体网站:Jincheng's Blog。

知乎:无忌。

References

  • https://twitter.com/val_delep...
  • https://github.com/jincheng9/...