GoLang 中*(指针)与&(地址)的详细学习

这篇具有很好参考价值的文章主要介绍了GoLang 中*(指针)与&(地址)的详细学习。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

基本概念

Go语言提供了控制数据结构指针的能力,但是不能进行指针运算。Go语言允许你控制特定集合的数据结构、分配的数量以及内存访问模式。指针对于性能的影响相信程序员都知道。

指针类型

类型指针

允许对这个指针类型的数据进行修改,传递数据可以直接使用指针,无须拷贝数据,此类指针不能进行偏移和运算。

切片

由指向起始元素的原始指针、元素数量和容量组成。

优点

1、拥有指针高效访问的特点。

2、不会发生指针偏移,从而避免非法修改关键性数据的问题。

3、垃圾回收也比较容易对不会发生偏移的指针进行检索和回收。

4、切片在发生越界时,运行时会报出宕机,并且会打印出堆栈信息,而原始指针只会崩溃。

技术概念

1、一个指针变量可以指向任何一个值的内存地址;

2、它所指向的值的内存地址在32 和 64 位机器上分别占用 4个字节 或 8个字节;

3、占用字节的大小与所指向的值的大小无关。

4、当一个指针被定义后(通常缩写为ptr)没有分配任何变量时,它的默认值为nil 。

5、指针的值是带有 0x 的十六进制数据(比如:0xc063793bc9)。

地址概念

每个变量在运行时都拥有一个地址,这个地址代表变量在内存中的位置。

代码说明

Go语言中使用 * 代表指针;在变量名前面添加 & 操作符代表获取变量在内存中的地址。

指针及地址的使用方法

1、当使用 & 操作符对普通变量进行取地址操作时,可以得到变量的指针。此时可以对指针使用 * 操作符,可以得到变量值(此操作也叫指针取值),如以下代码:

package main

import "fmt"

func main() {
    
    // 定义一个字符串类型的变量
    var myAddr = "tree road 1025, 100"

    // 对字符串取地址, ptr类型为*string
    ptr := &myAddr

    // 打印ptr的类型
    fmt.Printf("ptr的类型是 : %T\n", ptr)

    // 打印ptr的指针地址
    fmt.Printf("ptr的地址是 : %p\n", ptr)

    // 对指针进行取值操作
    value := *ptr

    // 打印取值后的类型
    fmt.Printf("value的类型是 : %T\n", value)

    // 指针取值后就是指向变量的值
    fmt.Printf("value的值是 : %s\n", value)
}

运行结果如下:

ptr的类型是 : *string
ptr的地址是 : 0xc00003c250       
value的类型是 : string           
value的值是 : tree road 1025, 100

说明:取地址操作符 & 和取值操作符 * 是一对互补操作符, & 取出地址, * 根据地址取出地址指向的值。

变量、指针地址、指针变量、取地址、取值的相互关系和特性如下:

  • 对变量进行取地址操作使用 & 操作符,可以获得这个变量的指针变量。
  • 指针变量的值是指针地址。
  • 对指针变量进行取值操作使用 * 操作符,可以获得指针变量指向的原变量的值。

2、 * 操作符的根本意义就是操作指针指向的变量。当操作在右值时,就是取指向变量的值,当操作在左值时,就是将值设置给指向的变量。如下代码进行说明:

package main

import "fmt"

/**
 * 定义一个交换函数,参数为a、b,类型都为 *int 指针类型
 */
func swap(a, b *int) {
    
    // 取a指针的值,并把值赋给临时变量t,t此时是int类型
    t := *a

    // 取b指针的值,赋给a指针指向的变量,此时 *a的意思不是取a指针的值,而是 a指向的变量
    *a = *b

    // 将t的值赋给指针b指向的变量
    *b = t    

}

func main() {

    // 两个初始变量
    x, y := 1, 2

    // 交换变量值
    swap(&x, &y)

    // 输出变量值
    fmt.Println(x, y)    

}

运行结果如下:

2 1

3、在函数中的应用,比如返回一个结构体,直接上代码(大家自己体会一下):文章来源地址https://www.toymoban.com/news/detail-568636.html

package P


// 定义一个人的结构体
type Person struct {
    
    Age            int         // 年龄
    Sex            int         // 性别
    Name           string      // 名字
    Address        string      // 住址 
}

