24

When I run the below code, I get the compiler error saying that indexing is not supported.

txs := make([]string, 2)
txs[0] = "A"

p := &txs

fmt.Println(p[0])

I'm trying to understand why indexing on the slice pointer is not supported. I can make a copy of the pointer variable to value variable and then do indexing, but I'm curious to understand why the language is not supporting the indexing on slice pointer; it'd be so much convenient to do so. or is there a way to do it that i'm not aware? please let me know your thoughts.

5
  • 1
    Related / possible duplicate of Slicing a slice pointer passed as argument Commented Jul 19, 2016 at 20:53
  • and also stackoverflow.com/questions/28709254/… Commented Jul 19, 2016 at 20:54
  • indexing a slice pointer isn't allowed, just like most other operators aren't valid for pointers. The type of the pointer is separate type from the underlying slice. Commented Jul 19, 2016 at 20:56
  • @JimB Note that indexing a pointer to array is allowed. See my linked answer. Commented Jul 19, 2016 at 20:58
  • @icza: yes thanks, I always forget about that one Commented Jul 19, 2016 at 21:01

2 Answers 2

61

Write (*p) to dereference the pointer p:

package main

import (
    "fmt"
)

func main() {
    txs := make([]string, 2)
    txs[0] = "A"
    p := &txs
    fmt.Println((*p)[0])
}

Playground: https://play.golang.org/p/6Ex-3jtmw44

Output:

A
Sign up to request clarification or add additional context in comments.

4 Comments

Just what the doctor ordered. Thanks for that awesome example! I was stuck at that.
The OP specifically asked why indexing on the pointer doesn't work. This answer doesn't explain why.
@jschmitter the reason is obvious. p is a pointer, it is not a slice and thus can't be indexed. And he clearly explains "Write (*p) to dereference the pointer p"
I don’t find it obvious. It could have been special-cased just like accessing fields of a pointer to a struct.
4

There's an abstraction happening there and the language designer chose not to apply it to the pointer. To give some practical reason, this is likely due to the fact that the pointer doesn't point to the beginning of an array (like the block of memory. If you're familiar with indexing this is generally done with something like startingAddress + index * sizeof(dataType)). So when you have the value type, it's already providing an abstraction to hide the extra layer of indirection that occurs. I assume the language authors didn't think it made sense to do this when you have a pointer to the slice object, given that points off to the actual memory that would be a pretty misleading. It already causes some confusion as is, but for a lot of developers, they probably will never realize this abstraction exists at all (like in most cases there is no noticeable difference in syntax when operating on a slice vs and array).

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.