Go语言进阶④:数据结构大冒险!
——写惯了 Java 的你,看 Go 的容器世界会头皮发麻吗?
一、写在前面:Java 程序员的容器情怀
在 Java 世界,你可能习惯了满手的 ArrayList
、HashMap
、Set
、Queue
等容器类,配合着各种范型、接口和 Lambda 表达式,写得风生水起。
可一到 Go,乍一看:“Go 是不是还在用石器时代的数组?”
别慌!Go 的容器虽然看起来“朴素”,但简洁实用,背后也藏着很多门道。接下来我们就从 Java 程序员的视角,手把手对比讲清楚 Go 的常用数据结构。
二、数组(Array)和切片(Slice):切出来才好吃
Java:
int[] arr = new int[3]; // 固定长度数组
arr[0] = 1;
List<Integer> list = new ArrayList<>(); // 动态数组
list.add(1);
list.add(2);
Go:
arr := [3]int{1, 2, 3} // 数组,长度固定,元素类型是 int
arr2 := [...]int{4, 5, 6} // 由编译器自动推断长度
slice := []int{1, 2, 3} // 切片,更常用,长度可变
slice = append(slice, 4, 5) // 追加元素,自动扩容
补充说明:
-
[]int{}
是切片(动态数组),类似 Java 的ArrayList<Integer>
; -
append()
函数可以自动扩容,背后有一套内存管理机制; -
数组(
[3]int
)是值类型,赋值会复制整个数组; -
切片是引用类型,共享底层数组。
Java 对比提示:
特性 | Java | Go |
---|---|---|
数组是否可变 | 不可扩容 | [3]int 也不可扩容 |
动态数组 | ArrayList |
[]T 切片 |
传参是否拷贝 | 引用传递 | 数组是值传递,切片是引用语义 |
三、Map:没有 HashMap
类,但内置超好用
Java:
Map<St