1 结构体的定义与初始化
1.1 结构体的基本定义
结构体(Struct)是 Go 语言中用来定义复杂数据类型的一种复合类型,它由一系列命名字段组成,每个字段都有自己的类型。
// 定义一个简单的结构体
type Person struct {
Name string
Age int
City string
}
// 使用结构体
var p Person
p.Name = "Alice"
p.Age = 30
p.City = "Beijing"
结构体(Struct)是 Go 语言中用来定义复杂数据类型的一种复合类型,它由一系列命名字段组成,每个字段都有自己的类型。
// 定义一个简单的结构体
type Person struct {
Name string
Age int
City string
}
// 使用结构体
var p Person
p.Name = "Alice"
p.Age = 30
p.City = "Beijing"
在 Go 语言中,接口是一种类型,它定义了一组方法集合。接口是 Go 实现多态和面向对象编程的核心机制。
接口的定义使用 interface 关键字,声明了一组方法签名:
// Reader 定义了一个读取器接口
type Reader interface {
Read(p []byte) (n int, err error)
}
// Writer 定义了一个写入器接口
type Writer interface {
Write(p []byte) (n int, err error)
}
Go 语言采用了自动内存管理机制,开发者无需手动分配和释放内存,这大大简化了编程工作,减少了内存泄漏的风险。Go 的内存管理主要由两部分组成:
这种自动内存管理机制是 Go 语言设计理念的重要体现之一,它在保证程序性能的同时,提高了开发效率和代码的可靠性。
Go 的内存分配器基于 Google 的 TCMalloc (Thread-Caching Malloc) 实现,经过了专门的优化。它的主要特点是:
数组是一个固定长度的相同类型元素的集合。在 Go 中,数组的长度是其类型的一部分,一旦定义就不能改变。
// 定义一个长度为5的整型数组
var a [5]int
// 定义并初始化一个数组
var b [3]int = [3]int{1, 2, 3}
// 类型推导简化初始化
c := [3]int{1, 2, 3}
// 自动计算长度
c := [...]int{1, 2, 3} // 等价于 [3]int{1, 2, 3}
// 指定索引初始化
d := [5]int{0: 1, 2: 3, 4: 5} // [1 0 3 0 5]
Channel 是 Go 语言中用于在不同 goroutine 之间进行通信的管道。它允许一个 goroutine 向另一个 goroutine 发送数据,实现了 goroutine 之间的同步和数据交换。
核心特性:
本章谈一谈阅读了GO语言圣经之后,关于GO函数使用区别于其他语言的一些体会。
go里面函数的基本声明范式如下:
func name(parmeter-list) (result-list) {
body
}
个人在阅读《GO语言圣经》时,并没有发现有关GO项目结构的过多介绍,但是我觉得在开始学习一门语言前,应该先学好如何如何管理好自己的代码,尤其是对经验丰富的程序员,这是非常重要的。对于刚接触这门语言的人,也很重要,一方面这是提前养成良好的习惯,其次也可以培养自己的分类,分层,模块化设计思想,这在一个大型项目中是非常重要的。
这里不以大型项目的项目结构设计来展开,是在有兴趣的话或者有需求的话可以参考高分开源项目 project-layout,本文重点介绍一下GO语言本身提供的一些项目分层的设计。
变量定义范式:var 变量名字 类型 = 表达式,
其中类型和表达式可以省略一个, 省略类型时, 变量的类型由表达式的类型确定, 省略表达式时, 变量的初始值为类型的零值.
var a int = 0 // 完全的定义范式
var b int // 省略初始化,执行默认初始化
var c = 0 // 省略类型,根据初始化值确定类型
d := 0 // 省略 var关键字,使用 := 定义,只能在函数内部使用,这个叫做简短变量声明