zoukankan      html  css  js  c++  java
  • go 指针

    首先我们要了解 那些类型是不可寻址的(unAddressable)

    以下列表中的值都是不可寻址的。

    常量的值。 示列: const num = 123 _:= &num 编译失败  

    基本类型值的字面量。示列: _ = &(123) // 基本类型值的字面量不可寻址

    算术操作的结果值。示列:_ = &(123 + 456) // 算术操作的结果值不可寻址。

    对各种字面量的索引表达式和切片表达式的结果值,不过有一个例外,对切片字面量的索引结果值却是可寻址的。示列:_ = &([3]int{1, 2, 3}[0])  对数组、切片字面量的索引结果值不可寻址。

    对字符串变量的索引表达式和切片表达式的结果值。示列:_ = &(str[0]) // 对字符串变量的索引结果值不可寻址。

    对字典变量的索引表达式的结果值。示列:_ = &(map[int]string{1: "a"}[0]) // 对字典字面量的索引结果值不可寻址。

    函数字面量和方法字面量,以及对它们的调用表达式的结果值。示列:_ = &(fmt.Sprintln("abc")) // 对函数的调用结果值不可寻址。

    结构体字面量的字段值,也就是对结构体字面量的选择表达式的结果值。 示列:_ = &(Dog{"little pig"}.name) //不可寻址

    类型转换表达式的结果值。示列:_ = &(interface{}(dog)) //类型转换表达式的结果值不可寻址

    类型断言表达式的结果值。示列:_ = &(dogI.(Named)) // 类型断言表达式的结果值不可寻址。

    接收表达式的结果值。示列:_ = &(<-chan1) // 接收表达式的结果值不可寻址。

    我们来看个字符串示列:

    func change(str *string)  {
        *str = "change string"
    }
    func main() {
        var str = "abc"
        _ = str
        change(&str)
        fmt.Println(str)
    }

    打印结果是:"change string" 字符串变量是可寻址的 但是字符串里的字符切片或数组是不可寻址的

    • 不可变的值不可寻址。常量、基本类型的值字面量、字符串变量的值、函数以及方法的字面量都是如此。其实这样规定也有安全性方面的考虑。
    • 绝大多数被视为临时结果的值都是不可寻址的。算术操作的结果值属于临时结果,针对值字面量的表达式结果值也属于临时结果。但有一个例外,对切片字面量的索引结果值虽然也属于临时结果,但却是可寻址的。
    • 若拿到某值的指针可能会破坏程序的一致性,那么就是不安全的,该值就不可寻址。由于字典的内部机制,对字典的索引结果值的取址操作都是不安全的。另外,获取由字面量或标识符代表的函数或方法的地址显然也是不安全的。
  • 相关阅读:
    关于BlockingQueue
    关于java的线程
    mongodb的锁和高并发
    innodb的锁和高并发
    mysql的事务隔离级别及其使用场景
    mongodb分页
    ReentrantLock和Synchronized
    spring boot MVC
    svn 入门
    多线程的返回值等问题
  • 原文地址:https://www.cnblogs.com/jackey2015/p/11726899.html
Copyright © 2011-2022 走看看