wxvirus wxvirus
首页
  • Go文章

    • Go语言学习
  • Rust

    • Rust学习
  • Java

    • 《Java》
  • Python文章

    • Python
  • PHP文章

    • PHP设计模式
  • 学习笔记

    • 《Git》
  • HTML
  • CSS
  • JS
  • 技术文档
  • GitHub技巧
  • 刷题
  • 博客搭建
  • 算法学习
  • 架构设计
  • 设计模式
  • 学习
  • 面试
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

无解的lifecycle

let today = new Beginning()
首页
  • Go文章

    • Go语言学习
  • Rust

    • Rust学习
  • Java

    • 《Java》
  • Python文章

    • Python
  • PHP文章

    • PHP设计模式
  • 学习笔记

    • 《Git》
  • HTML
  • CSS
  • JS
  • 技术文档
  • GitHub技巧
  • 刷题
  • 博客搭建
  • 算法学习
  • 架构设计
  • 设计模式
  • 学习
  • 面试
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • C&C++

  • PHP

  • Python

  • Go

    • go基础

      • Mac搭建Go语言环境
      • Go基础语法学习
      • 包管理
      • 锁
      • 并发基础
      • 单元测试
      • 交叉编译
      • go基本数据类型
      • go语言的数据类型的转换
      • 指针和参数传递
        • 指针
        • go 的参数传递
          • 参数传递
      • go切片
      • go Map
      • go结构体
      • 扩展已有类型或系统类型
      • go接口
      • 函数式编程
      • error错误处理
      • goroutine
      • channel
      • 互斥量
      • go并发模式
      • go指针
      • go字符串
      • 类型别名和自定义类型
      • 好用的包和工具
      • go实现简单迭代器
      • go结构体内存对齐
      • 文件操作
      • time标准库
      • select多路复用
      • httpServer介绍
    • go核心

    • 网络编程

    • gowebsocket

    • gocasbin

    • K8S

    • rabbitmq

    • 框架相关

    • go-zero

    • kafka

    • rpc

    • 性能相关

  • microservice

  • rust

  • Java

  • 学习笔记

  • 后端
  • Go
  • go基础
wxvirus
2022-01-29

指针和参数传递

# 指针

var c int = 2
var pc *int = &c // 定义一个指针 指向 c变量的地址
*pc = 3 // 将c的指向的内容更改为3
fmt.Println(c) // 最后输出值为3
1
2
3
4

go 的指针不能运算

# go 的参数传递

go 语言仅仅是只有值传递这样的。但是我们可以通过指针的方式来进行引用传递。

下面通过一个C的一个代码来进行分析

void pass_by_val(int a) {
    a++;
}

void pass_by_ref(int& a) {
    a++;
}

int main() {
    int a = 3;

    pass_by_val(a);
    printf("After pass_by_val: %d\n", a); // 3

    pass_by_ref(a);
    printf("After pass_by_ref: %d\n", a); // 4
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

pass_by_val是进行了值传递,将main函数内的a变量重新拷贝了一份传给函数。所以哪怕在函数中进行了改变,那也只是改变了拷贝的一个a的变量。

pass_by_ref是进行引用传递,将main函数内的a变量的地址赋给了函数 ,所以在函数中对a的操作都会影响到原来的a变量。

在 Go 语言中,它仅仅只有一种值传递的方式

但是呢,值传递意味着需要重新拷贝一份资源,是否会影响性能呢?所以就需要使用值传递和指针来进行配合。

# 参数传递

值传递

var a int

func f(a int)
1
2
3

指针来实现引用传递的效果

var a int

func f(pa *int)
1
2
3

指针传递实现引用传递效果

传递对象

var cache Cache

func f(cache Cache)
1
2
3

对象包裹指针值传递

这样也是一种值传递的方式,只不过cache数据包含了一个指针,拷贝了一份指针的数据,指针都是指向一个数据包。

下面我们看一个,两个变量交换值的案例:

func swap(a, b int) {
	b, a = a, b
}

func main() {
    a, b := 3, 4
    swap(a, b)
    fmt.Println(a, b) // 3, 4
}
1
2
3
4
5
6
7
8
9

很明显,这是值传递,就是将a和b拷贝了一份,并不会影响原来的值,所以最后还是 3 和 4。

使用指针

func swap(a, b *int) {
	*b, *a = *a, *b
}

func main() {
    a, b := 3, 4
	swap(&a, &b)
    fmt.Println(a, b) // 4, 3
}
1
2
3
4
5
6
7
8
9

这里将变量的地址传参,就可以进行替换。

但是对于此,我们何必要写成使用指针呢,我们直接使用函数将对应的两个值换个位置返回不就得了

func swap(a, b int) (int ,int) {
	return b, a
}

func main() {
    a, b := 3, 4
    a, b = swap(a, b)
    fmt.Println(a, b) // 4, 3
}
1
2
3
4
5
6
7
8
9

这样定义才是更好的。

编辑 (opens new window)
上次更新: 2022/01/29, 15:19:44
go语言的数据类型的转换
go切片

← go语言的数据类型的转换 go切片→

最近更新
01
vue3配合vite初始化项目的一些配置
07-26
02
网盘系统开发学习
07-24
03
linux多进程
06-19
更多文章>
Theme by Vdoing | Copyright © 2021-2024 wxvirus 苏ICP备2021007210号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式