青训营go语言基础总结四:基本数据类型| 豆包MarsCode AI 刷题

68 阅读4分钟

在Go语言中,基本数据类型主要有:整数类型、浮点类型、复数类型、布尔类型和字符串类型。跟其他语言不同,go语言将字符串类型作为了基本数据类型,在java中字符串是由字符串类实现的,在C/C++中字符串是借助字符数组实现的。

数值类型

数值类型在计算机编程中用于存储和操作数字。在许多编程语言中,包括Go语言(Golang),数值类型主要分为整数类型和浮点型。此外,go语言还包含了其他语言中没有的复数类型。

整数类型

整数类型根据其存储空间大小和是否带有符号进行分类。

  1. 有符号整数:有符号整数可以表示正数、零和负数。

    • 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。
  2. 无符号整数:无符号整数只表示非负数。

    • uint:平台相关,通常为32位或64位。
    • uint8:8位无符号整数,取值范围为 0 到 255。
    • uint16:16位无符号整数,取值范围为 0 到 65535。
    • uint32:32位无符号整数,取值范围为 0 到 2^32-1。
    • uint64:64位无符号整数,取值范围为 0 到 2^64-1。
  3. 其他整数类型

    • uintptr:无符号整型,足够容纳指针值。
    • byte:是 uint8 的别名,常用于表示二进制数据。
    • rune:是 int32 的别名,表示一个 Unicode 码点。用于处理字符。 rune类型可以用来存储Unicode编码的字符。

    // 将字符串转换为rune切片 runes := []rune(s) fmt.Println("rune切片:", runes)

浮点类型

浮点类型用于表示带有小数部分的数字,精度越高,所需要的存储空间越大。

  1. float32:32位浮点数,约有7位小数精度。
  2. float64:64位浮点数,约有15位小数精度。

复数类型

复数类型用于表示带有实部和虚部的数。

  1. complex64:由两个 float32 组成,一个表示实部,一个表示虚部。
  2. 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)