美文网首页
指针的操作、go 的规则、for...range

指针的操作、go 的规则、for...range

作者: 天命_风流 | 来源:发表于2020-09-14 23:27 被阅读0次

关于指针的有限操作

  • 传统意义上,指针是一个指向某个确切内存地址的值。这个地址可以是任何数据或者代码的起始地址。
  • uintptr 也可以代表指针,它是一个数值类型。
  • unsafe.Pointer 可以表示任何指向可寻址的值的指针。
  • 不可变的值不可寻址,如常量、函数、方法的字面量。
  • 绝大多数临时结果。
  • 使用指针操作可能会破坏程序的一致性,这是不安全的。
  • 你可以通过 unsafe 操纵指针,如下面这样获得一个执政值
dog := Dog{"little pig"}
dogP := &dog
dogPtr := uintptr(unsafe.Pointer(dogP))
  • 使用它可以带来很多的灵活性,但是这种骚操作很不安全,所以建议不要这么做。

go 语句

  • goroutine 代表并发模型中的用户级线程,我一般叫他协程。
  • goroutine 的切换很快,切换成本很低,且不需要操作系统的调度,所以可以很灵活。
  • 劣势在于,控制复杂。

go 中的系统级线程调度器 GPM

  • G:goroutine 的缩写。
  • P:processor 的缩写,它可以承载多个 G,并让它们与 M 对接。
  • M:machine 的缩写,即系统级线程。


    image.png

    它们之间有一套成熟的调度机制,对于这套机制,有机会我们详细了解一下。

range表达式

  • 可以使用 range 迭代的:数组、数组的指针、切片、字符串、字典、通道等。

for...range

看下面一段代码:

numbers2 := [...]int{1, 2, 3, 4, 5, 6}
maxIndex2 := len(numbers2) - 1
for i, e := range numbers2 {
  if i == maxIndex2 {
    numbers2[0] += e
  } else {
    numbers2[i+1] += e
  }
}
fmt.Println(numbers2)  // [7 3 5 7 9 11]

为什么会是这个结果?在这里你有一些东西需要了解:

  • for 语句被执行的时候,会有一个队 range 右边的变量复制的过程。
  • 这个复制只有一次,不管这个变量有多少次迭代。
  • range 的求值结果会被复制,也就是说,被迭代的对象是 range 结果值的副本,而不是原值。

根据上面的原理,你可以尝试理解下面的代码:

numbers2 := [...]int{1, 2, 3, 4, 5, 6}
maxIndex2 := len(numbers2) - 1
for i, e := range numbers2 {
  if i == maxIndex2 {
    numbers2[0] += e
  } else {
    numbers2[i+1] += e
  }
}
fmt.Println(numbers2)  // [7 3 5 7 9 11]

如果 number2 为切片,结果将会是 [22 3 6 10 15 21],你理解为什么吗?

相关文章

  • 指针的操作、go 的规则、for...range

    关于指针的有限操作 传统意义上,指针是一个指向某个确切内存地址的值。这个地址可以是任何数据或者代码的起始地址。 u...

  • go语言值传递与指针传递

    go语言指针 go语言作为静态编译型语言,具有指针类型,但是不提供对指针的移位危险操作,防止指针的越界等问题。 g...

  • Go结构-2

    指针 普通指针 通过指针也可以间接操作指向的存储空间 指向数组的指针 可以通过指针间接操作数组 注意点:Go语言中...

  • golang之channel用法[转]

    转自 Go Channel 高级实践 用法 超时控制 取最快的结果 限制最大并发数 for...range 优先 ...

  • 13-Go语言指针和方法

    指针 普通数据类型指针 Go语言中的普通指针和C语言中的普通指针一样, 通过指针也可以间接操作指向的存储空间 Go...

  • go编程基础视频笔记-控制语句

    指针 Go虽然保留了指针,但与其他语言不同Go中不支持指针运算以及->运算符,而直接采用.选择符来操作指针目标对象...

  • 第03天(复合类型)_01

    01_指针基本操作.go 02_不要操作没有合法指向的内存.go 03_new函数的使用.go 04_普通变量做函...

  • GO语言基础(三)

    指针 Go 拥有指针。指针保存了值的内存地址。 类型 *T 是指向 T 类型值的指针。其零值为 nil。 & 操作...

  • go 指针

    指针 go语言指针:默认值为nil , 没有NULL常量操作符 "&" 取变量地址 &a , "*" 通过指针访问...

  • (十四)golang unsafe.Pointer

    golang 的指针Go语言是个强类型语言。也就是说Go对类型要求严格,不同类型不能进行赋值操作。指针也是具有明确...

网友评论

      本文标题:指针的操作、go 的规则、for...range

      本文链接:https://www.haomeiwen.com/subject/auuaektx.html