# 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 中的指针的更多相关文章

  1. Golang 中的指针 - Pointer

    http://www.cnblogs.com/jasonxuli/p/6802289.html   Go 的原生数据类型可以分为基本类型和高级类型,基本类型主要包含 string, bool, int ...

  2. golang中数组指针与指针数组的区别实现

      指针数组和数组的指针,指的是两个不同的东西. 指针数组是有指针组成的数组,数组的指针是一个数组的指针. package main import "fmt" const MAX ...

  3. golang中数组指针和指针数组的区别

    func test(){ x,y := 1, 2 var arr = [...]int{5:2} //数组指针 var pf *[6]int = &arr //指针数组 pfArr := [. ...

  4. golang中数组指针和指针数组当做函数参数如何修改数组中的值

    先理解:数组指针它的类型时指针,指针数组它的类型时数组 1. 数组指针当做函数的参数 package main import "fmt" func changeData(dataA ...

  5. golang中的reflect包用法

    最近在写一个自动生成api文档的功能,用到了reflect包来给结构体赋值,给空数组新增一个元素,这样只要定义一个input结构体和一个output的结构体,并填写一些相关tag信息,就能使用程序来生 ...

  6. Golang中的坑二

    Golang中的坑二 for ...range 最近两周用Golang做项目,编写web服务,两周时间写了大概五千行代码(业务代码加单元测试用例代码).用Go的感觉很爽,编码效率高,运行效率也不错,用 ...

  7. 说说不知道的Golang中参数传递

    本文由云+社区发表 导言 几乎每一个C++开发人员,都被面试过有关于函数参数是值传递还是引用传递的问题,其实不止于C++,任何一个语言中,我们都需要关心函数在参数传递时的行为.在golang中存在着m ...

  8. 【荐】详解 golang 中的 interface 和 nil

    golang 的 nil 在概念上和其它语言的 null.None.nil.NULL一样,都指代零值或空值.nil 是预先说明的标识符,也即通常意义上的关键字.在 golang 中,nil 只能赋值给 ...

  9. 第十九课 golang中的下划线

    在 Golang 里, _ (下划线)是个特殊的标识符. 用在 import 在导包的时候,常见这个用法: 1 2 import _ "net/http/pprof" import ...

随机推荐

  1. [CSAcademy]Or Problem

    [CSAcademy]Or Problem 题目大意: 一个长度为\(n(n\le2\times10^5)\)的序列\(A(0\le A_i<2^{20})\),将其分为恰好\(m\)个连续段, ...

  2. [BZOJ4259]残缺的字符串

    Description: 给定两个带通配符的串,求可能出现几次匹配,以及这些匹配位置 Hint: \(n \le 3*10^5\) Solution: 定义匹配函数 \(P(x)=\sum_{i=x} ...

  3. 封装、property特性及绑定与非绑定方法

    1.封装 (1)什么是封装? 封:属性对外是隐藏的,但对内是开放的: 装:申请一个名称空间,往里面装入一系列名字/属性 (2)为什么要封装? 封装数据属性的目的 首先定义属性的目的就是为了给类外部的使 ...

  4. echarts中dataZoom的使用

    ataZoom的使用方法 功能: 1.有inslide和slide两种dataZoom,也分X,Y轴 两种dataZoom的使用 dataZoom:[ { type:"slider" ...

  5. js 操作数组

    数组的增删 数组的尾部插入一个元素 var nums = [0,1,2,3,4]; nums.push(5,6,6); //[0,1,2,3,4,5,6,6] 删除数组尾部的元素 var nums = ...

  6. 异常处理汇总 ~ 修正果带着你的Code飞奔吧!

    异常处理汇总-运维系列 http://www.cnblogs.com/dunitian/p/4522983.html 异常处理汇总-开发工具  http://www.cnblogs.com/dunit ...

  7. Java身份证归属地目录树

    数据库结构: web管理界面: 目录树: 视频: 应用场景:

  8. Mongo 常用操作

    1.查询 [基本形式]db.col.find().pretty():pretty() 方法以格式化的方式来显示所有文档. [获取记录条数]:db.users.find().count(); [读取指定 ...

  9. git merge dryrun

    As noted previously, pass in the --no-commit flag, but to avoid a fast-forward commit, also pass in  ...

  10. freenode configuration sasl authentication in weechat

    转自:https://www.weechat.org/files/doc/stable/weechat_user.en.html#irc_sasl_authentication SASL authen ...