zoukankan      html  css  js  c++  java
  • 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 来处理!


  • 相关阅读:
    C语言 · 阶乘计算 · 基础练习
    C语言 · 查找整数 · 基础练习
    UML课程复习重点
    运维参考
    mysql语法总结
    Python杂篇
    Python练习题
    Python参考
    k8s中ipvs和iptables选择
    安装cni网络插件-非必须
  • 原文地址:https://www.cnblogs.com/larryzeal/p/10258288.html
Copyright © 2011-2022 走看看