Go语言中,除了常见的整形、浮点型、布尔类型、字符串基本数据类型之外,还包括数组、切片、结构体、函数map、通道等。
在go中整型分为无符号整型、和有符号整型。按长度分为int8
、int16
、int32
、int64
,其对应的无符号整型为uint8
、uint16
、uint32
、uint64
。
类型 | 说明 |
---|---|
int8 |
有符号8位整型,- 2^7 +1到2^7 - 1 |
int16 |
有符号16位整型,- 2^15 +1到2^15- 1 |
int32 |
有符号32位整型,- 2^31 +1到2^31 - 1 |
int64 |
有符号16位整型,- 2^63 +1到2^63 - 1 |
uint8 |
无符号8位整型,0到2^8 - 1 |
uint16 |
无符号16位整型,0到2^16 - 1 |
uint32 |
无符号32位整型,0到2^32 - 1 |
uint64 |
无符号64位整型,0到2^64 - 1 |
注意啊:在32位操作系统中,uint
为uint32
,int
为int32
;在64位操作系统中, uint
为uint64
,int
为int64
;uintptr
为无符号整型,其作用在于存放一个指针。因此,可能会在不同的编译平台中使用程序时,不要使用int
和uint
这两个数据类型,能够防止文件的结构不会受平台限制。
在Go中,定义整型的数据类型时可以使用数字字面量来定义数字。比如num := 0b0101
,其代表了二进制的101
,十进制的5
。八进制以0
开头,十六进制以0x
开头,示例如下:
package main
import "fmt"
func main(){
//十进制
var num10 int = 10
fmt.Printf("%d\n", num10) //十进制输出为10
fmt.Printf("%b\n", num10) //二进制输出为1010
//八进制
var num8 int = 077
fmt.Printf("%o\n",num8) //77
//十六进制
var num16 int = 0xABC123
fmt.Printf("%x\n", num16) //ABC123
Go语言的浮点型分为两种:float32
和float64
。定义时float
默认为float64
。
其中float32
的最大范围为3.4e38
,可使用math.MaxFloat32
来定义。float64
的最大范围为1.8e308
,可以使用math.MaxFloat64
来定义。关于其打印示例:
package main
import "fmt"
import "math"
func main(){
fmt.Printf("%f\n", math.Pi)
fmt.Printf("%2f\n", math.Pi)
}
在go中复数分为complex64和complex128。
复数拥有实部和虚部
在Go中字符串的实现是以UTF8编码,字符串的值为双引号"
中的内容。
Go语言中常见的转义符如下所示:
转义符 | 说明 |
---|---|
\r | 回车符,返回到行首 |
\n | 换行符(跳到下一行的同列的位置) |
\t | 制表符 |
’ | 单引号 |
" | 双引号 |
\ | 反斜杠 |
示例:
package main
import "fmt"
func main(){
fmt.Println(" dir = \"C:\\Go\\src\\github\\string.exe\" ")
}
在Go中定义多行字符串时,需要用到反引号符 (`) ,示例:
package main
import "fmt"
func main(){
str := ` 第一行
第二行
第三行
`
fmt.Println(str)
}
在反引号间的换行将会被视作字符串的换行,文本会原样输出;同时所有的转义字符也会失效,也会在文本中原样输出。
Go找那个字符串可求长度、拼接、分割、包含判断、前后缀判断、子串出现的位置等等。说明如下:
操作 | 函数 |
---|---|
求长度 | len(str) |
拼接字符串 | + 或 fmt.Sprintf |
分割 | strings.Split |
判断是否包含 | strings.Contains |
前\后缀判断 | strings.HasPrefix 、strings.HasSuffix |
子串出现的index | strings.Index、strings.LastIndex |
字符是字符串的每一个元素。字符可以通过单引号(’’)定义,示例:
var s1 := 'a'
var s2 := '张'
var s3 := `진`
在Go中字符分为两类:
byte
类型,也就是uint8
类型,代表了一个ASCII码字符。rune
类型,代表一个UTF8字符,其实际为一个int32
字符。当我们在使用中文、韩文等其他复合字符的时候,就需要用到rune
类型。
在我们遍历复合字符串的时候,因为UTF8由3~4个字节组成,所以不能像英文字符串一样按照字节去遍历字符串。字符串的底层为一个byte
数组,所以可以和[]byte
类型相互转换。遍历含中文的字符串示例:
package main
import "fmt"
func traverStr(str string){
for _, s := range str{ //rune
fmt.Printf("%v(%c) ", s, s)
}
//输出:104(h) 101(e) 108(l) 108(l) 111(o) 20013(中) 22269(国)
fmt.Println()
}
func main(){
s := "hello中国"
traverStr(s)
}
修改字符串时先要将其转换成[]rune
或[]byte
,完成后再转换为string
。在过程中会重新分配内存并且复制字节数组
示例:
func changeStr(){
str1 := "hello"
byteStr1 := []byte(str1)
byteStr1[1] = 'o'
fmt.Println(string(byteStr1))
str2 := "小米"
runeStr2 := []rune(str2)
runeStr2[0] = '大'
fmt.Println(string(runeStr2))
}
在Go语言中只存在强制类型转换,不存在隐式类型转换。
示例:
func test(){
var c,k = 3, 4
var x int
//math.Sprt()的参数为float64类型
x = int(math.Sprt(float64(c*c + k*k)))
fmt.Println(x)
}