首页 > 其他分享 >golang: 指针和地址

golang: 指针和地址

时间:2024-12-14 13:11:20浏览次数:5  
标签:变量 fmt ptr2 ptr1 golang 地址 指针

一,指针和地址的操作

1,代码:

要掌握以下三个用法:

    *指针变量名  得到指针所指向的变量
    *类型       表示这是一个此类型的指针
    &变量       返回一个存放变量地址的指针

package main

import (
    "fmt"
    "reflect"
)

func isPointer(v interface{}) bool {
    return reflect.ValueOf(v).Kind() == reflect.Ptr
}

// 定义一个结构体
type Person struct {
    Name string
    Age  int
}


func main() {

    //*指针变量名  得到指针所指向的变量
    //*类型       表示这是一个此类型的指针
    //&变量       返回一个存放变量地址的指针


    //声明指针,打印指针的地址
    person := Person{Name: "Alice", Age: 30}
    ptr1 := &person

    fmt.Println("ptr1是否指针:", isPointer(ptr1))
    fmt.Printf("ptr1指针本身的地址:%p\n", &ptr1)
    fmt.Printf("ptr1指向的变量:%v\n", *ptr1)
    fmt.Printf("ptr1指向的变量的地址:%p\n",&*ptr1)

    fmt.Println("name:", (*ptr1).Name)
    fmt.Println("name:", person.Name)
    fmt.Println("name:", (&person).Name)

    var ptr2 *Person = &person

    fmt.Println("ptr2是否指针:", isPointer(ptr2))
    fmt.Printf("ptr2指针本身的地址:%p\n", &ptr2)
    fmt.Printf("ptr2指向的变量:%v\n", *ptr2)
    fmt.Printf("ptr2指向的变量的地址:%p\n",&*ptr2)

    fmt.Println("name:", (*ptr2).Name)
    fmt.Println("name:", person.Name)
    fmt.Println("name:", (&person).Name)

}

 

2,测试效果:

$ go run main.go 
ptr1是否指针: true
ptr1指针本身的地址:0xc0000a0038
ptr1指向的变量:{Alice 30}
ptr1指向的变量的地址:0xc0000b2000
name: Alice
name: Alice
name: Alice

ptr2是否指针: true
ptr2指针本身的地址:0xc0000a0048
ptr2指向的变量:{Alice 30}
ptr2指向的变量的地址:0xc0000b2000
name: Alice
name: Alice
name: Alice

 

二,用指针作为参数

1,例子

package main

import (
    "fmt"
    "reflect"
)

func isPointer(v interface{}) bool {
    return reflect.ValueOf(v).Kind() == reflect.Ptr
}

// 定义一个结构体
type Person struct {
    Name string
    Age  int
}

//参数为值
func fn1(x int) {
    fmt.Println("fn1 x是否指针:", isPointer(x))
    fmt.Printf("fn1 变量x的地址:%p\n", &x)
	x = 10
}

//参数为指针
func fn2(x *int) {
    fmt.Println("fn2 x是否指针:", isPointer(x))
    fmt.Printf("fn2 指针变量x本身的地址:%p\n", &x)
    fmt.Printf("fn2 x指向的变量:%v\n", *x)
    fmt.Printf("fn2 x指向的变量的地址:%p\n",&*x)
	*x = 40
}


func main() {


	var a = 5
	fmt.Printf("变量a的地址:%p\n", &a)

	//fn1 方法内的x是一个复制的值,它的值改变与a无关,a原本的值所以没有变化
	fn1(a)
	fmt.Println("调用fn1后a的值:",a) //输出5;

    //方法内传入的是指针类型,*x指向变量a, 赋值改变了指针对应的内存地址,导致a的值变化
	fn2(&a)
	fmt.Println("调用fn2后a的值:",a) //输出40 ;

}

2,测试效果

$ go run main.go 
变量a的地址:0xc000084040

fn1 x是否指针: false
fn1 变量x的地址:0xc000084048
调用fn1后a的值: 5

fn2 x是否指针: true
fn2 指针变量x本身的地址:0xc000088040
fn2 x指向的变量:5
fn2 x指向的变量的地址:0xc000084040
调用fn2后a的值: 40

 

