编辑
2022-09-22
Golang
00
请注意,本文编写于 791 天前,最后修改于 433 天前,其中某些信息可能已经过时。

目录

数据类型
字符串类型(string)
字符串定义
字符串拼接
布尔类型(bool)
数值类型
有符号整数(int)和无符号整数(uint)
有符号整数范围
无符号整数范围
整数别名类型(字符类型 byte 、 rune)
浮点类型(float32 、 float64)
复数(complex128、complex64)
默认零值
别名类型
定义类型

数据类型

这里介绍 go 中可用的基本数据类型

字符串类型(string) 布尔类型(bool) 数值类型

  • 有符号整数(int 等)和无符号整数(uint 等)
  • 整数别名类型(byte 、 rune)
  • 浮点类型(float32 、 float64)
  • 复数(complex128、complex64)

零值 别名类型 定义类型

字符串类型(string)

字符串定义

字符串是一个字节序列。可以使用双引号("")跨越多行的反引号(``) 声明

双引号:会识别转义内容
反引号:原生内容,不进行转义,可用于防攻击,输出源码等场景

相关信息

go 中的字符串不可以使用 单引号 定义

单引号专用于字符的定义

go
var a string = "go" var b string = `one line` var c string = `two lines` var str7 = `\n\\` var str8 = "\n\\" println(str7, str8)

字符串拼接

go
// 字符串拼接,使用加号 var str9 = "hello" + "world" println(str9) // 字符串拼接的折行会自动识别 var str10 = "11111" + "22222" + "333333" + "444444" println(str10)

布尔类型(bool)

布尔类型有两种值: true 和 false

go
var a bool = true var b bool = false

数值类型

有符号整数(int)和无符号整数(uint)

  • intuint 不指定 bit 位则默认取当前系统位数。例如 64位系统中 int 就是 int64

  • intxuintx 中 x 表示 x bit 的取值范围。例如 int8 指的是 8bit,即一个字节, 0-255 个值

    • int: 表示有符号,则 int8 就是 -128 ~ 127

    • uint: 表示无符号,则 uint8 就是 0 ~ 255

有符号整数范围
go
// go 会自动识别该数值大小 var i int = 118323 // -128 to 127 var i8 int8 = 127 // -2^15 to 2^15 - 1 var i16 int16 = 32767 // -2^31 to 2^31 - 1 var i32 int32 = -2147483647 // -2^63 to 2^63 - 1 var i64 int64 = 9223372036854775807
无符号整数范围
go
// go 会自动识别该数值大小 var i int = 118323 // -128 to 127 var i8 int8 = 127 // -2^15 to 2^15 - 1 var i16 int16 = 32767 // -2^31 to 2^31 - 1 var i32 int32 = -2147483647 // -2^63 to 2^63 - 1 var i64 int64 = 9223372036854775807 // 无符号整数指针uintptr类型,用于表示内存地址 var uiptr uintptr

相关信息

可以看到有一个 uintptr 类型的无符号整数指针。它是内存地址的整数表示。 一般编程中不会使用,所以不用担心

应该使用哪种整数类型?

int

建议每当我们需要一个整数值时,我们应该只使用int 除非我们有特定的理由使用大小或无符号整数类型。

整数别名类型(字符类型 byte 、 rune)

Golang 有两个额外的整数类型,分别是:

  • byte 表示一个字节的值
    • 英文 1byte, 中文 3byte
  • rune 表示一个 Unicode编码的值
    • 英文 1rune,中文 1rune

相关信息

  1. 双引号括起来的字符串表示的是一个由多个字符组成的文本,而不是单个字符

    所以字符类型只能使用 单引号进行定义

  2. 字符类型的值实际是 字符码 或 Unicode 码的值,本质是数值

go
// 数据类型`byte` 的别名 `uint8` type byte = uint8 // 数据类型`rune`的别名 `int32` type rune = int32
go
// 英文字母 var str1 byte = 'a' var str2 byte = '0' // 中文超过一个 byte,只能定义为 int var str3 int = '张' var str4 rune = '大' // byte类型输出的是字符码的值, U+0061 println(str1) // 需要输出对应字符需要格式化 // %c 是用来格式化和打印一个 Unicode 字符 // %d 则是用来格式化和打印一个十进制整数 println("c%", str2) println("d%", str3) println("c%", str4)

浮点类型(float32 、 float64)

浮点类型,用于存储带有小数部分的数字。

  • 浮点类型分为两种
    • float32: 单精度 4 字节,非零整数部分 + 小数部分 共 8 位
    • float64: 双精度 8 字节,非零整数部分 + 小数部分共 16 位
  • 与 int 不同,不受系统位数影响,默认声明为 float64
  • 开发中推荐使用 float64,精度更高,或使用 decimal 包
go
// float64 精度更高 var num21 float32 = -123.0000901 var num22 float64 = -123.0000901 // -123.00009, -123.0000901 println(num21, num22)

复数(complex128、complex64)

Go 中有 2 种复杂类型

  • complex128 实部和虚部都在float64
  • complex64实部和虚部都在float32

我们可以使用内置的 complex 函数或文字来定义复数。

go
// 方法 1 var c1 complex128 = complex(10, 1) // 方法 2 var c2 complex64 = 12 + 4i

默认零值

在 Go 中,任何没有显式初始值声明的变量都会被赋予其零值。

image.png

go
var i int var f float64 var b bool var s string fmt.Printf("%v %v %v %q\n", i, f, b, s)

image.png

相关信息

go 中并不会像大部分语言,将未初始化的变量初始化为 null 或 undefined

如上所见: intfloat 分配为 0 boolfalse string 为 空字符串 ""

别名类型

别名类型是在 Go 1.9 中引入的。它们允许开发人员为现有类型提供替代名称,并将其与基础类型互换使用,本质上还是这个类型。

go
package main import "fmt" // 定义了一个类型,他实质还是 string,只是换了个名字 type MyAlias = string func main() { // 使用别名类型 var str MyAlias = "I am an alias" // 这里可以看到类型的本质,还是 string // Output: string - I am an alias fmt.Printf("%T - %s", str, str) }

定义类型

go
package main import "fmt" // 这里没有了 = 号 type MyDefined string func main() { var str MyDefined = "I am defined" // 这里可以看到,变量的类型,已经不是 string 了 // Output: main.MyDefined - I am defined fmt.Printf("%T - %s", str, str) }

定义类型不仅仅是为类型命名。

它首先定义了一个具有基础类型的新命名类型。但是,这个定义的类型不同于任何其他类型,包括它的下划线类型。

因此,它不能与基础类型(如别名类型)互换使用。

go
package main import "fmt" type MyAlias = string type MyDefined string func main() { var a MyAlias var b MyDefined // ✅ 可以将 MyAlias 类型的 a,分配给 string 类型 var copy1 string = a // ❌ 无法将 MyDefined 类型的 b 分配给 string 类型 var copy2 string = b fmt.Println(copy1, copy2) }

本文作者:Silon汐冷

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!