5 值类型和引用类型以及标识符的命名规范

5 值类型和引用类型以及标识符的命名规范

5.1 常见的值类型和引用类型

  • 值类型:基本数据类型 int 系列、float 洗了、bool、string、数组和结构体 struct

  • 引用类型:指针、slice 切片、map、管道 chan、interface 等都是引用类型

5.2 值类型和引用类型使用特点

值类型和引用类型在最终使用的时候会造成那些区别呢。

5.2.1 值类型

栈的理解:在我们的内存里面分为两大块,一块叫做栈,一块叫做堆

如果是值类型,那么变量直接存储值,内存通常在栈中分配,也就是说我们的值类型的变量通常分配在栈中

值类型内存分配的布局图:

5.2.2 引用类型

引用类型,变量存储的是一个地址,如指针等。这个地址对应的空间才是真正存储数据(值),内存通常在堆区分配,当没有任何变量引用这个地址时,该地址对应的数据空间就变成为了一个垃圾,由 GC 来进行回收。

引用类型内存分配的布局图:

引用类型指向了一个空间,这个空间中存放的是地址,这个地址指向的才是一个真正存储数据的地方。就和指针一样

5.2.3 值类型和引用类型区别总结

如图,这是一块内存,这个内存从数据存储空间上来说分为了两大块,一块叫做栈区,一块叫做堆区。

值类型:

值类型的数据通常是在栈区。在 go 语言中有个特点叫做编译逃逸分析,也就是说有可能值类型也在堆区,反过来有可能你的引用类型也在栈区,但是这个并不影响我们对程序的理解。因为栈和堆本身就是逻辑的概念。

引用类型:

引用类型通常在堆区分配数据空间,但是 golang 中有编译逃逸分析,这个逃逸分析来了之后呢,编译器会根据这个变量到底使用多长时间和实际的情况来决定到底将这个数据放哪。

5.3 标识符的命名规范(重点)

5.3.1 标识符盖帘

标识符就是表示一个变量或者是一个函数,在或者是一个包什么的这些都是叫做标识,符就是符号。所以说我这里终结了两句话:

1、golang 对各种变量、方法、函数等命名时使用的字符序列称为标识符。(说白了使用序列就是字符串)

2、凡是自己可以起名的地方都叫做标识符 ,比如 var num int 这个就叫做标识符,或者var name string 也叫做标识符。

5.3.2 标识符的命名规则有哪些

这里我一共总结了以下 6 点,这 6 点一定要记住

  1. 标识符是由 26 个英文字母的大小写和 0-9 的数字还可以是 _ 组成。

  2. 数字不可以开头。比如 var num int 这个是对的 ,但是我们写成这样var 2num int 就是错的

  3. golang 中严格区分大小写。

    比如说我这有这么两个变量,第一个是 var num int,然后我还有一个变量是 var Num int 在 golang 中认为 num 和 Num 是两个不同的变量

  4. 标识符中不能含空格,也就是说我们在给变量赋值的时候不能带有空格,不然也会报错如:var ab c int = 30 就为错误,abc 这三个单词中间有空格

  5. 下划线 _ 本身在 Go 中就是一个特殊的标识符,称为空标识符。可以代表任何其他的标识符,但是它对应的值会被忽略(比如:忽略某个返回值)。再讲 string 转基础数据类型得那个章节中我们提到过了下划线就是忽略的意思。但是下划线本身不能直接当做一个标识符来使用。

  6. 不能以系统保留关键字作为标识符(系统中一共有 25 个关键字),比如 break, if 等等…

5.3.3 标识符举例说明

5.3.4 标识符命名时的注意事项

标识符命名的时候需要注意一下三点:

5.3.4.1 标识符命名注意事项之包名

  • 包名:每一个 go 文件都应该归属于一个包,那么这个包名的规范又有哪些呢,保持 package 的名称和目录一致(这个不是绝对的 ),尽量采取有意义的包名,简短有意义。不要和标准库起冲突

    • 如下图:我们将 main.go 放到了 main 这个文件中,好做区别,这样的好处是将来我们肯定在 demo04 这个目录下面还有其他的程序文件所需要的文件夹。如下图一个是 main 、一个是 model 。将来我们就可以把关于 model 的一些代码写道 model 这个文件夹下面去,然后我们在到 model 这个文件夹下面取使用它就 ok 了。

5.3.4.2 标识符注意事项之驼峰写法

  • 变量名、函数名、常量名:采用驼峰写法

    • 举例如下:我定义一个 string 类型的学生的名字就像下面这样写

      var stuName string = "tom"      
      var goodPrice float32 = 123.45
      // 驼峰法就是第一个首字母是小写的,然后第二个单词的首字母是大写的。这就叫做驼峰法。

5.3.4.3 标识符注意事项之包得引用

    • 第一步:在 model 文件中创建一个 utils.go 文件

      如果变量名、函数名、常量名首字母大写,则可以被其他的包访问:如果首字母小写,则不能在其他包中访问使用(注:可以简单的理解成,首字母大写是公开的,首字母小写是私有的)

      范例如下:

    // 先在 model 文件夹下面创建一个 utils.go 文件
    
    package model
    
    // 定义一个变量
    var HeroName string = "宋江"  // 这里的首字母一定要大写才能被其他文件夹得包所引用
    • 第二步:在 main 文件夹中写一个 main.go 程序

    package main
    import (
        "fmt"
        // 为了使用 utils.go 文件的变量或者函数,我们需要先引入该包
    
        // 这个就叫做引入了这个包,因为我们在 windows 上加了 GOPATH 变量,所以写相对路径就可以
        "chapter03/demo04/model" 
    )
    
    func main(){
    
        // 并且在引其他文件夹的包的时候需要写上包名加变量名,并且这个变量首写字母为大写
        fmt.Println(model.HeroName) 
    }
  • CMD 执行结果

    执行的时候在执行 main.go 程序就会引用 model.go 程序将其把宋江打印出来

以上演示就是所谓的标识符或者说是变量名首字母大小写的一个很重要的区别,如果是大写也就是说可以挎包跨文件夹使用也叫做可以导出的变量,如果是小写只能够在本包使用也就是在本文件夹使用也叫做不可导出的变量

点赞