【重学Golang】02类型-变量和常量

257 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情

变量

  • 变量 用来表示没有固定值且可改变的数据(计算机角度:变量是用来存储数据的内存)
  • 定义:使用关键字 var定义变量 : var x int ,类型放在变量的后面。运行时会自动初始化零值。
var x int // 自动初始化为 0 
var y = "hello"  // 自动推动出变量 y 类型// 一次定义多个变量
var x, y int         // 相同类型初始化
var x,y = 1, "hello"  // 不同类型初始化// 使用组的方式进行多变量的定义
var (
   x, y int
   a, b = 1, "hello"
    )
  • 简短模式定义变量, 使用方式:变量名 := 值

    • 使用简短模式定义变量需要同时显示初始化
    • 不提供数据类型,直接通过初始化的值推断出变量类型
    • 仅使用在函数内部
func defineParams(){
  x := 1
  a, b := 1, "hello"
}

注意点:

var x = 100 // 全局变量func main(){
  println(&x, x)  // 输出结果:00exl 100
  x := 2  // 局部变量
  println(&x, x)   // 输出结果:0xc783272 2
}
​
func method1() {
  y := 102
  ...
  x,y := 22,993
}
  • 全局变量和局部变量名相同

局部变量定义了和全局变量相同的变量名时对比内存地址,可以发现是不同的变量地址,说明局部变量重新定义了一个变量 x.在使用时都会用到此局部变量。开发时需要注意此操作。

  • 同一个作用域下,有些变量可能不是定义变量,而是退化赋值,详细看以上代码的 method1.其中 变量`y是赋值而不是定义新变量。
  • 在处理函数错误返回值时,退化赋值允许我们重复使用 err 变量
func method2(){
  x,err := os.open("./files/test.txt")
  ...
  buf := make([]byte,1024)
  y,err := f.Read(buf)
}
  • Golang 语法体系中,如果定义了变量却从未使用将会无法通过编译

命名

  • 命名规范:

    • 字母或下划线开始,由多个字母,数字和下划线组合
    • 区分大小写(大小写还有个特性:大写类似public 属性,小写类似 private 属性)
    • 使用驼峰命名规则
    • 局部变量优先使用
    • 不能使用关键字作为变量名
    • 尽量不使用与预定义常量、类型、内置函数相同的名字
    • 专有名词一般都会全部大写
  • 空标识符

    • _ 用来表示忽略占位符,对一些无用的成员可使用 如 x,_ := funcDeal()

常量

常量

  • 常量表示运行时恒定不可改变的值,通常是一些字面量。在编译期是可确定的值。
  • 不常使用的常量不会引起编译错误
  • 显式指定常量类型,那么就需要保证常量值就是该类型
  • 允许通过某些编译器计算出结果的表达式,作为常量值,如 unsafe.Sizeof、len、cap
  • 在常量组中若不指定类型和初始化值,那么都将和上一行的常量一样的类型和值
// 常量定义 x 值必须是int 类型
const x int = 1const strSize = len("hello")
​
const (
  x int = 120
  y         // 和 x 一样的类型和值
  s ="abc"
  z         // 和 s 一样的类型和值
)
​

枚举

  • Go 中是没有 enum 定义,不过可以通过关键字 iota 实现一组自增量值实现枚举

  • 支持多个 iota ,每组单独计数

  • 中断自增,必须显示恢复,且后续将会自动继续递增

  • 支持显式指定类型

    const (
      x = iota  // 0 
      y         // 1
      z         // 2
    )
    // 支持多个 iota ,每组单独计数
    const (
      x,a= iota, iota*10 // 0, 0*10
      y,b                // 1, 1*10
      z,c                // 2, 2*10
    )
    ​
    // 中断自增,必须显示恢复,且后续将会自动继续递增
    const (
      a = iota // 0
      b       // 1
      c = 99   // 99
      d        // 99  和上一行一样
      e = iota // 4 恢复iota 自增,包含 c,d
    )
    ​
    // 显式指定类型,默认是int 类型
    const (
      a =iota   // int 类型
      b float32 = iota // float32 类型
      c = iota // int 类型。不指定的话将会和 b一样
    )
    

    枚举最佳实践

    自定义一个类型作为枚举的类型,主要是为明确该枚举的用途

    type color int  
    const (
      red color = iota
      blue 
      black
    )
    

    常量和变量区别

    • 变量是在运行期间分配存储内存,常量是编译器在预处理阶段直接使用
    • 数字常量不会分配存储空间,无寻址地址