[Golang]类型和变量
Posted @书生
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Golang]类型和变量相关的知识,希望对你有一定的参考价值。
注:
Go不同于C语言,它有更简洁的追求,每条语句尽量占据一行,且语句结束的时候可以不添加分号(" ; "),编译器会自动进行添加。当然如果你想将两条语句放入一行的话,那么还是应该乖乖的加上分号。
变量:
变量名也就是标识符,只能够包含字母,数字和下划线(""), 且不能够以数字开头,在Go中,不能够使用单独的下划线表示一个变量,单独的下划线在Go中表示一个占位符,在接收多个函数返回值的时候,我们可以使用单独的下划线("")表示忽略这个返回值;
在变量的声明和赋值的时候,Go也有着自己独特的风格:数据类型是在变量名称之后的;
eg:我们声明一个int类型的变量val,其代码为:
var val int
//var为关键字,用于声明变量
//val变量名
//int 变量的数据类型
对于一个变量,我们可以先声明,在进行赋值;如果只声明而不进行赋值的话,变量会使用该数据类型的默认值;(默认值的问题,我们会在下面讨论)
var val int
val = 7
我们还可以声明和赋值放到一起
var val int = 7
上面的这种形式,可以在任何地方进行使用;Go换提供了一个更加简洁的但是只能够在函数体内使用声明和赋值一起的方法
val := 7
//变量名称 := 值
//这种形式,只能够在函数中定义局部变量使用,在函数外定义全局变量的时候,如果使用这种方式的话,会报错:
syntax error: non-declaration statement outside function body
当然,在上面的这种变量声明赋值的时候,我们是没有指定数据类型的,编译器会对变量的类型进行推演
如果要声明多个变量的话,是可以成组的,需要使用到圆括号"()"
eg:
var (
a int
flag bool
)
此外,有相同数据类型的变量可以在一行进行声明,也可以平行赋值
var a,b int
a,b =3,4
//注意,上面两行代码不能够同时出现在函数体外,即在函数体外使用var a,b int语句来声明两个变量,不能在函数体外使用a,b=3,4进行赋值
//上面的代码可以使用a,b := 3,4来代替,同样此语句不能用于函数体外
//如果希望在函数体外,声明变量a,b并且给a赋值为3,b赋值为4,可以使用下面的语句
var a,b int =3 , 4
特殊的变量
前面我们就提到,单独的下划线("_")是被当作占位符来使用的,任何赋予它的值都会被丢弃掉
_,a :=1,2
1会被丢弃,2会赋值给a
//_ 我们也可以成这个变量为匿名变量,不会分配内存也不占命名空间
常量:
在Go中,同样也是使用const关键字来声明一个常量;
常量在编译的时候就会被创建,但是常量的数据类型相比于变量来说是有限制的,只能是数字,字符串或者是布尔值;
声明多个常量同样可以成组,使用"()"
const (
a int =7
b bool =true
c string ="hello world"
)
可以使用iota可以生成一个枚举值,第一个iota的值为0,iota再次在新的一行中使用的时候,值会增加1
const (
a=iota
b=iota
c=iota
)
我们预期 a=0 b=1 c=2 通过执行程序,我们打印,查看结果:
接下来,我们再看另一个程序,预测其中常量的值;可能这次预测的值于真实结果不同,具体原因,我们可以看上面的加粗文字"iota再次在新的一行中使用的时候,值会增加1 "
基本数据类型:
数据类型也决定了变量存储占用的空间大小
1 byte = 8 bits
我们可以使用unsafe包中的Sizeof函数来得到一个变量占用多少字节
var basicSizes = [...]byte{
Bool: 1,
Int8: 1,
Int16: 2,
Int32: 4,
Int64: 8,
Uint8: 1,
Uint16: 2,
Uint32: 4,
Uint64: 8,
Float32: 4,
Float64: 8,
Complex64: 8,
Complex128: 16,
}
上面表示每种数据类型的变量占用的空间大小,单位为字节
int和uint类型
Golang中和其他语言不同,int和uint类型的变量占用的空间大小与操作系统有关;
在32位操作系统中,占用4个字节
在64位操作系统中,占用8个字节
这与其底层实现有关
在声明变量的时候,如果我们没有指定数据类型,进行推导时,整数默认为int ,小数也就是浮点数默认为float64
#ifdef _64BIT
typedef uint64 uintptr;
typedef int64 intptr;
typedef int64 intgo; // Go's int
typedef uint64 uintgo; // Go's uint
#else
typedef uint32 uintptr;
typedef int32 intptr;
typedef int32 intgo; // Go's int
typedef uint32 uintgo; // Go's uint
#endif
byte和rune
// byte 是 uint8 的别名,且在所有方面都等同于uint8。按惯例,它用于区分字节和8位无符号整数。
type byte = uint8
// rune 是 int32 的别名,且在所有方面都等同于int32。按惯例,它用于区分字符和整数。
type rune = int32
在Go中是没有C语言中char这种字符数据类型,如果在遍历字符串的时候,如果希望挨个字节进行遍历,可以转换为byte类型的切片
如果希望遍历每个字符,需要转换为rune类型的切片
string
字符串就是一串固定长度的字符连接起来的字符序列。
Go 的字符串是由单个字节连接起来的。Go 语言的字符串的字节使用 UTF-8 编码标识 Unicode 文本.
在前面,我们也提到过Go中的字符串有两种表现形式:
双引号(" "),反引号(``)括起来的字符序列
两者的区别在于 :
双引号字符串会进行转义字符的转义输出
反引号字符串会以原格式进行输出
常用的转移字符(转义字符是以\\开始的)
\\n 表示换行
\\r 表示回车,即将/r之后的字符从本行头部开始输出会覆盖之前的内容
\\t 表示制表符
Go的关键字
break default func interface select
case defer go map struct
chan else goto package switch
const fallthrough if range type
continue for import return var
var:声明变量
const :声明常量
type:用于自定义数据类型
数据类型转换
在Go中是不存在隐式类型转换这个概念的,任何类型转换必须通过函数或者显示类型转换
即使式下面的这种情况,也必须进行显示类型转换
type INT int
var i int=7
var j INT = INT(i) //显示类型转换
Go中Swap
我们如果想交换两个变量的数值,通常会建立一个中间变量,当然存在更优的方法,进行位运算
var a int = 7
var b int = 10
var tmp int
tmp = a
a = b
b = tmp
var a int = 7
var b int = 10
a = a^b
b = a ^ b
a = a ^ b
但是在Go中存在这更加简洁的方式
a,b = b,a //按照从左到右的顺序赋值
注:如果本篇博客有任何错误和建议,欢迎伙伴们留言。
以上是关于[Golang]类型和变量的主要内容,如果未能解决你的问题,请参考以下文章