получение ошибки «границы среза вне диапазона» при итерации по срезу и ее изменение с помощью «append ()» - PullRequest
0 голосов
/ 17 ноября 2018

Я написал функцию, которая заменяет последовательность повторяющихся слов одним словом в строке (строка []). Я использую «диапазон» для циклического перемещения по срезу и использую «append ()» для изменения среза. Ниже приведен код:

func RemoveContinuosStrings(input []string) []string {  
        top:=0

        for i,_ := range input {
                if input[i] != input[top] {
                        if top != i-1 {
                                input = append(input[:top+1], input[i:]...)
                        }   
                        top = i 
                }   
        }   
        return input[:top+1]
}

func main() {

        scanner := bufio.NewScanner(os.Stdin)
        fmt.Println("enter text")
        input := make([]string, 0, 0)

        for scanner.Scan() {
                input = append(input, scanner.Text())
        }   

        fmt.Println("INPUT", input)
        input = RemoveContinuosStrings(input)
        fmt.Println("OUTPUT", input)
}

при выполнении кода выше я вижу следующую ошибку:

===================================================  
    vignesh@vignesh-ThinkPad-E470 ~/go-book/chapter4 $ ./4_6_eliminate_duplicate_string  
    enter text
    qwe
    asd
    asd
    zxc
    asd
    asd
    INPUT [qwe asd asd zxc asd asd]
    panic: runtime error: index out of range

    goroutine 1 [running]:
    main.RemoveContinuosStrings(0xc420088000, 0x6, 0x8, 0x20, 0x0, 0x0)
        /home/vignesh/go-book/chapter4/4_6_eliminate_duplicate_string.go:11 +0x2a0
    main.main()
        /home/vignesh/go-book/chapter4/4_6_eliminate_duplicate_string.go:33 +0x33a
    vignesh@vignesh-ThinkPad-E470 ~/go-book/chapter4 $ 
=======================================================

Итак, это неправильно или не разрешено добавлять к срезу, повторяемому через «диапазон». Я видел несколько примеров в Интернете, где они добавляли к срезу, но выполняли итерацию без использования «диапазона» (например: для i = 0; i

1 Ответ

0 голосов
/ 17 ноября 2018

Когда вы изменяете размер массива внутри цикла, не забывайте использовать простой вместо вместо диапазона

func RemoveContinuosStrings(input []string) []string {
    top:=0

    for i:=0;i<len(input);i++ {
        if input[i] != input[top] {
            if top != i-1 {
                input = append(input[:top+1], input[i:]...)
                i=top+1
                top=top+1
            }else{
                top = i
            }
        }
    }
    return input[:top+1]
}
...