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 來處理!
相關文章
相關標籤/搜索