diff --git a/codes/go/chapter_array_and_linkedlist/array.go b/codes/go/chapter_array_and_linkedlist/array.go index 26eef2a9..ccc5db19 100644 --- a/codes/go/chapter_array_and_linkedlist/array.go +++ b/codes/go/chapter_array_and_linkedlist/array.go @@ -5,23 +5,24 @@ import ( "math/rand" ) -// ExpectSize 预期大小。 在 Go 中,声明数组长度必须是常量表达式, -// 所以这里我们约定,扩展后的长度为 6 -const ExpectSize = 6 +/** +我们将 Go 中的 Slice 切片看作 Array 数组,降低理解成本, +有利于我们将关注点放在数据结构与算法上。 +*/ /* 随机返回一个数组元素 */ -func randomAccess(nums [5]int) (ans int) { +func randomAccess(nums []int) (randomNum int) { // 在区间 [0, nums.length) 中随机抽取一个数字 randomIndex := rand.Intn(len(nums)) // 获取并返回随机元素 - ans = nums[randomIndex] + randomNum = nums[randomIndex] return } /* 扩展数组长度 */ -func extend(nums [5]int) [ExpectSize]int { +func extend(nums []int, enlarge int) []int { // 初始化一个扩展长度后的数组 - var res [ExpectSize]int + res := make([]int, len(nums)+enlarge) // 将原数组中的所有元素复制到新数组 for i := 0; i < len(nums); i++ { res[i] = nums[i] @@ -31,7 +32,7 @@ func extend(nums [5]int) [ExpectSize]int { } /* 在数组的索引 index 处插入元素 num */ -func insert(nums *[5]int, num int, index int) { +func insert(nums []int, num int, index int) { // 把索引 index 以及之后的所有元素向后移动一位 // 如果超出了数组长度,会被直接舍弃 for i := len(nums) - 1; i > index; i-- { @@ -42,11 +43,7 @@ func insert(nums *[5]int, num int, index int) { } /* 删除索引 index 处元素 */ -func remove(nums *[5]int, index int) { - // 越界检查 - if index >= len(nums) { - return - } +func remove(nums []int, index int) { // 把索引 index 之后的所有元素向前移动一位 for i := index; i < len(nums); i++ { if i+1 >= len(nums) { @@ -58,7 +55,7 @@ func remove(nums *[5]int, index int) { } /* 遍历数组 */ -func traverse(nums [5]int) { +func traverse(nums []int) { var count int // 通过索引遍历数组 for i := 0; i < len(nums); i++ { @@ -71,11 +68,11 @@ func traverse(nums [5]int) { } /* 在数组中查找指定元素 */ -func find(nums [5]int, target int) (ans int) { - ans = -1 +func find(nums []int, target int) (index int) { + index = -1 for i := 0; i < len(nums); i++ { if nums[i] == target { - ans = i + index = i break } } diff --git a/codes/go/chapter_array_and_linkedlist/array_test.go b/codes/go/chapter_array_and_linkedlist/array_test.go index 1f551034..3f9882a9 100644 --- a/codes/go/chapter_array_and_linkedlist/array_test.go +++ b/codes/go/chapter_array_and_linkedlist/array_test.go @@ -1,145 +1,43 @@ package chapter_array_and_linkedlist +/** +我们将 Go 中的 Slice 切片看作 Array 数组。因为这样可以 +降低理解成本,利于我们将关注点放在数据结构与算法上。 +*/ + import ( - "reflect" + "fmt" "testing" ) -func TestInitArray(t *testing.T) { - t.Parallel() - var arr [5]int - for _, v := range arr { - if v != 0 { - t.Fatalf("array init exception") - } - } -} +/* Driver Code */ +func TestArray(t *testing.T) { + /* 初始化数组 */ + var arr []int + fmt.Println("数组 arr = ", arr) + nums := []int{1, 3, 2, 5, 4} + fmt.Println("数组 nums = ", nums) -func TestRandomAccess(t *testing.T) { - t.Parallel() - min, max := 1, 5 - nums := [5]int{min, 2, 3, 4, max} - ans := randomAccess(nums) - if ans < min || ans > max { - t.Fatalf("Expected range is greater than min: %v and less than max: %v, got ans: %v", min, max, ans) - } -} + /* 随机访问 */ + randomNum := randomAccess(nums) + fmt.Println("在 nums 中获取随机元素 ", randomNum) -func TestExtend(t *testing.T) { - t.Parallel() - nums := [5]int{1, 2, 3, 4, 5} - newNums := extend(nums) - if len(newNums) != ExpectSize { - t.Fatalf("Expected len: %v, got: %v", ExpectSize, len(nums)) - } -} + /* 长度扩展 */ + nums = extend(nums, 3) + fmt.Println("将数组长度扩展至 8 ,得到 nums = ", nums) -func TestInsert(t *testing.T) { - t.Parallel() - nums := [5]int{1, 2, 3, 4, 5} - insert(&nums, 5, 0) - if nums[0] != 5 { - t.Fatalf("Expected index[0] val: 5, got: %v", nums[0]) - } -} + /* 插入元素 */ + insert(nums, 6, 3) + fmt.Println("在索引 3 处插入数字 6 ,得到 nums = ", nums) -func TestRemove(t *testing.T) { - t.Parallel() - type fields struct { - index int - after [5]int - before [5]int - } + /* 删除元素 */ + remove(nums, 2) + fmt.Println("删除索引 2 处的元素,得到 nums = ", nums) - tests := []struct { - name string - fields fields - }{ - { - name: "remove index[0]", - fields: struct { - index int - after [5]int - before [5]int - }{ - index: 0, - after: [5]int{2, 3, 4, 5, 0}, - before: [5]int{1, 2, 3, 4, 5}, - }, - }, - { - name: "remove end", - fields: struct { - index int - after [5]int - before [5]int - }{ - index: 4, - after: [5]int{1, 2, 3, 4, 0}, - before: [5]int{1, 2, 3, 4, 5}, - }, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - v := tt.fields - remove(&v.before, v.index) - if !reflect.DeepEqual(v.before, v.after) { - t.Errorf("remove(&v.before, v.index) = %v, want %v", v.before, v.after) - } - }) - } -} - -func TestTraverse(t *testing.T) { - t.Parallel() - nums := [5]int{1, 2, 3, 4, 5} + /* 遍历数组 */ traverse(nums) -} - -func TestFind(t *testing.T) { - t.Parallel() - type fields struct { - target int - nums [5]int - } - - tests := []struct { - name string - fields fields - want int - }{ - { - name: "element exists", - fields: struct { - target int - nums [5]int - }{ - target: 1, - nums: [5]int{1, 2, 3, 4, 5}, - }, - want: 0, - }, - { - name: "element does not exist", - fields: struct { - target int - nums [5]int - }{ - target: 6, - nums: [5]int{1, 2, 3, 4, 5}, - }, - want: -1, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - v := tt.fields - if got := find(v.nums, v.target); got != tt.want { - t.Errorf("find(v.nums, v.target) = %v, want %v", got, tt.want) - } - }) - } + + /* 查找元素 */ + index := find(nums, 3) + fmt.Println("在 nums 中查找元素 3 ,得到索引 = ", index) } diff --git a/docs/chapter_array_and_linkedlist/array.md b/docs/chapter_array_and_linkedlist/array.md index 52d23024..643b16a2 100644 --- a/docs/chapter_array_and_linkedlist/array.md +++ b/docs/chapter_array_and_linkedlist/array.md @@ -44,8 +44,8 @@ comments: true ```go title="array.go" /* 初始化数组 */ - var arr [5]int // {0, 0, 0, 0, 0} - nums := [5]int{1, 3, 2, 5, 4} + var arr []int + nums := []int{1, 3, 2, 5, 4} ``` === "JavaScript" @@ -136,11 +136,11 @@ elementAddr = firtstElementAddr + elementLength * elementIndex ```go title="array.go" /* 随机返回一个数组元素 */ - func randomAccess(nums [5]int) (ans int) { + func randomAccess(nums [5]int) (randomNum int) { // 在区间 [0, nums.length) 中随机抽取一个数字 randomIndex := rand.Intn(len(nums)) // 获取并返回随机元素 - ans = nums[randomIndex] + randomNum = nums[randomIndex] return } ``` @@ -245,13 +245,10 @@ elementAddr = firtstElementAddr + elementLength * elementIndex === "Go" ```go title="array.go" - // 在 Go 中,声明数组长度必须是常量表达式, - // 所以这里我们约定,扩展后的长度为 6 - const expectSize = 6 - // 扩展数组长度 - func extend(nums [5]int) [expectSize]int { + /* 扩展数组长度 */ + func extend(nums []int, enlarge int) []int { // 初始化一个扩展长度后的数组 - var res [expectSize]int + res := make([]int, len(nums)+enlarge) // 将原数组中的所有元素复制到新数组 for i := 0; i < len(nums); i++ { res[i] = nums[i] @@ -393,7 +390,7 @@ elementAddr = firtstElementAddr + elementLength * elementIndex ```go title="array.go" /* 在数组的索引 index 处插入元素 num */ - func insert(nums [5]int, num int, index int) { + func insert(nums []int, num int, index int) { // 把索引 index 以及之后的所有元素向后移动一位 // 如果超出了数组长度,会被直接舍弃 for i := len(nums) - 1; i > index; i-- { @@ -404,11 +401,7 @@ elementAddr = firtstElementAddr + elementLength * elementIndex } /* 删除索引 index 处元素 */ - func remove(nums [5]int, index int) { - // 越界检查 - if index >= len(nums) { - return - } + func remove(nums []int, index int) { // 把索引 index 之后的所有元素向前移动一位 for i := index; i < len(nums); i++ { if i+1 >= len(nums) { @@ -547,7 +540,7 @@ elementAddr = firtstElementAddr + elementLength * elementIndex ```go title="array.go" /* 遍历数组 */ - func traverse(nums [5]int) { + func traverse(nums []int) { var count int // 通过索引遍历数组 for i := 0; i < len(nums); i++ { @@ -555,7 +548,7 @@ elementAddr = firtstElementAddr + elementLength * elementIndex } // 直接遍历数组 for index, val := range nums { - fmt.Printf("index:%d value:%d\n", index, val) + fmt.Printf("index:%v value:%v\n", index, val) } } ``` @@ -663,11 +656,11 @@ elementAddr = firtstElementAddr + elementLength * elementIndex ```go title="array.go" /* 在数组中查找指定元素 */ - func find(nums [5]int, target int) (ans int){ - ans = -1 + func find(nums []int, target int) (index int) { + index = -1 for i := 0; i < len(nums); i++ { if nums[i] == target { - ans = i + index = i break } }