• [golang] 零值和nil


    简单概括:

    当你定义一个变量时,会默认赋予这个变量零值.

    值类型:0,"",false

    引用类型:nil(func,interface,slice,map,channel,指针)

    结构体会遍历内部成员,分别赋予零值.

    注意点:

    1. 注意声明和初始化的区别

    var a []int  未初始化,是nil

    a:=[]int{}   初始化了,不是nil

    2.如果对象是nil,可以调用它的方法

    对象是nil,调用方法没问题,赋值时才有问题

    3.结构体定义的区别

    1. type student struct {
    2. age int
    3. class []string
    4. }
    5. func (s *student) speak() {
    6. fmt.Println("hahaha")
    7. }
    8. func (s *student) getAge() int {
    9. return s.age
    10. }
    11. func (s *student) setAge() {
    12. s.age = 18
    13. }
    14. func (s *student) getClass() []string {
    15. return s.class
    16. }
    17. func (s *student) setClass() {
    18. s.class = []string{"math", "chinese"}
    19. }

    case1:

    var a student
    fmt.Println(a==nil)  //cannot convert 'nil' to type 'student'

     a的age和class有默认零值

    case2:

    var a student
    fmt.Println(a.getAge())
    

    没错,打印的是0

    case3:

    var a *student
    fmt.Println(a==nil)
    fmt.Println(a.getAge())

    a这里是指针类型,因此可以和nil比较.结果是 true

    获取a的age字段,因为a都是空的.没有分配内存,你调用肯定是空指针

    case4:

    var a *student
    a.speak()

    打印 "hahah" 虽然是nil,但是还是可以调用

    case5:

    var a = new(student)
    a.getAge()

    知识点: new的定义  func new(Type) *Type  传入类型,返回类型指针.其值为类型的零值

    其实相当于 

    a:=&student{}

  • 相关阅读:
    「Docker」命令使用大全,全集一览
    C++ 中的文件读写
    Java学习随便记2
    SpingMVC之拦截器使用详解
    sort 函数排序之cmp浅析
    【微服务】Alibaba Cloud Linux环境下Docker以及MySQL安装
    c++ 高效使用vector(面试)
    小程序点击更多上拉显示选项
    使用fdatool工具箱设计滤波器及工程应用
    xml文件中的standalone声明
  • 原文地址:https://blog.csdn.net/u012997470/article/details/126142334