【Golang】语法基础——深入解析Go语言的数据类型

🚀本系列文章为个人学习笔记,目的是巩固知识并记录我的学习过程及理解。文笔和排版可能拙劣,望见谅。


 目录

 1. 基本数据类型

 1.1 布尔型(Boolean)

1.2 整型(Integer)

 1.3 浮点型(Float)

 1.4 复数型(Complex)

 2. 字符串(String)

2.1 字符串连接

3. 常量(Constant)

 4. iota

 5. 派生数据类型

 5.1 指针(Pointer)

5.1.1什么是指针?

5.1.2指针的声明和使用

5.1.3指针的零值

5.1.4指针与函数

5.1.5指针数组和指向数组的指针

5.1.6注意事项

 5.2 数组(Array)

 5.3 切片(Slice)

 5.4 结构体(Struct)

 5.5 Map

 5.6 接口(Interface)

6.零值

7.nil

Go语言(简称Golang)作为一门现代编程语言,以其简洁、强大的特性备受开发者青睐。在实际开发中,数据类型是语言的核心部分,理解和正确使用数据类型是编写高效、健壮代码的基础。本文将详细介绍Go语言中的基本数据类型及其特性,帮助读者更好地掌握Go语言的使用。

 1. 基本数据类型

Go语言提供了多种基本数据类型,包括布尔型、整型、浮点型、复数型、字符串、常量和iota。

 1.1 布尔型(Boolean)

布尔型数据表示真或假的值,用于条件判断。布尔型只有两个取值:true 和 false。

var b bool = true

1.2 整型(Integer)

整型分为有符号和无符号两类。根据存储大小的不同,又分为多种类型:

  • int8: 有符号8位整型,范围从-128到127

  • int16: 有符号16位整型,范围从-32768到32767

  • int32: 有符号32位整型,范围从-2147483648到2147483647

  • int64: 有符号64位整型,范围从-9223372036854775808到9223372036854775807

  • uint8: 无符号8位整型,范围从0到255

  • uint16: 无符号16位整型,范围从0到65535

  • uint32: 无符号32位整型,范围从0到4294967295

  • uint64: 无符号64位整型,范围从0到18446744073709551615

  • int: 有符号整型,大小根据系统架构不同而不同(32位或64位)

  • uint: 无符号整型,大小根据系统架构不同而不同(32位或64位)

例如:

var a int8 = -128
var b uint16 = 65535
var c int = 100 // 根据系统架构,可能是32位或64位

 1.3 浮点型(Float)

浮点型用于表示带小数点的数值。Go语言提供了两种浮点型:

  • float32: 单精度浮点型,通常用在对内存要求较高的场合,范围约为1.18e-38到3.4e+38,精度约为7位小数
  • float64: 双精度浮点型,适用于大多数场景,范围约为2.23e-308到1.8e+308,精度约为15位小数
var x float32 = 3.14
var y float64 = 2.718281828459

 1.4 复数型(Complex)

Go语言支持复数运算,复数类型包括 `complex64` 和 `complex128`。复数由实部和虚部组成。

  • complex64: 由两个float32组成的复数
  • complex128: 由两个float64组成的复数
var z complex64 = 1 + 2i

 2. 字符串(String)

