Go has pointers. A pointer holds the memory address of a variable.
The type
*T is a pointer to a T value. Its zero value is nil.var p *int
fmt.Println(p) <nil>
fmt.Println(*p) panic: runtime error: invalid memory address or nil pointer dereference [signal 0xc0000005 code=0x1 addr=0x0 pc=0x401771]
The empty pointer points to nil
The
The
& operator generates a pointer to its operand. &i is a pointer,i := 42 p = &i
fmt.Println(&i) 0xc0820022b8
The
* operator denotes the pointer's underlying value.fmt.Println(*p) // read i through the pointer p
42
*p = 21 // set i through the pointer p,
//the value in p's address changes from 42 to 21
This is known as "dereferencing" or "indirecting".
p := &v
(*p).X = 10
fmt.Println(&v)
&{10 2}
To access the field X of a struct when we have the struct pointer p,we could write (*p).X. However, that notation is cumbersome, so the language permits us instead to write just p.X, without the explicit dereference.
Unlike C, Go has no pointer arithmetic.
No comments:
Post a Comment