go 指针

Posted jackey2015

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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" 字符串变量是可寻址的 但是字符串里的字符切片或数组是不可寻址的

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

解决go: go.mod file not found in current directory or any parent directory; see ‘go help modules‘(代码片段

你知道的Go切片扩容机制可能是错的

更新:C++ 指针片段

片段中的 EditText 上的空指针异常 [重复]

Go语言技巧之正确高效使用slice(听课笔记总结--简单易懂)

Go语言技巧之正确高效使用slice(听课笔记总结--简单易懂)