字符串是一个不可变的字节序列,通常用于表示文本数据。字符串可以用双引号 `""` 或反引号 `` ` `` 包围。双引号内的字符串可以包含转义字符,反引号内的字符串则保持原样。

var str1 string = "Hello, World!"
var str2 string = `Hello, 
World!`

2.1 字符串连接

Go语言使用 `+` 运算符进行字符串连接。

var str3 string = str1 + " " + str2

3. 常量(Constant)

常量是固定值,程序执行过程中不会改变。常量通过 `const` 关键字定义。


const Pi = 3.14
const (
    e = 2.718
    Avogadro = 6.022e23
)

 4. iota

`iota` 是Go语言的常量生成器,用于简化常量的定义。`iota` 在每个 `const` 声明块中从0开始,逐行递增。


const (
    a = iota // 0
    b        // 1
    c        // 2
)

 5. 派生数据类型

除了基本数据类型,Go语言还提供了多种派生数据类型,包括指针、数组、切片和接口等。

 5.1 指针(Pointer)

指针是编程语言中非常重要的一个概念,用于保存变量的内存地址。通过指针,可以直接访问和操作内存中的数据。在Go语言中,指针操作虽然类似于C语言,但Go语言在设计上更为安全,不支持指针运算,减少了潜在的内存错误。

5.1.1什么是指针?

指针是一个变量,其值是另一个变量的内存地址。使用指针可以间接地读写另一个变量的值。

5.1.2指针的声明和使用

在Go语言中,指针类型使用 * 符号表示,指针变量的声明和使用方式如下:

var a int = 10     // 声明一个整型变量a,并赋值为10
var p *int         // 声明一个指向整型的指针变量p
p = &a             // 将变量a的地址赋值给指针变量p

fmt.Println(p)     // 输出指针变量p的值,即变量a的地址
fmt.Println(*p)    // 输出指针变量p指向的值,即变量a的值

在这个例子中,&a 表示变量 a 的内存地址,p 存储了 a 的地址。*p 表示指针 p 指向的变量的值,通过 *p 可以访问和修改 a 的值。

5.1.3指针的零值

指针的零值是 nil,即指针不指向任何内存地址。声明指针变量时,如果没有显式赋值,它的默认值是 nil

var p *int
fmt.Println(p)     // 输出 <nil>

5.1.4指针与函数

指针在函数参数传递中非常有用,可以实现引用传递,而不是值传递。通过指针参数,函数可以修改传入参数的值。

func modifyValue(p *int) {
    *p = 20
}

func main() {
    var a int = 10
    fmt.Println("Before:", a)  // 输出 Before: 10
    modifyValue(&a)
    fmt.Println("After:", a)   // 输出 After: 20
}

在这个例子中,函数 modifyValue 接受一个整型指针参数,并通过指针修改其值。调用函数时传入变量 a 的地址,因此 modifyValue 函数可以修改 a 的值。

5.1.5指针数组和指向数组的指针

在Go语言中,可以声明指针数组和指向数组的指针:

var arr [3]int = [3]int{1, 2, 3}
var p *[3]int = &arr          // 声明一个指向数组的指针
fmt.Println((*p)[0])          // 通过指针访问数组元素,输出 1

var parr [3]*int              // 声明一个指针数组
for i := 0; i < 3; i++ {
    parr[i] = &arr[i]
}
fmt.Println(*parr[0])         // 通过指针数组访问数组元素,输出 1

5.1.6注意事项

  • 不支持指针运算:Go语言不支持指针的算术运算,例如 p++p+1,以避免常见的内存错误。
  • 内存安全:使用指针时要确保指针不指向无效的内存地址,避免产生 nil 指针错误。

 5.2 数组(Array)

数组是固定长度的同类型元素的集合。在定义数组时需要指定长度和元素类型。

var arr [5]int = [5]int{1, 2, 3, 4, 5}
fmt.Println(arr[2]) // 输出 3

 5.3 切片(Slice)

切片(Slice)是Go语言中的一种关键数据类型,它是对数组的抽象和封装。与数组不同,切片的长度是动态的,可以根据需要自动扩展。切片提供了更为灵活和便捷的操作方式,是Go语言中最常用的数据结构之一。


var s []int = []int{1, 2, 3}
s = append(s, 4, 5)
fmt.Println(s) // 输出 [1, 2, 3, 4, 5]

 5.4 结构体(Struct)

结构体是将多个不同类型的数据组合在一起的数据类型。结构体在Go语言中非常重要,用于定义复杂的数据结构。


type Person struct {
    Name string
    Age  int
}
var p Person = Person{Name: "Alice", Age: 30}
fmt.Println(p.Name) // 输出 Alice

 5.5 Map

Map是一种无序的键值对集合,用于存储具有唯一键的元素。


var m map[string]int = map[string]int{"one": 1, "two": 2}
fmt.Println(m["one"]) // 输出 1

 5.6 接口(Interface)

接口是一种抽象类型,定义了一组方法,但不实现这些方法。接口通过实现这些方法的类型来实现。


type Speaker interface {
    Speak() string
}

type Dog struct{}

func (d Dog) Speak() string {
    return "Woof!"
}

var s Speaker = Dog{}
fmt.Println(s.Speak()) // 输出 Woof!

6.零值

官方文档中零值称为zero value,零值并不仅仅只是字面上的数字零,而是一个类型的空值或者说默认值更为准确。

类型零值
数字类型0
布尔类型false
字符串类型""
数组固定长度的对应类型的零值集合
结构体内部字段都是零值的结构体
切片,映射表,函数,接口,通道,指针nil

7.nil

源代码中的nil,可以看出nil仅仅只是一个变量。

var nil Type

Go中的nil并不等同于其他语言的nullnil仅仅只是一些类型的零值,并且不属于任何类型,所以nil == nil这样的语句是无法通过编译的。

Go语言的数据类型丰富且灵活,能够满足不同场景下的开发需求。理解和熟练运用这些数据类型,可以让你编写出高效、健壮的Go语言程序。希望这篇博客能帮助你更好地掌握Go语言的数据类型,提升编程水平。

欢迎在评论区分享你对Go语言数据类型的见解或提出疑问,我们一起交流学习!

  • 24
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值