GO·NOTE

一份 Go 开发工程师的学习笔记

0%

golang 不可寻址情况大全

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package main

type Named interface {
// Name 用于获取名字。
Name() string
}

type Dog struct {
name string
}

func (dog *Dog) SetName(name string) {
dog.name = name
}

func (dog Dog) Name() string {
return dog.name
}

func main() {
// 示例1。
const num = 123
//_ = &num // 常量不可寻址。
//_ = &(123) // 基本类型值的字面量不可寻址。

var str = "abc"
_ = str
//_ = &(str[0]) // 对字符串变量的索引结果值不可寻址。
//_ = &(str[0:2]) // 对字符串变量的切片结果值不可寻址。
str2 := str[0]
_ = &str2 // 但这样的寻址就是合法的。

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

//_ = &([3]int{1, 2, 3}[0]) // 对数组字面量的索引结果值不可寻址。
//_ = &([3]int{1, 2, 3}[0:2]) // 对数组字面量的切片结果值不可寻址。
_ = &([]int{1, 2, 3}[0]) // 对切片字面量的索引结果值却是可寻址的。
//_ = &([]int{1, 2, 3}[0:2]) // 对切片字面量的切片结果值不可寻址。
//_ = &(map[int]string{1: "a"}[0]) // 对字典字面量的索引结果值不可寻址。

var map1 = map[int]string{1: "a", 2: "b", 3: "c"}
_ = map1
//_ = &(map1[2]) // 对字典变量的索引结果值不可寻址。

//_ = &(func(x, y int) int {
// return x + y
//}) // 字面量代表的函数不可寻址。
//_ = &(fmt.Sprintf) // 标识符代表的函数不可寻址。
//_ = &(fmt.Sprintln("abc")) // 对函数的调用结果值不可寻址。

dog := Dog{"little pig"}
_ = dog
//_ = &(dog.Name) // 标识符代表的函数不可寻址。
//_ = &(dog.Name()) // 对方法的调用结果值不可寻址。

//_ = &(Dog{"little pig"}.name) // 结构体字面量的字段不可寻址。

//_ = &(interface{}(dog)) // 类型转换表达式的结果值不可寻址。
dogI := interface{}(dog)
_ = dogI
//_ = &(dogI.(Named)) // 类型断言表达式的结果值不可寻址。
named := dogI.(Named)
_ = named
//_ = &(named.(Dog)) // 类型断言表达式的结果值不可寻址。

var chan1 = make(chan int, 1)
chan1 <- 1
//_ = &(<-chan1) // 接收表达式的结果值不可寻址。

}

规律或者关键词

1.不可变的

常量的值和基本类型的字面量会被储存到一个确切的内存区域中

2.临时结果

我们可以把各种对字面量施加的表达式的求值结果都看作是临时结果(注意是字面量不是变量)

常用的表达式有以下几种

1
2
3
4
5
6
7
获得某个元素的索引表达式
获得某个切片(片段)的切片表达式
访问某个字段的选择表达式
调用某个函数或方法的调用表达式
转换值的类型的类型转换表达式
判断值的类型的类型断言表达式
向通道发送元素或从通道哪里接收元素值的接收表达式

对切片字面量的索引结果值是可寻址的,这是因为每个切片值都会持有一个底层数组,这个底层数组中的每个元素值都有一个确切的内存地址

3.不安全的

字典中的键值的位置在一定条件下是会发生变动的,对字典的索引结果取址,会破坏程序的一致性