目录

Golang 的数据类型

Go 语言编程 — 基本数据类型_Golang

Golang 的数据类型通常可以区分为:

  • 基本类型:Boolean,Numeric,String 类型。
  • 派生类型:Array,Struct,Slice,Map,Pointer,Function,Channel,Interface 类型。可以使用 type 语句构造。可以细分为:
    • Aggregate:Array,Struct。
    • Reference:Slice,Map,Pointer,Function,Channel。
    • Interface。

注:其中 Array,Struct 是定长的,而 Slice,Map 是变长的。

基本数据类型

布尔型(Boolean)

  • True
  • False

数字类型(Numeric)

整型

  • int8:有符号 8 位整型,[-128, 127]
  • uint8:无符号 8 位整型,[0, 255]
  • int16:有符号 16 位整型,[-32768, 32767]
  • uint16:无符号 16 位整型,[0, 65535]
  • int32:有符号 32 位整型,[-2147483648, 2147483647]
  • uint32:无符号 32 位整型,[0, 4294967295]
  • int64:有符号 64 位整型,[-9223372036854775808, 9223372036854775807]
  • uint64:无符号 64 位整型,[0, 18446744073709551615]

浮点型

  • float32:32 位浮点型数
  • float64:64 位浮点型数
  • complex64:32 位实数和虚数
  • complex128:64 位实数和虚数

其他

  • byte:uint8 的别名
  • rune:int32 的别名
  • uint:32 或 64 位,取决于操作系统
  • int:32 或 64 位,取决于操作系统
  • uintptr:无符号整型指针

字符串类型(String)

字符串的本质是一串固定长度的字符连接起来的字符序列。区别于 C 语言中的字符串是由若干个字符组成的,而 Golang 的字符串是由若干个字节连接起来的。

Golang 的字符串的字节使用 UTF-8 编码标识 Unicode 文本。字符串数据类型的定义很简单,使用双引号 “ " ” 或者反引号 “ ` ”来创建。区别在于:双引号之间的转义符会被转义,而反引号之间的字符保持不变。

另外,Golang 与 C 语言一样,单引号 “ ’ ” 用于标识一个字符。可以使用 string(char) 将一个字符转换成一个包含了单个字符的字符串。

var c = 'c'

示例:

package main

import "fmt"

func main() {
    var a string = "hello \n world"
    var b string = `hello \n world`
    fmt.Println(a)
    fmt.Println(b)
}

结果:

hello 
 world
hello \n world

更改字符串数值

注意,因为 Golang 中的字符串本质是由若干个(已编码)的字节组成的。所以,数据类型可以看作是一个常量类型,一旦赋值了就不能再修改。

var s = "hello world"
s[0] = 'c'    // 报错

如果实在需要修改字符串,则应该这么做:

func main() {
    var s1 string = "hello"
    c := []rune(s1)              // 将 s1 转换为 rune 数组。
    c[0] = 'c'                   // 修改数组的第一个元数。
    var s2 string = string(c)    // 创建新的字符串 s2,强制类型转换 c 数值。
    fmt.Println("%s \n", s2)
}

rune() 函数是 int32 的别名,用 UTF-8 进行编码。当我们需要遍历字符串的字符时,可以用于混换每个字节。

简而言之,为了获得字符串每个实际的字符,需要使用 rune 类型:

var s = "你好"
fmt.Println(len(s))
c := []rune(s)
fmt.Println(len(c),c)

结果:

6
2 [20320 22909]

多行字符串

当需要书写多行字符串时候需要注意,因为 Golang 会在每行的行末自动添加分号,所以字符串连接符 “+” 一定要放在换行的行末:

// 正确
s := "Starting part" +
     "Ending part"

// 错误
s := "Starting part"
     + "Ending part"

也可以考虑使用反引号,但此时 s 中也包含了换行符,因为反引号中间的字符会保持不变。所以通常用在多行打印的情况:

package main

import "fmt"


func main() {
    s := `Starting part
    Ending part`
    fmt.Println(s)
}

输出:

Starting part
    Ending part