在Golang中使用指针的麻烦

时间:2017-11-05 14:37:17

标签: pointers go

我是Golang的新手,在这里我使用BubleSort和InsertionSort并为函数生成rando切片。我可以使用指针一些如何处理未分类切片的两个函数?因为当我运行程序时,第一个函数对切片进行排序,第二个函数使用该排序的切片。我知道有两种方法可以为两个函数提供未排序的切片,但是我想知道如何使用指针来执行此操作。谢谢。

package main

import (
"fmt"

"math/rand"

"time"
)

func main() {
slice := generateSlice(4)
fmt.Println(BubleSort(slice))
fmt.Println(InsertionSort(slice))
}

func generateSlice(size int) []int {
slice := make([]int, size, size)
rand.Seed(time.Now().UnixNano())
for i := 0; i < size; i++ {
    slice[i] = rand.Intn(10)
}
return slice
}

func BubleSort(slice []int) []int {
fmt.Println("unsorted Buble", slice)
for i := 1; i <= len(slice); {
    for j := 0; j < len(slice)-i; {
        if slice[j] > slice[j+1] {
            slice[j], slice[j+1] = slice[j+1], slice[j]
        }
        j++
    }
    i++
}
return slice
}

func InsertionSort(slice []int) []int {
fmt.Println("unsorted Insertion", slice)
for i := 1; i <= len(slice)-1; {
    // Check j and j-1 and swap the smaller number to left in each 
itteartion to reach the first 2 elements of the slice
    for j := i; j >= 1; {
        if slice[j] < slice[j-1] {
            slice[j], slice[j-1] = slice[j-1], slice[j]
        }
        j--
    }
    i++
}
return slice
}

2 个答案:

答案 0 :(得分:2)

安迪是对的

作为替代方案,您可以在排序之前复制切片,如此处(on Play):

package main

import (
    "fmt"

    "math/rand"

    "time"
)

func main() {
    slice := generateSlice(4)
    fmt.Println(BubleSort(copySlice(slice)))
    fmt.Println(InsertionSort(copySlice(slice)))
}

func copySlice(src []int) []int {
    dest := make([]int, len(src))
    copy(dest, src)
    return dest
}
func generateSlice(size int) []int {
    slice := make([]int, size, size)
    rand.Seed(time.Now().UnixNano())
    for i := 0; i < size; i++ {
        slice[i] = rand.Intn(10)
    }
    return slice
}

func BubleSort(slice []int) []int {
    fmt.Println("unsorted Buble", slice)
    for i := 1; i <= len(slice); {
        for j := 0; j < len(slice)-i; {
            if slice[j] > slice[j+1] {
                slice[j], slice[j+1] = slice[j+1], slice[j]
            }
            j++
        }
        i++
    }
    return slice
}

func InsertionSort(slice []int) []int {
    fmt.Println("unsorted Insertion", slice)
    for i := 1; i <= len(slice)-1; {
        // Check j and j-1 and swap the smaller number to left in each itteartion to reach the first 2 elements of the slice
        for j := i; j >= 1; {
            if slice[j] < slice[j-1] {
                slice[j], slice[j-1] = slice[j-1], slice[j]
            }
            j--
        }
        i++
    }
    return slice
}

答案 1 :(得分:1)

我也在学习Go。我认为您正在使用切片的事实是导致不需要的行为(当我运行程序时,第一个函数对切片进行排序而第二个函数使用该排序切片)。正如here所述:

  

切片不存储任何数据,它只描述基础数组的一部分。

     

更改切片的元素会修改其基础数组的相应元素。

     

共享相同底层数组的其他切片将看到这些更改。

我不认为传递指针会产生不同的结果,因为切片指向同一个数组。您可以做的是接收数组而不是切片?

希望它有所帮助! :)