个人理解的是,go里面的变量和const修饰的常量其实是不同的概念,做了一个彻底的区分。
对变量的定义:引入了关键字var对变量进行声明
var a int
var b string
var c float64
var e [4] int // 数组
var f [] int //数组切片
var f * int //正确
var v1 int = 5 //正确
var v2 = 5 //正确,编译器自动推导出V2类型
v3 := 5 //正确,编译器自动推导出V3的类型
多重赋值
Go语言提供了大多数的语言所不支持的多重赋值,使得变量的的变换变得十分简单,多重赋值的一个例子,就是不要像c语言一样使用中间的变量
i := 2
j := 3
i , j = i , i //交换i与j的值
变量的类型
获取变量的大小
//使用unsafe
package main
import (
"fmt"
"unsafe"
)
func main(){
var a int64 = 10000
fmt.Println("length of a : " , unsafe.Sizeof(a))
}
布尔类型
Go语言提供内置的布尔值true和false,Go语言支持标准的逻辑比较和比较操作,但是操作结果都是布尔值。在go里面是不允许将其他的类型转换为bool类型的,比如int类型。必须使用false以及true。
var f * int //正确
var v1 int = 5 //正确
var v2 = 5 //正确,编译器自动推导出V2类型
v3 := 5 //正确,编译器自动推导出V3的类型
字符串
go的字符串和c里面的不同,使用的是UTF-8的一个序列,不再是ASCII,因为UTF-8的编码不定长比较灵活,所以一个字符串的大小也可能是1到4个字节。Go 这样做的好处是不仅减少了内存和硬盘空间占用,同时也不用像其它语言那样需要对使用 UTF-8 字符集的文本进行编码和解码。
t1 := "\"hello world\""
t2 := "\u5b32\u8FCE"
t2 := `"hello"`
转义字符 | 含义 |
---|---|
\\ | 表示反斜线 |
' | 单引号 |
" | 双引号 |
\n | 换行符 |
\uhhhh | 4 个 16 进制数字给定的 Unicode 字符 |
在 Go 语言中单个字符可以使用单引号( ' )来创建。之前的课程中,我们有学习过rune
类型,它等同于int32
,在 Go 语言中,一个单一的字符可以用一个单一的rune
来表示。这也是容易理解的,因为 Go 语言的字符串是 UTF-8 编码,其底层使用 4 个字节表示,也就是 32 bit。
在 Go 语言中,字符串支持切片操作,但是需要注意的是如果字符串都是由 ASCII 字符组成,那可以随便使用切片进行操作,但是如果字符串中包含其他非 ASCII 字符,直接使用切片获取想要的单个字符时需要十分小心,因为对字符串直接使用切片时是通过字节进行索引的,但是非 ASCII 字符在内存中可能不是由一个字节组成。如果想对字符串中字符依次访问,可以使用range操作符。另外获取字符串的长度可能有两种含义,一种是指获取字符串的字节长度,一种是指获取字符串的字符数量。
字符串支持以下操作:
语法 | 描述 |
---|---|
s += t | 将字符串 t 追加到 s 末尾 |
s + t | 将字符串 s 和 t 级联 |
s[n] | 从字符串 s 中索引位置为 n 处的原始字节 |
s[n:m] | 从位置 n 到位置 m-1 处取得的字符(字节)串 |
s[n:] | 从位置 n 到位置 len(s)-1 处取得的字符(字节)串 |
s[:m] | 从位置 0 到位置 m-1 处取得的字符(字节)串 |
len(s) | 字符串 s 中的字节数 |
len([]rune(s)) | 字符串 s 中字符的个数,可以使用更快的方法 utf8.RuneCountInString() |
[ ]rune(s) | 将字符串 s 转换为一个 unicode 值组成的串 |
string(chars) | chars 类型是[]rune 或者[]int32, 将之转换为字符串 |
[ ]byte(s) | 无副本的将字符串 s 转换为一个原始的字节的切片数组,不保证转换的字节是合法的 UTF-8 编码字节 |