查看: 78|回复: 1

Go语言初步 4

[复制链接]

45

贡献

36

主题

164

积分

版主

积分
164
QQ
发表于 2026-7-3 12:29:48 | 显示全部楼层 |阅读模式
6.延迟

defer关键字表示延迟,一条延迟语句将推迟一个函数的执行,直到其所在的函数返回。
被延迟调用的参数会立即被计算,但函数调用不会执行,直到所在的函数返回。
延迟是堆叠在栈中的,后进先出。
什么是栈?有一个经典的笑话:
有一个程序员开了一家客栈,一天来了很多顾客,但是先来的顾客等了好久都没吃到饭,而后来的顾客的菜居然已经上齐了,先来的顾客勃然大怒,问道:“你们这是怎么回事?为什么后来的顾客先吃到饭?”前程序员老板回答道:“不好意思先生,我们这里是客栈呢。”

  1. package main

  2. import "fmt"

  3. func main() {
  4.         fmt.Println("counting")

  5.         for i := 0; i < 10; i++ {
  6.                 defer fmt.Println(i)
  7.         }

  8.         fmt.Println("done")
  9. }
复制代码
这样输出的结果是:
  1. counting
  2. done
  3. 9
  4. 8
  5. 7
  6. 6
  7. 5
  8. 4
  9. 3
  10. 2
  11. 1
  12. 0
复制代码
7.指针
先前的内容里提到过指针,就不详细讲了,下面内容来自JetBrainsAcademy:
Go 语言有指针。指针保存一个值的内存地址。
类型 *T 是一个指向 T 值的指针。它的零值是 nil。
var p *int
& 操作符生成其操作数的指针。
i := 42p = &i
* 操作符表示指针指向的底层值。
fmt.Println(*p) // 通过指针 p 读取 i*p = 21         // 通过指针 p 设置 i
这被称为“解引用”或“间接引用”。
与 C 不同,Go 没有指针运算。
  1. package main

  2. import "fmt"

  3. func main() {
  4.         i, j := 42, 2701

  5.         p := &i         // point to i
  6.         fmt.Println(*p) // read i through the pointer
  7.         *p = 21         // set i through the pointer
  8.         fmt.Println(i)  // see the new value of i

  9.         p = &j         // point to j
  10.         *p = *p / 37   // divide j through the pointer
  11.         fmt.Println(j) // see the new value of j
  12. }
复制代码
输出:
  1. 42
  2. 21
  3. 73
复制代码

Hi~ o(* ̄▽ ̄*)ブ I Love U ~

37

贡献

6

主题

166

积分

正式会员

积分
166
发表于 2026-7-3 18:28:13 | 显示全部楼层
^_^老掉牙程序员笑话 依旧FILO

教程写的很用心,顶
查看帮助

相关侵权、举报、投诉及建议等,请按帮助内指引进行反馈

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部