2015-09-24 2 views
0

Следующий код go не компилируется, потому что (я считаю) есть ошибка в отношении ссылок на указатели.Фиксация неправильно отредактированных фрагментов в замене массива

В частности, сообщение об ошибке

prog.go:13: cannot use append((*x)[:remove], (*x)[remove + 1:]...) (type []int) as type *[]int in assignment 

Вот отведенной и упрощенная версия кода, который приводит в этом сообщении об ошибке.

package main 

import "fmt" 

func main() { 

    x := &[]int{11, 22, 33, 44, 55, 66, 77, 88, 99} 

    for i, addr := range *x { 
     if addr == 22 { 
      for len(*x) > 5 { 
       remove := (i + 1) % len(*x) 
       x = append((*x)[:remove], (*x)[remove+1:]...) 
      } 
      break 
     } 
    } 

    fmt.Println(x) 
} 

ответ

3

Вы не используете массив здесь, вы используете срез. Как правило, вы не хотите обрабатывать указатель на срез, поскольку он может стать неудобным, а указатель необходим в очень немногих случаях.

Чтобы исправить ошибку, разыменовать x:

*x = append((*x)[:remove], (*x)[remove+1:]...) 

Но вы, вероятно, следует использовать значение среза непосредственно, так что не требуется никаких разыменовывает:

x := []int{11, 22, 33, 44, 55, 66, 77, 88, 99} 
+0

Спасибо! Можете ли вы привести пример, где требуется указатель на срез? – jayunit100

+0

@ jayunit100: вам нужен указатель, если вы хотите, чтобы функция имела возможность изменять длину или емкость среза. Вы можете посмотреть пример [IntHeap] (https://golang.org/pkg/container/heap/#example__intHeap) в контейнере/куче. Для методов Push и Pop требуется приемник указателя. – JimB

Смежные вопросы