标签:变量,fmt,ptr2,ptr1,golang,地址,指针
From: https://www.cnblogs.com/architectforest/p/18599356

相关文章

  • golang: struct与指针
    一,可以通过指针访问struct的变量1,代码:packagemainimport("fmt""reflect")//判断是否指针funcisPointer(vinterface{})bool{returnreflect.ValueOf(v).Kind()==reflect.Ptr}//定义一个结构体typePersonstruct{NamestringAge......
  • golang:方法接收者带星号和不带星号的区别
    一,说明:不带星号的方法‌:这些方法定义在值接收者(valuereceiver)上。当你调用这些方法时,会操作该值的副本。如果方法内部修改了接收者,这些修改不会反映到原始值上。‌带星号的方法‌:这些方法定义在指针接收者(pointerreceiver)上。当你调用这些方法时,会操作原始值的指针。如果......
  • golang:第三方库:用jordan-wright/email发送邮件
    一,安装第三方库:$goget-ugithub.com/jordan-wright/emailgo:downloadinggithub.com/jordan-wright/emailv4.0.1-0.20210109023952-943e75fe5223+incompatiblego:addedgithub.com/jordan-wright/emailv4.0.1-0.20210109023952-943e75fe5223+incompatible二,代码:1,发送......
  • 电脑如何改自己的ip地址?这些方法轻松掌握
    在数字化时代,IP地址作为设备在网络中的唯一标识,扮演着至关重要的角色。无论是出于隐私保护、访问特定资源,还是解决网络冲突,有时我们都需要更改电脑的IP地址。然而,对于许多用户来说,如何安全、有效地更改IP地址仍是一个谜。本文将为您详细解读电脑更改IP地址的方法,让您轻松掌握这......
  • 变换ip是什么意思?如何变ip地址
    在网络的世界里,IP地址扮演着至关重要的角色,它如同设备的“网络身份证”,确保信息的准确传输。然而,在某些情况下,我们可能需要变换这个“身份证”,也就是更换IP地址。那么,变换IP到底是什么意思?如何改变IP地址呢?接下来,我们将深入探讨这两个问题。【一】变换IP是什么意思变换IP,即......
  • Golang学习笔记_05——延迟调用
    Golang学习笔记_02——函数Golang学习笔记_03——匿名函数和闭包Golang学习笔记_04——递归函数文章目录延迟调用1.延迟调用1.1使用场景1.2示例2.panic2.1使用场景2.2示例3.recover3.1使用场景3.2示例源码延迟调用在Go语言中,延迟调用(defer)是一个......
  • Windows 与 Linux 下 Ping IPv6 地址 | 常用网络命令
    注:本文为网络命令相关文章合辑。未整理去重。一、IPv6概述IPv6即“Internet协议版本6”,因IPv4地址资源面临耗尽问题而被引入以替代IPv4。IPv6则提供了理论上多达2128......
  • C++_快慢指针在业务开发中的应用-数据结构与算法
    报错的解决vector不是模板问题,第一是由于没有添加#include<vector>。第二是需要添加命名空间。命名空间添加有两种,第一是直接在vector前面加上std::,第二是开头加入usingnamespacestd;加入vector后,std命名空间没有vector的问题--C++版本问题其他快慢下标......
  • 基于AI的图片背景移除工具 - 无需联网+永久免费 (附下载地址)
    背景介绍​继上一篇文章发布以来(在浏览器里就可以运行的本地AI模型-一键去除图片背景AI_基于webgpu的去背景ai演示),有不少朋友反馈虽然一键去除图片背景工具很好用,但对于一些小白用户来说,自己启动本地服务器太过复杂,并且需要远程加载模型资源,导致很容易载入失败.针......
  • 我爱学算法之—— 感受双指针带来的快感(下)
    前言本篇文章继续来学习双指针算法;继续加油!!!一、三数之和15.三数之和-力扣(LeetCode)题目解析题目要求我们在一个给定的数组中,找到和等于0的三元组;但是呢有一些要求首先,这三元组中的元素是给定数组中的不同元素其次,找到的三元组不能够重复算法分析暴力枚举+set......