Go 学习笔记(70)— Go 变量声明、变量初始化、值类型变量赋值、指针类型变量赋值
1. 变量声明
要单纯声明一个变量,可以通过 var
关键字,如下所示:
var s string
该示例只是声明了一个变量 s
,类型为 string
,并没有对它进行初始化,所以它的值为 string
的零值,也就是 “”(空字符串)。
来声明一个指针类型的变量试试,如下所示:
var sp *string
发现也是可以的,但是它同样没有被初始化,所以它的值是 *string
类型的零值,也就是 nil
。
2. 变量初始化
变量可以通过 =
运算符赋值,也就是修改变量的值。如果在声明一个变量的时候就给这个变量赋值,这种操作就称为变量的初始化。
如果要对一个变量初始化,可以有三种办法。
- 声明时直接初始化
var s string = "hello"
- 声明后再进行初始化
var s string
s = "hello"
- 使用
:=
简单声明
s := "hello"
3. 不同类型变量赋值
3.1 值类型变量
func main() {var s strings = "hello"fmt.Println(s)
}
运行以上代码,可以正常打印,说明值类型的变量没有初始化时,直接赋值是没有问题的。
3.2 指针类型的变量呢
func main() {var sp *string*sp = "hello"fmt.Println(*sp)
}
运行这些代码,你会看到如下错误信息:
panic: runtime error: invalid memory address or nil pointer dereference
这是因为指针类型的变量如果没有分配内存,就默认是零值 nil
,它没有指向的内存,所以无法使用,强行使用就会得到以上 nil
指针错误。
而对于值类型来说,即使只声明一个变量,没有对其初始化,该变量也会有分配好的内存。
在下面的示例中,声明了一个变量 s
,并没有对其初始化,但是可以通过 &s
获取它的内存地址。这其实是 Go
语言帮我们做的,可以直接使用。
func main() {var s stringfmt.Printf("%p\n",&s)
}
为什么 var wg sync.WaitGroup
声明的变量 wg
不进行初始化也可以直接使用?
因为 sync.WaitGroup
是一个 struct
结构体,是一个值类型,Go
语言自动分配了内存,所以可以直接使用,不会报 nil
异常。
总结: 如果要对一个变量赋值,这个变量必须有对应的分配好的内存,这样才可以对这块内存操作,完成赋值的目的。
注意:其实不止赋值操作,对于指针变量,如果没有分配内存,取值操作一样会报
nil
异常,因为没有可以操作的内存。
所以一个变量必须要经过声明、内存分配才能赋值,才可以在声明的时候进行初始化。指针类型在声明的时候,Go
语言并没有自动分配内存,所以不能对其进行赋值操作,这和值类型不一样。
所以 map
和 chan
也一样,因为它们本质上也是指针类型。
func main() {var d map[string]stringd["aa"] = "123"fmt.Printf("%v\n", d)
}
报错:
panic: assignment to entry in nil map
Go 学习笔记(70)— Go 变量声明、变量初始化、值类型变量赋值、指针类型变量赋值相关推荐
- LabView学习笔记(七):变量与移位寄存器
Labview学习笔记: LabView学习笔记(一):基础介绍 LabView学习笔记(二):滤波器实验 LabView学习笔记(三):基本控件 LabView学习笔记(四):动态数据类型 LabV ...
- C++ static、const和static const类型成员变量声明及其初始化
C++ static.const和static const类型成员变量声明及其初始化 const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间. ...
- OpenCV学习笔记(四十一)——再看基础数据结构core OpenCV学习笔记(四十二)——Mat数据操作之普通青年、文艺青年、暴力青年 OpenCV学习笔记(四十三)——存取像素值操作汇总co
OpenCV学习笔记(四十一)--再看基础数据结构core 记得我在OpenCV学习笔记(四)--新版本的数据结构core里面讲过新版本的数据结构了,可是我再看这部分的时候,我发现我当时实在是看得太马 ...
- OpenCV学习笔记(六):非线性滤波-中值、双边:medianBlur(),bilateralFilter()
OpenCV学习笔记(六):非线性滤波-中值.双边:medianBlur(),bilateralFilter() 1.中值滤波(Median filter) 是一种典型的非线性滤波技术,基本思想是用像 ...
- AR学习笔记(七):阈值二值化优化与颜色分割的优化
AR学习笔记(七):阈值二值化优化与颜色分割的优化 阈值二值化的优化 当前方案 图像预处理 阈值二值化 优化方案 otsu法 顶帽变换 分块阈值法 颜色分割的优化 当前方案 优化方案 HSV模型分割 ...
- typescript学习笔记1-tsconfig.json配置和变量类型声明
一,tsconfig.json {// 编译器选项"compilerOptions": {/* 基本选项 */"target": "es5" ...
- 【Linux学习笔记④】——Shell程序设计【变量 输入与输出 条件表达式 判断语句 循环语句 Shell函数】
⌛️ 文章目录 一.Shell 概述 二.Shell 脚本的定义与执行 2.1 Shell 脚本的定义 2.2 Shell 脚本的执行 三.Shell 变量 3.1 用户自定义变量 3.2 环境变量 ...
- shell中文件路径用变量定义_shell学习笔记01(概述amp;变量)
Shell概述 为什么要学习Shell呢? 因为有用. Shell脚本入门 1.脚本格式 脚本以#!/bin/bash开头(指定解析器) 2.第一个Shell脚本:helloworld (1)需求:创 ...
- 进程通信学习笔记(互斥锁和条件变量)
1.互斥锁:上锁和解锁 Posix互斥锁作为数据类型pthread_mutex_t的变量声明.如果互斥锁变量是静态分配的,那么可以把它初始化成常值PTHREAD_MUTEX_INITIALIZER.如 ...
- C++Primer学习笔记:第2章 变量和基本类型
空类型不对应具体的值,仅用于一些特殊的场合 long的长度为32位,float有7个有效位,double有16个有效位 如果数值超过了int的范围,应该用long long而不是long,long一般 ...
最新文章
- SAP QM 执行事务代码QS51维护使用决策的选择集,系统报错 – Transaction no longer valid for catalog ‘3’ -
- snap安装指定版本的软件
- 当img 路径为空时不显示x号
- 忆阻器的matlab建模_忆阻器Simulink建模和图形用户界面设计.PDF
- 拼多多黄铮长文自述:用常识判断未来
- Python 之 单例
- H5表单中时间日期控件
- 安装 Office 2010 错误 error 1935和数据库以及安卓路线
- 大数据与人工智能专业都这么火,我们应该怎么选?
- 一年经验的java程序员薪资有多少?java收入分级
- 手机ZTE中兴U802 U807手机解锁图案忘了 如何处理
- 人工智能全面战胜人类?下一步是取代人类?
- Debian firmware:failed to load i915/kbl_dmc解决
- 安装gin失败 # cd .; git clone -- https://github.com/gin-gonic/gin xcrun: error: invalid active develope
- PDF迅捷编辑软件编辑PDF文件简单吗
- 块存储,文件存储,对象存储的区别和理解
- 我所见过的最强武侠原创
- Docker技术攻陷笔记
- 键盘打字游戏简要代码
- An efficient augmented Lagrangian method with applications to total variation minimization论文阅读笔记
热门文章
- 分割数组(将数组三等分)
- 2022-2028年中国机制砂石行业投资分析及前景预测报告
- 科大奥锐干涉法测微小量实验的数据_光学干涉观测精确丈量宇宙 | 赛先生天文...
- 【Springboot】日志
- pip 将 某包指定到某目录 批量安装
- 【TensorFlow】理解tf.nn.conv2d方法 ( 附代码详解注释 )
- 硬核科普:到底啥是云原生?
- 为什么您应该使用基于标准的开发实践
- struct.error: ushort format requires 0 <= number <= 0xffff
- Invoking Page() in async task.