Go 语言变量,常量

简介: iota,特殊常量,可以认为是一个可以被编译器修改的常量。常量计数器iota 在 const关键字出现时将被重置为 0(const 内部的第一行之前),const 中每新增一行常量声明将使 iota 计数一次(iota 可理解为 const 语句块中的行索引)。


1.变量


基本使用


声明变量的一般形式是使用 var 关键字:


package main
import "fmt"
func main() {
  var a string = "IMUSTCTF"
  fmt.Println(a)  // IMUSTCTF
  var b, c int = 1, 2
  fmt.Println(b, c)  // 1 2


值类型和引用类型


所有像 intfloatboolstring 这些基本类型都属于值类型,使用这些类型的变量直接指向存在内存中的值:



当使用等号 = 将一个变量的值赋值给另一个变量时,如:j = i,实际上是在内存中将 i 的值进行了拷贝:



你可以通过 &i 来获取变量 i 的内存地址,例如:0xf840000040(每次的地址都可能不一样)


值类型变量的值存储在堆中🌭


使用 := 赋值操作符


我们知道可以在变量的初始化时省略变量的类型而由系统自动推断,声明语句写上 var 关键字其实是显得有些多余了,因此我们可以将它们简写为 a := 50 或 b := false。


a 和 b 的类型(int 和 bool)将由编译器自动推断。


package main
import "fmt"
func main() {
  a := 521
  fmt.Println(a)  // 521
}


如果你声明了一个局部变量却没有在相同的代码块中使用它,同样会得到编译错误,例如下面这个例子当中的变量 a:


package main
import "fmt"
func main() {
   var a string = "abc"
   fmt.Println("hello, world")
}


尝试编译这段代码将得到错误 a declared but not used


2.常量


常量是一个简单值的标识符,在程序运行时,不会被修改的量。

你可以省略类型说明符 [type],因为编译器可以根据变量的值来推断其类型。

显式类型定义: const b string = "abc"

隐式类型定义: const b = "abc"


package main
import "fmt"
func main() {
  const PI = 3.1415926
  fmt.Println(PI)  // 3.1415926
}


常量还可以用作枚举:


package main
import "fmt"
func main() {
  const (
    Unknown = 0
    Female  = 1
    Male    = 2
  )
  fmt.Println(Unknown, Female, Male)  // 0 1 2
}


在定义常量组时,如果不提供初始值,则表示将使用上行的表达式


package main
import "fmt"
const (
    a = 1
    b
    c
    d
)
func main() {
    fmt.Println(a)
    // b、c、d没有初始化,使用上一行(即a)的值
    fmt.Println(b)   // 1
    fmt.Println(c)   // 1
    fmt.Println(d)   // 1
}


iota


iota,特殊常量,可以认为是一个可以被编译器修改的常量。常量计数器


iota 在 const关键字出现时将被重置为 0(const 内部的第一行之前),const 中每新增一行常量声明将使 iota 计数一次(iota 可理解为 const 语句块中的行索引)。


iota 可以被用作枚举值:


package main
import "fmt"
func main() {
  const (
    a = iota
    b
    c
  )
  fmt.Println(a, b, c)  // 0 1 2
}


iota 用法


package main
import "fmt"
func main() {
  const (
    a = iota //0
    b        //1
    c        //2
    d = "ha" //独立值,iota += 1
    e        //"ha"   iota += 1
    f = 100  //iota +=1
    g        //100  iota +=1
    h = iota //7,恢复计数
    i        //8
  )
  fmt.Println(a, b, c, d, e, f, g, h, i)  // 0 1 2 ha ha 100 100 7 8
}
目录
相关文章
|
13天前
|
存储 Go 索引
go语言中数组和切片
go语言中数组和切片
25 7
|
13天前
|
Go 开发工具
百炼-千问模型通过openai接口构建assistant 等 go语言
由于阿里百炼平台通义千问大模型没有完善的go语言兼容openapi示例,并且官方答复assistant是不兼容openapi sdk的。 实际使用中发现是能够支持的,所以自己写了一个demo test示例,给大家做一个参考。
|
13天前
|
程序员 Go
go语言中结构体(Struct)
go语言中结构体(Struct)
90 71
|
12天前
|
存储 Go 索引
go语言中的数组(Array)
go语言中的数组(Array)
98 67
|
13天前
|
存储 Go
go语言中映射
go语言中映射
31 11
|
15天前
|
Go
go语言for遍历映射(map)
go语言for遍历映射(map)
28 12
|
14天前
|
Go 索引
go语言使用索引遍历
go语言使用索引遍历
25 9
|
14天前
|
Go 索引
go语言使用range关键字
go语言使用range关键字
23 7
|
14天前
|
Go 索引
go语言修改元素
go语言修改元素
25 6
|
5天前
|
Go 数据安全/隐私保护 UED
优化Go语言中的网络连接:设置代理超时参数
优化Go语言中的网络连接:设置代理超时参数