go之变量、指针、引用地址
一、值类型
- 定义和说明
定义:变量直接指向存在内存中的值,我们称之为值类型。
值类型的变量的值存储在栈中。
值类型 将一个变量赋值给另一个变量 被称为值拷贝
- 实例
package main
import "fmt"
func main(){
var num1,num2 int
num1 = 10
num2 = num1 // 值类型赋值操作
fmt.Println(num1,num2) // 10 10
num1 = 20
fmt.Println(num1,num2) // 20 10
}
二、指针类型
- 定义
一个变量指向内存中值所在的内存地址,我们称这个变量为指针类型
go 语言中的指针与C/C++ 中的指针用法是一样的,只是出于安全性的考虑go增加了:
1、不同类型的指针不能互相转化
2、任何普通指针类型*T和uintptr之间不能互相转化
3、指针变量不能进行运算
- 实例
package main
import "fmt"
func main(){
var num int = 100
var ptr *int // 类型前 加 * 表示这是指针类型,指针类型的初始值为nil ,和其他语言的NUll,None一样
ptr = &num // & 取num 变量的内存地址。 因为ptr 是指针,指向的是内存地址,所以需要赋值操作的是内存地址
fmt.Println("ptr 指针的值:",ptr)
fmt.Println("*ptr 指针的值:",*ptr) // * 取指针内存地址所指向的值
num = 200
fmt.Println("*ptr 指针的值:",*ptr)
}
结果:
ptr 指针的值: 0xc000048080
*ptr 指针的值: 100
*ptr 指针的值: 200
- *ptr 没有操作,为什么值发生了变化
ptr 是指针类型,并被赋予了 num 的内存地址,当num值发现变化时,实际也就是 ptr 内存地址所对应的值变了
因为 ptr内存地址所对应的 内存值就是num的值
三、值与内存地址与指针
1、变量是抽象出来的概念,go语言程序运行时即表示内存值
2、内存地址即 内存值所在的内存空间的编号
3、指针变量:是一种占位符,用于引用计算机的内存地址。可理解为内存地址的标签
四、取地址与解引用
- 说明
在go语言中我们可以通过
& 是取地址符号 , 即取得某个变量的地址 , 如 ; &a
* 是指针运算符 , 可以表示一个变量是指针类型 , 也可以表示一个指针变量所指向的存储单元 , 也就是这个地址所存储的值
- 运用
package main
import "fmt"
func main(){
var n1,n2,n3 int
n1 = 100
n2 = 200
n3 = 3
swap(&n1,&n2) // 传内存地址
add(&n3) // 取内存地址
fmt.Println(n1) // 200
fmt.Println(n2) // 100
fmt.Println(n3) // 4
var num *int // 申明一个int 指针类型
num = &n3 // 所以可以赋值 内存地址
add(num)
fmt.Println("num指针变量的内存值:",*num) // *num == 5
// 此时n3 == 5
}
// 传入 两个指针类型的数据.
func swap(i,j *int){
*i,*j = *j,*i // 值的替换
}
func add(num *int){
// *num 解引用
*num = *num + 1
}
五、引用类型
在go语言中目前引用类型有: 切片、map、chan、func
引用类型可以简单的理解为指针
这个后面会介绍
如果喜欢看小说,请到183小说网
go之变量、指针、引用地址的更多相关文章
- C++ 指针 引用 变量引用
变量引用: 引用的作用就是给变量起个别名,假如有一个变量a,想给它起个别名b, 可以这么写:int a;//定义a是整型变量.int &b=a;//声明b是a的引用. 上面就是 ...
- PHP变量作用域以及地址引用问题
作用域的概念: 在PHP脚本的任何位置都可以声明变量,但是,声明变量的位置会大大影响访问变量的范围.这个可以访问的范围称为作用域. 主要的常用的包括:局部变量.全局变量.静态变量. 1.局部变量:就是 ...
- Little-endian的一个好处:在变量指针转换的时候地址保持不变
Big-endian 的内存顺序和数字的书写顺序是一致的,方便阅读理解.Little-endian 在变量指针转换的时候地址保持不变,比如 int64* 转到 int32* 各有利弊,统一就好,目前看 ...
- c++,基类声明的指针变量和引用类型变量可以指向派 生类的对象
基类声明的指针变量和引用类型变量可以指向派生类的对象,而反过来派生类的指针却不能指向基类变量. 这与基类和派生类之间,被允许的赋值方向是相反的. 但是从逻辑上很容易推敲其合理性.
- 大一C语言学习笔记(7)---指针篇--什么是指针?什么是指针变量?取地址符“&”的作用是什么?地址运算符“*”的作用是什么,怎么理解两者?
"指针是C语言的灵魂"这句话一开始我没怎么明白,现在接触了指针,终于知道为什么这么说了,因为....难,真难:下面说一下我对这句话的见解: C语言拥有着其他语言所没有的特性---直 ...
- paip.指针 引用 c++ java的使用总结.
paip.指针 引用 c++ java的使用总结. ///////////////一般一个变量包括下面的信息 a.地址(指针) b.命名(引用,别名) c.变量内容.. 指针是一个变量的地址, ...
- Python中的变量、引用、拷贝和作用域
在Python中,变量是没有类型的,这和以往看到的大部分编辑语言都不一样.在使用变量的时候,不需要提前声明,只需要给这个变量赋值即可.但是,当用变量的时候,必须要给这个变量赋值:如果只写一个变量,而没 ...
- 深入理解PHP原理之变量分离/引用
19 Sep 08 深入理解PHP原理之变量分离/引用(Variables Separation) 作者: Laruence( ) 本文地址: http://www.laruence.com/20 ...
- Delphi函数翻译成VC要注意句柄指针传递(传递Handle的时候,必须加上一个指针引用,才能消除编译错误)
Delphi里做了魔法变化,每个变量名称本身就是指针,因为不怎么需要指针语法.我也不知道是不是因为这个原因引起的Delphi与VC对句柄的不同处理. 这是Delphi的强行关机函数,好用,调用方式:W ...
随机推荐
- Discuz 首页图文列表实现
<div id="shoucang"> <!--{eval $list_count=0;}--> <!--{loop $threadlist $thr ...
- mvc 类中对应数据库属性
[StringLength()] //可空 对应数据库可空 [DefaultValue("")] [DisplayName("添加人用户名")] public ...
- Redis事物及锁的运用
redis与mysql事物比较如下: 下面是一个redis事物运用于买票的demo
- Photoshop如何实现图片相对画布居中
先按ctrl+A,再选择要居中的图层,然后就会发现居中按钮被激活了
- mysql5.7初始化密码报错ERROR1820(HY000):YoumustresetyourpasswordusingALTERUSERstateme
1,mysql5.6是密码为空直接进入数据库的,但是mysql5.7就需要初始密码 cat /var/log/mysqld.log | grep password 或者:grep 'temporary ...
- Python培训时长多久可以学会?马哥教育9年经验之谈
在Python成为一门炙手可热的语言之后,很多人也开始准备向这个行业发展.技术入行也就是培训和自学两条路,各有优劣,不过培训因为学习比较系统比较快也受到不少人欢迎. 今天我就来给大家分享一下Pytho ...
- Oracle,sqlserver,mySQl的区别和联系:
1.日期处理方式 2.对保留字和关键字的处理方式: Oracle,sqlserver,mySQl的保留字不可以用作列字段,关键字可以,但他们对关键字的处理方式又不同: Oracle:关键字作为列时:用 ...
- 【上海站】EOLINKER 用户培训之旅,等你来共建API新连接
从今年3月4日起,EOLINKER AMS 团队将再次开启全国用户培训之旅.本次全国培训之旅依旧将覆盖北上广深等国内主要城市,重点提供两种服务内容,一是 对 EOLINKER 产品的交流,包括 API ...
- vue 打印 页面特定部分转pdf
https://www.jb51.net/article/147040.htm https://www.jianshu.com/p/dd120b65446a //转pdf
- 3.Linux的远程管理及网络下载
3.1 Linux的远程管理 3.1.1 远程管理概述 什么是远程管理: 1.为什么需要远程管理: 服务器通常是Linux系统,而服务器不可能一直在身边,所以就需要远程来操作服务器 企业中通常需要集群 ...