前言
Go语言数据类型包括布尔型、数字类型、字符串类型、复合类型这4种。其中复合类型又分为:数组类型、切片类型、Map类型以及结构体类型。
布尔型
与其他编程语言一样,Go语言的布尔型只可以是true或者false。
下面,我们来举例说明使用方式:
var x int=100 fmt.Println(x==100) fmt.Println(x!=100)
需要特别注意的是,Go语言对于值之间的比较有非常严格的限制,只有2相同类型的值才可以进行比较。如果值是接口,则它们必须实现相同的接口。如果其中一个值是常量,则另外一个值可以不是常量,但是类型和该常量必须相同。如果以上条件都不满足,则必须将其中一个值的类型转换为和另一个值相同的类型,才可以进行比较。
在Go语言中,and是 &&;or 是 ||。布尔值也不会被显式的转换为0或1,也不能被强制转换成整型。如果你想把布尔型转换为数字0或1,需要这样写:
func main() { var x int=100 fmt.Println(boolToInt(x==100)) fmt.Println(boolToInt(x!=100)) } func boolToInt(b bool) int{ if b{ return 1 } return 0 }
数字类型
Go语言支持非常多的数字类型,为了让大家更加明了,博主专门列出了一张表格供大家参考。
类型 | 描述 | 范围 |
uint8 | 无符号8位整型 | 0~255 |
uint16 | 无符号16位整型 | 0~65535 |
uint32 | 无符号32位整型 | 0~4294967295 |
uint64 | 无符号64位整型 | 0~18446744073709551615 |
int8 | 有符号8位整型 | -128~127 |
int16 | 有符号16位整型 | -32768~32767 |
int32 | 有符号32位整型 | -2147483648~2147483647 |
int64 | 有符号64位整型 | -9223372036854775808~9223372036854775807 |
float32 | IEEE-754 32位浮点数 | … |
float64 | IEEE-754 64位浮点数 | … |
complex32 | 32位实数和虚数 | … |
complex64 | 64位实数和虚数 | … |
byte | 和uint8等价 | … |
rune | 和int32等价 | … |
unit | 32位或64位无符号整型 | … |
int | 32位或64位有符号整型 | … |
uintptr | 无符号整型,用于存放一个指针 | … |
需要注意的是,在32位操作系统上,int和uint均使用32位(4个字节);在64位操作系统上,它们均使用64位(8个字节)。
字符串类型
在Go语言中,字符串是由单个字节连接起来的,字节使用的是UTF-8编码来表示Unicode文本。由于该编码占用字节长度的不确定性,字符串也会根据需要占用1~4byte。
Go语言这样做,不仅减少了内存和硬盘空间的占用,而且也不用像其他语言那样需要对使用UTF-8字符集的文本进行编码和解码。
下面,我们先来看一段代码:
str1 :="\"liyuanjing\"" + "str1" str2 :="liyuanjing\n" fmt.Print(str2) fmt.Print(str1)
如果大家运行上面这段代码,就会发现str2输出完成之后也会换行,要知道我们这里用的Print,并不是Println。所以,可以得出结论,Go语言字符串支持“\”转义,但转义字符会按意义默认输出。同时,字符串也支持换行链接。
另外,Go语言的字符串,你可以默认看作一个数组,它可以通过“[]”写入索引来获取单个的字符。下面,我们来举一个例子。
str1 :="liyuanjing" //获取字符串索引1(位置2)的字符ASCII编码 fmt.Println(str1[1]) //获取字符串索引1(位置2)的字符 fmt.Println(string(str1[1])) //获取字符串索引0到2的字符(不包括2) fmt.Println(str1[0:2]) //获取字符串索引6开始的所有的字符 fmt.Println(str1[6:]) //获取字符串索引0到2的字符(不包括2) fmt.Println(str1[:2]) //获取字符串长度 fmt.Println(len(str1)) //获取字符串所有字符的ASCII编码 fmt.Println([]rune(str1)) //获取字符串字符个数(长度) fmt.Println(utf8.RuneCountInString(str1))
运行之后,输出控制台类型如下:
需要注意的是,在Go语言中,不能直接修改字符串,也就是不能通过str[1]的方式进行替换修改。如果你要修改,需要将字符串复制到一个可写的变量中,一般是[]byte或[]rune,然后在进行修改。
使用[]byte修改
对于修改字符串的单个字符,可以直接通过[]byte进行修改。示例如下:
str :="liyuanjing" //复制 copyStr :=[]byte(str) //修改字符 copyStr[2]='Y' fmt.Printf("%s\n",str) fmt.Printf("%s\n",copyStr)
需要注意的是,单个字符用’ '单引号。运行之后,输出如下:
使用[]rune修改
话不多说,这里直接上代码。
str :="liyuanjing" //复制 copyStr :=[]rune(str) //修改字符 copyStr[2]='Y' fmt.Println(str) fmt.Println(string(copyStr))
运行之后的效果,如前文所示。
指针类型
学过C语言的应该很容易理解指针,它就是变量存储的一个内存地址的变量类型。比如,大家可以把内存想象成一个顺序存储的方格(只是比喻)。
假如定义的a变量存储6这个数,那么a肯定也在方格中,那么我们可以这样定义指针指向a的内存地址。
var a int=6 var b *int=&a
指针的简单用法
下面,我们来使用指针类型。在Go语言中,可以使用“%p”,输出变量取地址后的指针值。
示例如下:
var a int=6 var b *int=&a fmt.Printf("%p\n",&a) fmt.Printf("%p",b)
运行之后,我们会发现这2个值是相等的,这是因为b存储的本身就是指针值(地址),而通过&a取的也是a的地址,并不是值。如果你再输入&b,意味着是指针的指针,也就是b的地址。(有点绕)
修改指针值
在每次学习心的编程语言时,读者肯定都接触过用一个临时变量,交换2个变量的值。而修改指针同样也需要这么操作。
func main() { a, b := 5, 8 exchange(&a, &b) fmt.Println(a, b) } func exchange(c, d *int) { t := *c *c = *d *d = t }
其实这跟Java与C中的方法,是参数还是参数的引用是一样的。如果不是指针,只是值,这么做并不能改变原始参数的值。