变量和常量(Go语言)

变量

概念

变量是计算机语言中存储数据的抽象概念。变量的功能是存储数据。变量通过变量名访问。

变量的本质是计算机分配的一小块内存,专门用于存放指定数据,在程序运行过程中该数值可以发生改变。

变量的存储往往具有瞬时性,或者说是临时存储,当程序运行结束,存放该数据的内存就会释放,而该变量就会消失。

Go语言的变量名有字母,数字,下划线组成,首个字符不能为数字。

Go语法规定,定义的局部变量若没有被调用则编译错误。

命名:驼峰标识,不建议用下划线连接多个单词。

声明变量

变量声明有多种形式

//未初始化的标准格式
var 变量名  变量类型
// 未初始化的批量格式
var  (
	a int
	b string
	c []float32// 未初始化变量的默认值
// 整形和浮点型变量默认值:0
// 字符串默认值是空字符串
// 布尔型默认值为false
// 函数,指针变量初始值为nil

// 初始化变量的标准格式
var 变量名  类型 = 表达式
// 初始化变量的编译器自动推断类型格式
var 变量名 = 表达式
// 初始化变量的简短声明格式
变量名 := 表达式
// 使用 := 赋值操作符,可以高效地创建一个新的变量,称之为初始化声明
// 声明语句省略var关键字
// 这是声明变量的首选形式,但是它只能被用在函数体内,而不可以用于全局变量的声明与赋值
// 该变量名必须是没有定义过的变量,若定义过,将发生编译错误。
// 在多个简短变量声明和赋值中,至少有一个新声明的变量出现在左侧中,那么即便有其他变量名可能是重复声明,编译器也不会报错。

变量多重赋值(多个变量同时赋值)

Go语法中,变量初始化和变量赋值是两个不同的概念。Go语言的变量赋值与其他语言一样,但是Go提供了其他程序员期待已久的多重赋值功能,可以实现变量交换。多重赋值让Go语言比其他语言减少了代码量。

	z ,t:= 1 ,2
	z, t = t , z

匿名变量

Go语言的函数可以返回多个值,而事实上并不是对所有的返回值都用得上,那么就可以使用匿名变量,用“_”下换线替代即可。

匿名变量不占用命名空间,不会分配内存。

数据类型

基本数据类型(原生数据类型):整形,浮点型,布尔型,字符串,字节byte和字符rune.

复合数据类型(派生数据类型):指针(pointer),数组(array),切片(slice),映射(map),函数(function),结构体(struct),通道(channel)

整形

整形分两大类

  • 按长度分: int8,int16 int32 int64 int
  • 无符号整形 uint8, uint16 uint32 uint 64 uint
  • 其中uint8就是byte型,int16对应C语言的short型,int64对应C语言的long型

浮点型

Go语言支持4种浮点型书: float32,float64,float64 ,cmplex64(32位实数和虚数),complex128(64位实数和虚数)

float32 的最大范围是3.4e38,用常量定义的是math.MaxFloat32

float64的最大范围是1.8e308,用常量定义的是math.MaxFloat64

布尔型

声明方式: var flag bool

布尔型无法参与数值运算,也无法与其他类型进行转换

字符串

字符串在Go语言中是一基本数据类型出现的,使用字符串像使用其他原生基本数据类型int,float32,float64,bool一样。

  • 字符串可以使用转义符
    • \r 回车符return,返回行首
    • \n 换行符 new line 直接跳到下一行的同列位置
    • \t 制表符TAB
    • \’ 单引号
    • \" 双引号
    • \\ 反斜杠
  • 定义多行字符串
    • 双引号书写字符串被称为字符串字面两(string literal) .这种字面量不能跨行
    • 多行字符串需要使用"`"反引号,多用于内嵌源码和内嵌数据
    • 在反引号中的所有代码不会被编译器识别,而是作为字符串的一部分

字符

字符串中的每一个元素叫做“字符”,定义字符时使用单引号。Go语言的字符有两种:

  • byte型: 其实就是uint8的别名。代表了一个ASCII码的一个字符

  • rune型: 其实就是int32。代表一个UTF-8字符。当需要处理中文等unicode字符集时需要用到rune型

    var a byte ='a'
    var b rune ='-'
    

打印格式化

通用

  • %v 值得默认格式标识 value
  • %+v 类似%v,但输出结构体时会添加字段名
  • %#v 值的Go语法表示
  • %T 值的类型的Go语言表示 type

布尔

%t 单词true或false true

整形

  • %b 表示为二进制 binary
  • %c 该值对应的unicode码值 char
  • %d 表示为十进制 digital
  • %8d 表示该整形长度是8,不足8则在数值前补空格。如果超出8,则以实际为准。
  • %08d 数字长度为8,不足8位的,在数字前补0.如果超出8,则以实际为准
  • %o 表示为八进制 octal
  • %q 该值对应的单括号括起来的go语法字符字面值,必要时会采用安全的转义表示 quotation
  • %x 表示为十六进制,使用a-f hex
  • %X 表示为十六进制,使用A-F
  • %U 表示Unicode格式:U+1234 等价于“U+%0.4x”

浮点数与复数

  • %b 无小数部分,二进制指数的科学计数法,如-123456p-78 参见strconv.FormatFloat
  • %e (=%.6e) 有6位小数部分的科学计数法,如-1234.456e+78
  • %E 科学计数法,如-1234.456E+78
  • %f (=%.6f)有6位小数部分 如123.456123 float
  • %F 等价于%f
  • %g 根据实际情况采用%e或%f格式
  • %G 根据实际情况采用%E或%F格式

字符串和[]byte

  • %s 直接输出字符串或者[]byte string
  • %q 该值对应的双引号括起来的Go语法字符串字面值,必要时会采用安全的转义表示
  • %x 每个字符用两个字符十六进制数表示(a-f)
  • %X 每个字符用两个字符十六进制数表示(A-F)

指针

  • %p 表示为十六进制,并加上前导的0x pointer
  • 没有%u.整形如果是无符号类型自然输出也是无符号。没有必要指定操作数的类型(int8,int64)
  • 宽度通过一个紧跟在百分号后面的十进制数指定,如果为指定宽度,则表示值是除必需之外不做填充。精度通过(可选的)宽度后跟的十进制数指定。如果未指定精度,会使用默认精度;如果点号没有跟数字,表示精度为0

数据类型转换

数据类型转换格式

  • T(表达式)

    采用数据类型前置加括号的方式进行类型转换。T表示要转换的类型;表达式包括变量,数值,函数返回值等。

    类型转换时,需要考虑两种类型之间的关系和范围,是否会发生数值损失

    布尔型无法与其他类型进行转换

  • float与int 之间转换

    需要注意 float转int时精度损失

  • int 转string

    其实相当于是byte或者rune转string

    该int数值是ASCll码的编号或Unicode字符集的编号。转成string就是根据字符集,将对应编号的字符查找出来。

    当前数值超出Unicode编号范围,则转成的字符串显示为乱码

  • string 转int

    不允许字符串转int

常量

声明方式

  • 相对于变量,常量是恒定不变的值,例如 圆周率

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

  • 常量中的数据类型只能是布尔型,整型,浮点型,复数和字符串。

  • 常量定义格式

    • const 标识符 [类型] = 值
    • 可以省略类型说明[类型],编译器会根据变量的值来自动推断类型
      • 显式类型定义 : const A string = “zxt”
      • 隐式类型定义 :const B =“zxt”
  • 多个相同类型的声明可以简写为:

    const A ,B = 1546,666

  • 常量定义后未被使用,不会再编译时出错

枚举

  • 常量用于枚举
const (
	zxt = 100
	aa = 55
	cc = 555
)			
  • 常量组中如果不指定类型和初始值,则与上一行非空常量的值相同
const(
	a = 11
	b
	c		
)

iota

  • iota,特殊常量值,系统定义的可以被编译器修改的常量值。iota只能用在常量赋值中。
  • 在每一个const关键字出现时,被重置为0,然后每出现一个常量,iota所代表的数值会自动增加1。iota可以理解成常量组中常量的计数器,不论该常量是什么,只要有一个常量,那么iota就加1
  • iota可以被用作枚举值
const(
	a = iota
	b = iota
	c = iota		
)
  • 常量组中如果不指定类型和初始值,则与上一行非空常量的值相同。

类型别名(Type Alias)

简述

类型别名是Go1.9版本添加的新功能。主要用于代码升级,迁移中类型的兼容性问题。

在Go1.9版本前内建类型定义的代码是:

type byte uint8
type rune int32	

在Go1.9版本之后变更为:

type byte = uint8
type rune = int32	

类型别名与类型定义

类型别名的语法格式

type 类型别名 = 类型	

定义类型的语法格式

type 新类型名 类型	

非本地类型不能定义方法

不能为不在同一个包中的类型定义方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值