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 来处理!


猜你喜欢

转载自www.cnblogs.com/larryzeal/p/10258288.html