在Go语言中,基本数据类型主要有:整数类型、浮点类型、复数类型、布尔类型和字符串类型。跟其他语言不同,go语言将字符串类型作为了基本数据类型,在java中字符串是由字符串类实现的,在C/C++中字符串是借助字符数组实现的。
数值类型
数值类型在计算机编程中用于存储和操作数字。在许多编程语言中,包括Go语言(Golang),数值类型主要分为整数类型和浮点型。此外,go语言还包含了其他语言中没有的复数类型。
整数类型
整数类型根据其存储空间大小和是否带有符号进行分类。
-
有符号整数:有符号整数可以表示正数、零和负数。
int:平台相关,通常为32位或64位。int8:8位有符号整数,取值范围为 -128 到 127。int16:16位有符号整数,取值范围为 -32768 到 32767。int32:32位有符号整数,取值范围为 -2^31 到 2^31-1。int64:64位有符号整数,取值范围为 -2^63 到 2^63-1。
-
无符号整数:无符号整数只表示非负数。
uint:平台相关,通常为32位或64位。uint8:8位无符号整数,取值范围为 0 到 255。uint16:16位无符号整数,取值范围为 0 到 65535。uint32:32位无符号整数,取值范围为 0 到 2^32-1。uint64:64位无符号整数,取值范围为 0 到 2^64-1。
-
其他整数类型:
uintptr:无符号整型,足够容纳指针值。byte:是uint8的别名,常用于表示二进制数据。rune:是int32的别名,表示一个 Unicode 码点。用于处理字符。 rune类型可以用来存储Unicode编码的字符。
// 将字符串转换为rune切片
runes := []rune(s) fmt.Println("rune切片:", runes)
浮点类型
浮点类型用于表示带有小数部分的数字,精度越高,所需要的存储空间越大。
float32:32位浮点数,约有7位小数精度。float64:64位浮点数,约有15位小数精度。
复数类型
复数类型用于表示带有实部和虚部的数。
complex64:由两个float32组成,一个表示实部,一个表示虚部。complex128:由两个float64组成,一个表示实部,一个表示虚部。
布尔类型
布尔类型常用于逻辑运算if else if等。布尔值只有两个可能值:true 或 false。在Go语言中,布尔类型用 bool 表示。
var flag bool = true
布尔类型在条件判断(如 if 语句)和逻辑运算(如逻辑与 &&、逻辑或 ||、逻辑非 !)中非常有用。
字符串类型
字符串类型在Go语言中使用 string 表示。字符串是一种引用类型,其值是不可变的,存储的是Unicode字符序列。字符串可以包含任何Unicode字符,并用双引号 "" 括起来定义。
var greeting string = "Hello, World!"
字符串操作
-
连接:可以使用
+运算符连接两个字符串。fullName := "John" + " " + "Doe"还可以使用
// 使用 strings.Join
strSlice := []string{"Hello", "World", "from", "Go"}
result2 := strings.Join(strSlice, " ")
fmt.Println(result2) // 输出: Hello World from Go
// 使用 fmt.Sprintf name := "Go" age := 10
result3 := fmt.Sprintf("Hello, my name is %s and I am %d years old.", name, age)
fmt.Println(result3) // 输出: Hello, my name is Go and I am 10 years old.
// 使用 bytes.Buffer
var buffer bytes.Buffer
buffer.WriteString("Hello")
buffer.WriteString(" ")
buffer.WriteString("World")
result4 := buffer.String()
fmt.Println(result4) // 输出: Hello World
// 使用 strings.Builder
var builder strings.Builder
builder.WriteString("Hello")
builder.WriteString(" ")
builder.WriteString("World")
result5 := builder.String()
fmt.Println(result5) // 输出: Hello World
-
长度:可以使用
len()函数获取字符串的长度。length := len(greeting) -
切片:可以使用切片操作获取字符串的子串。
subStr := greeting[0:5] // "Hello" -
遍历:可以使用
for循环遍历字符串中的每个字符。for i, char := range greeting { fmt.Printf("Character at index %d is %c\n", i, char) }使用+连接字符串实际上是生成了一个新字符串然后又重新赋值了,如果对于高性能要求的场景,可以使用strings.Builder或bytes.Buffer来进行字符串拼接。
字符串不可变性
字符串一旦创建就不能更改。如果需要修改字符串,需要创建一个新的字符串。例如:
s := "hello" t := "H" + s[1:] // 修改首字符
字符串和字节切片转换
-
字符串到字节切片
byteArray := []byte(greeting) -
字节切片到字符串:
newString := string(byteArray)