golang 中的指针
# golang 中的指针
看了一篇[文章](http://blog.51cto.com/steed/2341409),写的很好。这里略微总结下重点:
1. 地址值、unsafe.Pointer、uintptr 的关系
- 地址值 与 unsafe.Pointer 可以互相转换
- uintptr 与 unsafe.Pointer 可以互相转换
- 地址在 与 uintptr 不能互相转换
2. 不可寻址的值 (需要指出的是,不可寻址是强行约定的,多数是因为安全)
- 不可变的值不可寻址,包括常量、字面值、字符串变量的值、函数及方法的字面值。
- 临时结果,也就是未被接收的结果,有个例外是切片。
- 破坏一致性的指针,如字典的value。
3. 鉴于上面的内容,下面的代码就很有意思了
```golang
package main
import "fmt"
func main() {
// fmt.Println(New().String()) //error!此处行不通!
u := New()
fmt.Println(u.String())
}
//User is a demo struct
type User struct {
name string
}
//receiver is ptr!
func (u *User) String() string {
return fmt.Sprintf("User{name=%s}", u.name)
}
//New is to create User!
func New() User {
return User{"default"}
}
```
4. reflect.Type/Value可以处理struct的exported字段,那么unexported字段怎么处理呢?
答案是使用 unsafe.Offsetof,配合 uintptr 和 unsafe.Pointer 来处理!