2014-09-17 2 views
1

У меня есть фрагмент, который я хочу изменить (например, я хочу удалить первый элемент), используя функцию. Я думал использовать указатель, но я все еще не могу его проиндексировать. Что я делаю не так?Изменение фрагмента путем передачи его указателя

Playground link:

func change(list *[]int) { 
    fmt.Println(*list) 
    *list = *list[1:] //This line screws everything up 
} 

var list = []int{1, 2, 3} 

func main() { 
    change(&list) 
} 

ответ

3

Вы должны использовать (*list).

func change(list *[]int) { 
    *list = (*list)[1:] 
} 

или иной подход, который, как правило, больше идти idomatic:

func change(list []int) []int { 
    return list[1:] 
} 

playground

+1

+1. В любом случае, срезы являются «ссылочными типами». Таким образом, вы не очень много зарабатываете, передавая указатель и пытаясь изменить его на месте. –

+1

@SimonWhitehead Для этого есть фактическое использование. См. Http://play.golang.org/p/vf1tD7_xc7 для примера, который использует представление среза для создания очереди. – dyoo

+0

Спасибо за пример @dyoo. Я согласен, что существуют конкретные случаи, когда это имеет смысл (например, приемник указателя для типа с псевдонимом в вашем примере). Я не думаю, что это относится к ситуации в OP, хотя (это то, на что я нацелился на мой комментарий). –

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