Golang学习笔记_11——指针

Golang学习笔记_08------For循环
Golang学习笔记_09------if条件判断
Golang学习笔记_10------Switch


文章目录

    • 指针
      • [1. 定义](#1. 定义)
      • [2. 初始化](#2. 初始化)
      • [3. 解引用指针](#3. 解引用指针)
      • [4. 指针的传递](#4. 指针的传递)
      • [5. 指针的零值](#5. 指针的零值)
      • [6. 指针的比较](#6. 指针的比较)
      • [7. 其他(可选)](#7. 其他(可选))
    • 源码

指针

在Go语言中,指针是一种非常基本且重要的数据类型,它允许你直接访问和操作内存地址。指针的使用在C和C++等语言中非常普遍,但Go语言在提供指针功能的同时,也尽量简化了其复杂性,使得指针在Go中相对安全且易于使用。

1. 定义

指针是一个存储了内存地址的变量。在Go中,你可以通过 *Type 来声明一个指针,其中 Type 是指针指向的变量的类型。例如,*int 是一个指向 int 类型变量的指针。

go 复制代码
var p *int

2. 初始化

你可以将变量的地址赋值给指针。使用 & 操作符来获取变量的内存地址。

go 复制代码
var a int = 42
var p *int &a

3. 解引用指针

解引用(或称取消引用)指针意味着访问指针所指向的内存位置的值。在Go中,这是通过前置星号*完成的。

go 复制代码
fmt.Println(*p) // 打印 p 指向的值,即 x 的值
*p = 21         // 修改 p 指向的值,即修改 x 的值

4. 指针的传递

在函数调用时,如果你希望函数能够修改调用者的变量,你可以将变量的指针传递给函数。

go 复制代码
func modifyValue(p *int) {
	*p = 100
}

测试方法

go 复制代码
func Test_modifyValue(t *testing.T) {
	num := 40

	type args struct {
		p *int
	}
	tests := []struct {
		name string
		args args
	}{
		{
			name: "init value = 1",
			args: args{&num},
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			modifyValue(tt.args.p)
			fmt.Println("modify value = ", num)
		})
	}
}

输出结果

go 复制代码
=== RUN   Test_modifyValue
=== RUN   Test_modifyValue/init_value_=_1
modify value =  100
--- PASS: Test_modifyValue (0.00s)
    --- PASS: Test_modifyValue/init_value_=_1 (0.00s)
PASS

5. 指针的零值

未初始化的指针的默认值是 nil。尝试解引用一个 nil 指针会导致运行时错误(panic)。

go 复制代码
var p *int
fmt.Println(*p) 
// 这将导致运行时错误: invalid memory address or nil pointer dereference

6. 指针的比较

go 复制代码
var a int = 42
var b int = 42
var p1 *int = &a
var p2 *int = &b
var p3 *int = &a

fmt.Println(p1 == p2) // 输出: false
fmt.Println(p1 == p3) // 输出: true

测试方法

go 复制代码
func Test_comparePoint(t *testing.T) {
	comparePoint()
}

输出结果

=== RUN   Test_comparePoint
false
true
--- PASS: Test_comparePoint (0.00s)
PASS

7. 其他(可选)

指针在数组、切面和结构体中会有重要作用。

go 复制代码
// 指针数组
var ptrArray []*int
ptrArray = append(ptrArray, &a, &b)
fmt.Println(*ptrArray[0], *ptrArray[1]) // 输出: 42 42(假设a和b的初始值都是42)

// 指针切片
var ptrSlice []*int
ptrSlice = make([]*int, 2)
ptrSlice[0] = &a
ptrSlice[1] = &b
fmt.Println(*ptrSlice[0], *ptrSlice[1]) // 输出: 42 42(假设a和b的初始值都是42)

type Rectangle struct {
    Width, Height int
}

func (r *Rectangle) Area() int {
    return r.Width * r.Height
}

func (r *Rectangle) SetWidth(width int) {
    r.Width = width
}

func main() {
    rect := Rectangle{Width: 10, Height: 5}
    fmt.Println(rect.Area()) // 输出: 50
    rect.SetWidth(20)
    fmt.Println(rect.Area()) // 输出: 100
}

源码

go 复制代码
// point_demo.go 文件
package point_demo

import "fmt"

func modifyValue(p *int) {
	*p = 100
}

func comparePoint() {
	var a int = 42
	var b int = 42
	var p1 *int = &a
	var p2 *int = &b
	var p3 *int = &a

	fmt.Println(p1 == p2) // 输出: false
	fmt.Println(p1 == p3) // 输出: true
}
go 复制代码
// point_demo_test.go 文件
package point_demo

import (
	"fmt"
	"testing"
)

func Test_modifyValue(t *testing.T) {
	num := 40

	type args struct {
		p *int
	}
	tests := []struct {
		name string
		args args
	}{
		{
			name: "init value = 1",
			args: args{&num},
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			modifyValue(tt.args.p)
			fmt.Println("modify value = ", num)
		})
	}
}

func Test_comparePoint(t *testing.T) {
	comparePoint()
}
相关推荐
go_bai3 分钟前
数据结构——单链表
数据结构·经验分享·笔记·学习方法
伍贰什丿21 分钟前
C语言学习day22:URLDownloadToFile函数/开发文件下载工具
c语言·c++·学习
qq_3667406022 分钟前
ubuntu+ros新手笔记(五):初探anaconda+cuda+pytorch
pytorch·笔记·ubuntu
伍贰什丿1 小时前
C语言学习day22:ReadProcessMemory函数/游戏内存数据读取工具开发
c语言·开发语言·学习·游戏
zmd-zk2 小时前
shuffle——spark
大数据·分布式·python·学习·spark
九月镇灵将2 小时前
爬虫逆向学习(十四):分享一下某数通用破解服务开发经验
爬虫·学习·逆向·补环境·vm2
coder_Alaric2 小时前
[笔记]Qt下使用SendMessage、PostMessage和接收window消息
笔记·qt
南宫生2 小时前
力扣-图论-14【算法学习day.64】
java·学习·算法·leetcode·图论
红色的山茶花3 小时前
YOLOv9-0.1部分代码阅读笔记-common.py
笔记