2、GO语言基础_变量、常量、数据类型

338 阅读5分钟

一、变量

  • 什么是变量
    • 变量是为存储特定类型的值而提供给内存位置的名称。在go中声明变量有多种语法。
    • 变量的本质就是一小块内存,用于存储数据,在程序运行过程中数值可以改变
    • 变量可以通过变量名访问
  • 声明变量的规则
    • 以字母或下划线开头,由一个或多个字母、数字、下划线组成
  • 关键字
    • var
  • 定义变量
    • 注意Go语言变量一旦定义后续必须要用到,否则会报错
    • 定义变量格式:
      • var 变量名 变量类型
var a int
var s string
  • 变量赋值
    • var 变量名 变量类型 = 值
    • 根据值自行判定变量类型。
    • 在函数内第一次赋值时可以使用:=替代var来定义赋值变量(在函数外不可以),编译器也可以自动决定类型
    • 在函数外定义变量是包内变量(不是全局变量)
    • 如果变量已经使用 var 声明过了,再使用 := 声明变量,就产生编译错误
var a int = 5
var b string = "abbc"
var c,d,e,f = 3,5,true,"def" //不需要显示声明类型,自动推断
  • 变量赋值与其他主流语言的区别
    • 赋值可以进行自动类型推断
    • 在一个赋值语句中可以对多个变量进行同时赋值(拿两个变量交换值举例)
func TestExchange(t *testing.T) {
        a := 1
        b := 2
  //定义中间变量进行变量值的互换
        //tmp := a
        //a = b
        //b = tmp    
  //在Go中可以这么写
        a, b = b, a
        t.Log(a, b)
}
  • 创建一个test文件,编写测试程序
    • 源码文件以_test结尾:xxx_test.go
    • 测试方法名以Test开头: func TestXXX(t *testing.T){...}

image.png

二、常量

  • 什么是常量
    • 常量是一个简单值的标识符,在程序运行时,不会被修改的量。
    • 常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型。
    • 常量还可以用作枚举
  • 关键字 const
    • const可以作为各种类型进行使用
    const a,b = 3,4
    var c int = int(math.Sqrt(a*a + b*b))
  • 变量赋值与其它主流语言的区别
    • 与其他语言差异不大
    • Go语言可以快速设置连续值 例:
const (
   Monday = iota + 1
   Tuesday
   Wednesday
   Thursday
   Friday
   Saturday
   Sunday
)
func TestConstant(t *testing.T) {
    t.Log(Thursday, Sunday)  //输出结果为:4 7
}
//iota,特殊常量值,是一个系统定义的可以被编译器修改的常量值。
//iota只能被用在常量的赋值中,在每一个const关键字出现时,被重置为0,
//然后每出现一个常量,iota所代表的数值会自动增加1,
//iota可以理解成常量组中常量的计数器,不论该常量的值是什么,只要有一个常量,那么iota 就加1。

还可以很方便的做状态位的标识位

const (
   Readable = 1 << iota
   Writable
   Executable
)

func TestConstant1(t *testing.T) {
   a := 7 //0111
   //与运算
   t.Log(a&Readable == Readable, a&Writable == Writable, a&Executable == Executable) //输出结果 true true true

   b := 1                                                                            //0001
   t.Log(b&Readable == Readable, b&Writable == Writable, b&Executable == Executable) //输出结果 true false false
}

三、数据类型

在 Go 编程语言中,数据类型用于声明函数和变量。
数据类型的出现是为了把数据分成所需内存大小不同的数据,编程的时候需要用大数据的时候才需要申请大内存,就可以充分利用内存。

  • 布尔型
    • 布尔型的值只可以是true或者false
  • 数字类型
    • 整型int、浮点型float32,float64 GO语言支持整型和浮点型数字,并且支持复数,其中位的运算采用补码
  • 字符串类型
    • 字符串就是一串固定长度的字符连接起来的字符序列。Go 的字符串是由单个字节连接起来的。Go 语言的字符串的字节使用 UTF-8 编码标识 Unicode 文本。
  • 派生类型
    • 指针类型(Pointer)
    • 数组类型
    • 结构化类型(struct)
    • Channel 类型
    • 函数类型
    • 切片类型
    • 接口类型(interface)
    • Map 类型
  • 数值范围
类型长度(字节)数值范围
int81-128~127 (-2^(8-1) ~ 2^7-1)
uint810~255 (0 ~ 2^8-1)
int162-32768~32767
uint1620~65535
int324-2^31 ~ 2^31-1 (-2147483648~2147483647)
uint3240~ 2^32-1 (0~4294967295)
int648-2^63 ~2^63-1
uint6480~2^63
  • 零值(初始值)

    • 当一个变量或者新值被创建时, 如果没有为其明确指定初始值,go语言会自动初始化其值为此类型对应的零值, 各类型零值如下:
      • bool :false
      • integer :0
      • float :0.0
      • string:""
      • pointer, function, interface, slice, channel, map:nil
    • 对于复合类型, go语言会自动递归地将每一个元素初始化为其类型对应的零值。比如:数组, 结构体 。
  • 与其他主流编程语言的差异

    • Go语言不允许隐式类型转换
    • 别名和原有类型也不能进行隐式类型转换
    • string 是值类型。默认初始化值是空字符串,不是nil
    • 不支持指针运算
type MyInt int64
func TestImplicit(t *testing.T) {
        var a int32 = 1
        var b int64
        //b = a //报错
        b = int64(a) // √
        t.Log(b)
}