// 新建一个人
func NewPerson(age int, sex int, name string, address string) *Person {
    
    var person Person

    person = Person{
        Age: age,
        Sex: sex,
        Name: name,
        Address: address
    }
    
    // 返回地址即可(因为指针指向的就是地址)
    return &person
}

到了这里,关于GoLang 中*(指针)与&(地址)的详细学习的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Golang struct 结构体指针类型 / 结构体值类型

    结构体变量之间的赋值是值拷贝。 当需要通过变量去修改另外一个结构体内容的时候,可以通过传递地址的方式来达到这个效果。 这样使用肯定是不对的,因为.的运算优先级要高,所以先会去执行p2.age,之后又取地址,所以这个就不行。 在代码执行的时候先执行.的操作,

    2024年02月13日
    浏览(43)
  • Golang对比Java、python为什么要保留指针

    平时我们在Golang使用指针一般是为了以下的情况: 方法直接修改原来对象 保证参数传递的自由,可以在传递重量级对象时使用指针 但Go 保留指针不仅仅是为了解决传递参数的问题,还跟它的语言特性有密不可分的联系。 Go 里面的变量是 值语义 ,这个跟 C/C++是一脉相承的。

    2024年01月17日
    浏览(71)
  • Golang 获取本地 IP 地址方法

    在 Golang 中,使用 net 包可以很方便地获取到本机IP地址。 简单示例代码如下: 使用 udp 不需要关注是否送达,只需要对应的 ip 和 port 正确,即可获取到 IP 地址。简单示例代码如下:

    2024年02月15日
    浏览(55)
  • Golang(Go语言)IP地址转换函数

    String形式的IP地址和Int类型互转函数 代码 输出如下:  

    2024年02月05日
    浏览(54)
  • golang返回多层结构数据

    正常情况下,查询出的结果,基本上都是结构体所得 如图所表示,基本上查询出的两个结果 返回结果 比较好的办法是,data1和data2和data3等多个都包含在一个data里面,然后这个data和msg,以及code同一层级,而不是data1和data2和data3这些和msg以及code同一层级 解决办法: 可以事先

    2024年01月22日
    浏览(40)
  • 【数据结构】Golang 实现单链表

    通过指针将一组零散的内存块串联在一起 , 把内存块称为链表的“ 结点 ”。 记录下个结点地址的指针叫作 后继指针 next ,第一个结点叫作 头结点 ,把最后一个结点叫作 尾结点 。 定义单链表 在 golang 中可以通过结构体定义单链表: 操作单链表 使用 golang 实现单链表常用

    2024年02月10日
    浏览(44)
  • 【Golang】Golang进阶系列教程--为什么 Go for-range 的 value 值地址每次都一样?

    循环语句是一种常用的控制结构,在 Go 语言中,除了 for 以外,还有一个 range ,可以使用 for-range 循环迭代数组、切片、字符串、map 和 channel 这些数据类型。 但是在使用 for-range 循环迭代数组和切片的时候,是很容易出错的,甚至很多老司机一不小心都会在这里

    2024年02月15日
    浏览(61)
  • 【Golang】实现简单队列(Queue)数据结构

     在计算机科学中,队列是一种特殊的线性数据结构,它遵循FIFO(先进先出)原则。队列中的元素只能从一端(称为队尾或后端)添加,并且只能从另一端(称为队头或前端)移除。这种特性使得队列在许多算法和数据结构中都有广泛的应用,例如操作系统中的任务调度、网

    2024年01月19日
    浏览(39)
  • golang中的指针方法和值方法的区别,编程时该如何选择呢?

    我们都知道,方法的接收者类型必须是某个自定义的数据类型,而且不能是接口类型或接口的指针类型。所谓的值方法,就是接收者类型是非指针的自定义数据类型的方法。 Choosing whether to use a value or pointer receiver on methods can be difficult, especially to new Go programmers. If in doubt, use

    2024年02月09日
    浏览(79)
  • golang第七卷---go中的数据结构

    分享一个go语言高级编程学习网站:Go语言高级编程 数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成。 因为数组的长度是固定的,所以在Go语言中很少直接使用数组。 Go语言数组的声明: 数组是定长的,不可更改,在编译阶段就决定了

    2024年02月03日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包