当前位置: 首页 > news >正文

Golang 语言中的指针介绍

介绍:

        指针式一种数据类型,用来存储值的内存地址,为了便于理解,我们也可以把指针未内存地址,指针类型只占用内存4个或 8 个字节,在Golang 语言中,类型名称加 *  表示改类型的指针类型。

        指针类型变量也需要一块内存空间储存值,指针变量的值就是它所指向数据的内存地址,而普通变量的值就是具体存放的数据,不同的指针类型变量之间无法互相赋值,在Golang 语言,指针不支持运算,也不能获取常量的指针

指针定义:

        在Golang 语言中,指针定义有3中方式:

        第一种方式是使用取地符 & 获取变量的指针(内存地址);

        第二种方式的使用var 关键字声明指针变量,使用var 关键字声明的变量不能直接赋值和取值,因为它还没有内存地址,它的值是nil;

        第三种方式是使用内置的new 函数来声明指针的变量,new 函数接收一个参数,可以传递类型给它,返回值是传递类型的指针类型。

实例代码:

func main() {a := 1p := &afmt.Println("变量a 的值为:", a)fmt.Println("变量a 的内存地址为:", p)fmt.Printf("变量a 的类型为 %T\n:", a)fmt.Printf("变量a 的类型为 %T\n:", p)//var str string//var p1 *int////p1 = &str////p2 := new(int)//fmt.Printf("%v %T\n",p2,p2)
}

 输出结果:

指针操作:

        在Golang 语言中,指针操作包括取值和修改,取值就是获取指针指向的值,只需在指针变量前加 * ;修改就是修改指针指向的值,需要注意的是使用 var 关键字声明的指针变量不能直接赋值和取值,因为它还没有它分配内存,它的值为nil ,可以使用内置函数 new 给它分配内存。

示例代码:

import "fmt"func main() {b := 2p3 := &bval := *p3fmt.Println("变量 val 的值为 ",val)*p3  = 3fmt.Println("*p3 指针指向的值为: ", *p3)fmt.Println("变量 b 的值为: ",b)var p4 *int = new(int)*p4 = 4fmt.Println(*p4)
}

执行结果:

指针应用:

        在Golang 语言中,函数传递参数只有值传递,传递的实参都是参数原始值的拷贝副本,所以我们传递类型的参数时,修改参数的值,原始数据不会被修改。但是,如果是指针类型的参数,修改参数的值,原始数据也会被修改,原因的指针类型的参数存储的事内存地址,并且和实参的内存地址相同。

示例代码:


func main() {mySalary := 80000fmt.Printf("变量 mySalary 的内存地址为: %p\n",&mySalary)modifySalary(mySalary)fmt.Println(mySalary)// 指针类型参数,实参的值被改变modifySalary2(&mySalary)fmt.Println(mySalary)}func modifySalary(salary int)  {fmt.Printf("参数变量的内存地址为: %p\n",&salary)salary = 100000
}func modifySalary2(salary *int)  {fmt.Printf("参数变量的内存地址为: %p\n",&salary)*salary = 100000
}

运行结果:

指针接收者:

        在Golang 语言中,定义一个方法,接收者可以的值类型和指针类型,二者都可以调用方法,因为Golang 编译器会自动转换,所以二者是等价的

        示例代码:

import "fmt"type worker struct {name   stringsalary uint
}func (w *worker) raise() {w.salary += 1000
}func (w worker) raise1() {w.salary += 1000
}func main() {w := worker{name:   "frank",salary: 5000,}// 指针类型接收者w.raise()fmt.Printf("w 的姓名是 %s,薪水是每月 %d\n", w.name, w.salary)// 值类型调用者w1 := worker{name:   "frank1",salary: 5000,}fmt.Printf("w 的姓名是 %s,薪水是每月 %d\n", w1.name, w1.salary)w2 := worker{name: "luck",salary: 5000,}w2.raise()fmt.Printf("w 的姓名是 %s,薪水是每月 %d\n", w2.name, w2.salary)w3 := worker{name: "luck1",salary: 5000,}w3.raise()fmt.Printf("w 的姓名是 %s,薪水是每月 %d\n", w3.name, w3.salary)
}

运行结果:

如果需要修改接收者,可以使用指针修改指针向数据的值。

如果接收者是非 map 、slice 和 channel 类型,并且数据比较大,可以使用指针来节省内存。

总结:

        本文我们介绍了Golang 语言中的指针,和指针定义与操作,并且介绍了指针为指针参数和指针接收者的应用区别。使用指针虽然可以修改数据的值和节省内存,但是也给开发带来复杂性,所以为了开发简单,在开发中处理必须使用指针类型外,尽量使用值类型,比如数据小的类型int  、 bool 和需要并安全的代码其实没有必要使用指针。

http://www.dtcms.com/a/296527.html

相关文章:

  • 高版本Android跨应用广播通信实例
  • 40、鸿蒙Harmony Next开发:UI场景化-组件截图(ComponentSnapshot)
  • C++第一节课入门
  • Qt 元对象系统(Meta-Object System)解析
  • 前端安全问题怎么解决
  • 企业资产管理智能化:IT运维如何借力数字化管理提效避坑?
  • 配置DNS服务的正反向解析
  • 详解FreeRTOS开发过程(六)-- 队列
  • ESP32- 项目应用1 智能手表之更新时间 #3
  • Linux系统常用命令
  • 浅析飞算JavaAI “撤回需求” 功能:让需求管理更灵活
  • 【C++】类和对象(中)
  • 【三桥君】Windows系统如何临时关闭“Windows安全中心实时保护”?解析Win10和Win11关闭方法
  • C++中std::string和std::string_view使用详解和示例
  • Lua(字符串)
  • 生成式人工智能展望报告-欧盟-03-经济影响
  • pyautogui 置信度问题
  • 拖拽同时支持Y轴滚动
  • 开立医疗2026年校园招聘
  • openbmc 日志系统继续分析
  • 行为型模式-协作与交互机制
  • 华为仓颉编程语言的表达式及其特点
  • mac llama_index agent算术式子计算示例
  • 力扣刷题(第九十七天)
  • 强化学习入门三(SARSA)
  • 专题:2025微短剧行业生态构建与跨界融合研究报告|附100+份报告PDF汇总下载
  • LeetCode 1695.删除子数组的最大得分:滑动窗口(哈希表)
  • 07 RK3568 Debian11 网络优先级
  • “抓了个寂寞”:一次实时信息采集的意外和修复
  • 网络基础19--OSPF路由协议(上)