go20/day01/pointer/README.md
yumaojun03 93c6350643 ```
docs(pointer): 更新指针教程
2025-12-28 17:36:27 +08:00

1.9 KiB
Raw Permalink Blame History

指针概念

场景

  • func sum(a, b) total 这种没有指针参与的
  • func sum(a, b, sum): sum 是一个变量, 用于接收函数的处理结果
  • fmt.Scan: 接收用户输入的参数
  • flag.Parse(): 接收命令行参数
  • Restful API Handler(req, *resp): resp 就是变量必须是指针,用于接收 请求处理后的结果
var i int
fmt.Println("请输入一个整数:")
fmt.Scan(&i) // 把输入写入 i

var port int
flag.IntVar(&port, "port", 8080, "server port") // 命令行参数绑定到变量
flag.Parse()

概念

Go里面的参数 都是值传递, 不是引用传递(指针)

alt text

import (
	"fmt"
	"unsafe"
)

func main() {
	a := 10
	b := 20
	c := sum(a, b)
	println("a + b =", c)

	// 使用指针作为函数参数
	// 0x14000108020
	var result int

	// &result (类型安全的指针) 东西叫指针 有类型约束首GC印象的 地址
	fmt.Println("result 地址 =", &result)
	sumWithPointer(a, b, &result)
	println("a + b =", result)

	// uintptr 是无类型指针,可以存放任意指针的地址值, 裸内存地址, 不安全指针, 可能随时被回事,成为一个无效地址
	// 非法使用 uintptr 导致程序崩溃
	fmt.Println("result 地址 uintptr =", uintptr(unsafe.Pointer(&result)))
}

func sum(a int, b int) int {
	return a + b
}

// 这个函数没有Retrun
// *int 就是指针类型, 传递是 int这种类型的变量的地址
func sumWithPointer(a int, b int, c *int) {
	*c = a + b
}

获取用户输入

// 获取用户输入
var i int
fmt.Println("请输入一个整数:")
fmt.Scan(&i) // 把输入写入 i
fmt.Println("你输入的整数是:", i)

绑定CLI参数

// 命令行参数解析
// --port 9090
var port int
flag.IntVar(&port, "port", 8080, "server port") // 命令行参数绑定到变量
flag.Parse()
fmt.Println("服务器端口号是:", port)