1. 基本
目录
类型
(1) 整型(int
/uint
)
- 分类:
int8
,int16
,int32
,int64
(有符号)uint8
(即byte
),uint16
,uint32
,uint64
(无符号)int
/uint
:平台相关(32位或64位)
- 示例:
var a int = -42 var b uint64 = 18446744073709551615
(2) 浮点型(float
)
- 分类:
float32
(单精度,约6位小数)float64
(双精度,默认,约15位小数)
- 示例:
var pi float64 = 3.141592653589793
(3) 布尔型(bool
)
- 值:
true
或false
- 示例:
var isActive bool = true
(4) 字符串(string
)
- 特性:
- 不可变字节序列(默认UTF-8编码)
- 支持切片操作(如
s[0:5]
(索引0~4))
- 示例:
var s string = "Hello, Go"
2. 复合类型
(1) 数组(array
)
- 定义:固定长度、同类型元素的集合
- 示例:
var arr [3]int = [3]int{1, 2, 3} // 长度是类型的一部分
(2) 切片(slice
)
- 特性:
- 动态数组(底层引用数组)
- 含长度(
len
)和容量(cap
)
- 示例:
s := []int{1, 2, 3} // 字面量 s = append(s, 4) // 追加元素 sub := s[1:3] // 切片操作
-
切片与数组:
- 切片传递时修改会影响底层数组(共享引用)。
- 数组是值类型,赋值会复制全部元素。
(3) 映射(map
)
- 定义:键值对集合(无序)
- 示例:
m := map[string]int{"a": 1, "b": 2} val, exists := m["a"] // 检查键是否存在
(4) 结构体(struct
)
- 特性:自定义聚合类型
- 示例:
type User struct { Name string Age int } u := User{Name: "Alice", Age: 30}
(5) 通道(channel
)
- 用途:协程间通信(线程安全)
- 分类:
- 无缓冲(同步):
ch := make(chan int)
- 有缓冲(异步):
ch := make(chan int, 10)
- 无缓冲(同步):
- 示例:
ch := make(chan int) // 1. 创建一个无缓冲的 int 型通道 go func() { ch <- 42 }() // 2. 启动协程,向通道发送数据 42 value := <-ch // 3. 从通道接收数据,并赋值给 value fmt.Println(value) // 输出: 42
-
通道关闭:
- 关闭后仍可读取剩余数据,
v, ok := <-ch
中ok
为false
表示已关闭。
- 关闭后仍可读取剩余数据,
(6) 指针(pointer
)
- 作用:间接引用内存地址
- 示例:
var x int = 10 p := &x // 取地址 *p = 20 // 解引用修改
3. 接口与方法
(1) 接口(interface
)
- 定义:方法签名的集合(隐式实现)
- 示例:
type Writer interface { Write([]byte) (int, error) } func (f File) Write(data []byte) (int, error) { // 实现接口 ... }
-
接口与
nil
:- 接口变量为
nil
仅当类型和值均为nil
。var w Writer // w == nil var f *File w = f // w != nil(类型为*File,值为nil)
- 接口变量为
(2) 方法(method
)
- 特性:绑定到类型的函数(值或指针接收者)
- 示例:
func main() { // 初始化一个 Circle c := Circle{Radius: 2.0} // 值接收者方法调用(无论 c 是值还是指针均可调用) area := c.Area() // 等价于 (&c).Area() fmt.Println(area) // 输出: 12.566... // 指针接收者方法调用(无论 c 是值还是指针均可调用) c.Scale(2.0) // 等价于 (&c).Scale(2.0) fmt.Println(c.Radius) // 输出: 4.0(原结构体被修改) }
- 值接收者 vs 指针接收者
特性 值接收者( func (c Circle)
)指针接收者( func (c *Circle)
)是否修改原结构体 否(操作的是副本) 是(直接操作原结构体) 调用时的隐式转换 支持(可通过值或指针调用) 支持(可通过值或指针调用) 典型用途 计算类方法(如 Area()
)修改类方法(如 Scale()
)
4. 对比
类型 | 可变性 | 线程安全 | 典型用途 |
---|---|---|---|
int | 可变 | 是(非共享) | 数值计算 |
string | 不可变 | 是 | 文本处理 |
slice | 可变 | 否 | 动态集合 |
map | 可变 | 否 | 键值查询 |
channel | 可变 | 是 | 协程通信 |
struct | 字段可变 | 取决于使用 | 数据聚合 |
interface | 动态类型 | 是 | 多态设计 |