这里介绍 go 中可用的基本数据类型
字符串类型(string) 布尔类型(bool) 数值类型
零值 别名类型 定义类型
字符串是一个字节序列。可以使用双引号("")
或 跨越多行的反引号(``)
声明
双引号:会识别转义内容
反引号:原生内容,不进行转义,可用于防攻击,输出源码等场景
相关信息
go 中的字符串不可以使用 单引号 定义
单引号专用于字符的定义
govar 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)
布尔类型有两种值: true 和 false
govar a bool = true
var b bool = false
int
或 uint
不指定 bit 位则默认取当前系统位数。例如 64位系统中 int 就是 int64
intx
和 uintx
中 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 除非我们有特定的理由使用大小或无符号整数类型。
Golang 有两个额外的整数类型,分别是:
相关信息
双引号括起来的字符串表示的是一个由多个字符组成的文本,而不是单个字符
所以字符类型只能使用 单引号
进行定义
字符类型的值实际是 字符码 或 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
: 单精度 4 字节,非零整数部分 + 小数部分 共 8 位float64
: 双精度 8 字节,非零整数部分 + 小数部分共 16 位go// float64 精度更高
var num21 float32 = -123.0000901
var num22 float64 = -123.0000901
// -123.00009, -123.0000901
println(num21, num22)
Go 中有 2 种复杂类型
complex128
实部和虚部都在float64
,complex64
实部和虚部都在float32
。我们可以使用内置的 complex 函数或文字来定义复数。
go// 方法 1
var c1 complex128 = complex(10, 1)
// 方法 2
var c2 complex64 = 12 + 4i
在 Go 中,任何没有显式初始值声明的变量都会被赋予其零值。
govar i int
var f float64
var b bool
var s string
fmt.Printf("%v %v %v %q\n", i, f, b, s)
相关信息
go 中并不会像大部分语言,将未初始化的变量初始化为 null 或 undefined
如上所见:
int
,float
分配为 0
bool
为 false
string
为 空字符串 ""
别名类型是在 Go 1.9 中引入的。它们允许开发人员为现有类型提供替代名称
,并将其与基础类型互换使用,本质上还是这个类型。
gopackage 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)
}
gopackage 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)
}
定义类型不仅仅是为类型命名。
它首先定义了一个具有基础类型的新命名类型。但是,这个定义的类型不同于任何其他类型,包括它的下划线类型。
因此,它不能与基础类型(如别名类型)互换使用。
gopackage 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 许可协议。转载请注明出处!