golang 中的指针

Posted larryzeal

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 来处理!


























以上是关于golang 中的指针的主要内容,如果未能解决你的问题,请参考以下文章

Golang入门到项目实战 | golang指针

Golang 中的指针 - Pointer

golang 中的指针

将 nil 接口转换为 Golang 中的指针?

如何将“字符串指针”转换为 Golang 中的字符串?

Golang 指针和结构体