1. 变量声明

要单纯声明一个变量,可以通过 var 关键字,如下所示:

var s string

该示例只是声明了一个变量 s,类型为 string,并没有对它进行初始化,所以它的值为 string 的零值,也就是 “”(空字符串)。

来声明一个指针类型的变量试试,如下所示:

var sp *string

发现也是可以的,但是它同样没有被初始化,所以它的值是 *string 类型的零值,也就是 nil

2. 变量初始化

变量可以通过 = 运算符赋值,也就是修改变量的值。如果在声明一个变量的时候就给这个变量赋值,这种操作就称为变量的初始化。

如果要对一个变量初始化,可以有三种办法。

  1. 声明时直接初始化
var s string = "hello"
  1. 声明后再进行初始化
var s string
s = "hello"
  1. 使用 := 简单声明
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 语言并没有自动分配内存,所以不能对其进行赋值操作,这和值类型不一样。

所以 mapchan 也一样,因为它们本质上也是指针类型。

func main() {var d map[string]stringd["aa"] = "123"fmt.Printf("%v\n", d)
}

报错:

panic: assignment to entry in nil map

Go 学习笔记(70)— Go 变量声明、变量初始化、值类型变量赋值、指针类型变量赋值相关推荐

  1. LabView学习笔记(七):变量与移位寄存器

    Labview学习笔记: LabView学习笔记(一):基础介绍 LabView学习笔记(二):滤波器实验 LabView学习笔记(三):基本控件 LabView学习笔记(四):动态数据类型 LabV ...

  2. C++ static、const和static const类型成员变量声明及其初始化

    C++ static.const和static const类型成员变量声明及其初始化 const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间. ...

  3. OpenCV学习笔记(四十一)——再看基础数据结构core OpenCV学习笔记(四十二)——Mat数据操作之普通青年、文艺青年、暴力青年 OpenCV学习笔记(四十三)——存取像素值操作汇总co

    OpenCV学习笔记(四十一)--再看基础数据结构core 记得我在OpenCV学习笔记(四)--新版本的数据结构core里面讲过新版本的数据结构了,可是我再看这部分的时候,我发现我当时实在是看得太马 ...

  4. OpenCV学习笔记(六):非线性滤波-中值、双边:medianBlur(),bilateralFilter()

    OpenCV学习笔记(六):非线性滤波-中值.双边:medianBlur(),bilateralFilter() 1.中值滤波(Median filter) 是一种典型的非线性滤波技术,基本思想是用像 ...

  5. AR学习笔记(七):阈值二值化优化与颜色分割的优化

    AR学习笔记(七):阈值二值化优化与颜色分割的优化 阈值二值化的优化 当前方案 图像预处理 阈值二值化 优化方案 otsu法 顶帽变换 分块阈值法 颜色分割的优化 当前方案 优化方案 HSV模型分割 ...

  6. typescript学习笔记1-tsconfig.json配置和变量类型声明

    一,tsconfig.json {// 编译器选项"compilerOptions": {/* 基本选项 */"target": "es5" ...

  7. 【Linux学习笔记④】——Shell程序设计【变量 输入与输出 条件表达式 判断语句 循环语句 Shell函数】

    ⌛️ 文章目录 一.Shell 概述 二.Shell 脚本的定义与执行 2.1 Shell 脚本的定义 2.2 Shell 脚本的执行 三.Shell 变量 3.1 用户自定义变量 3.2 环境变量 ...

  8. shell中文件路径用变量定义_shell学习笔记01(概述amp;变量)

    Shell概述 为什么要学习Shell呢? 因为有用. Shell脚本入门 1.脚本格式 脚本以#!/bin/bash开头(指定解析器) 2.第一个Shell脚本:helloworld (1)需求:创 ...

  9. 进程通信学习笔记(互斥锁和条件变量)

    1.互斥锁:上锁和解锁 Posix互斥锁作为数据类型pthread_mutex_t的变量声明.如果互斥锁变量是静态分配的,那么可以把它初始化成常值PTHREAD_MUTEX_INITIALIZER.如 ...

  10. C++Primer学习笔记:第2章 变量和基本类型

    空类型不对应具体的值,仅用于一些特殊的场合 long的长度为32位,float有7个有效位,double有16个有效位 如果数值超过了int的范围,应该用long long而不是long,long一般 ...

最新文章

  1. SAP QM 执行事务代码QS51维护使用决策的选择集,系统报错 – Transaction no longer valid for catalog ‘3’ -
  2. snap安装指定版本的软件
  3. 当img 路径为空时不显示x号
  4. 忆阻器的matlab建模_忆阻器Simulink建模和图形用户界面设计.PDF
  5. 拼多多黄铮长文自述:用常识判断未来
  6. Python 之 单例
  7. H5表单中时间日期控件
  8. 安装 Office 2010 错误 error 1935和数据库以及安卓路线
  9. 大数据与人工智能专业都这么火,我们应该怎么选?
  10. 一年经验的java程序员薪资有多少?java收入分级
  11. 手机ZTE中兴U802 U807手机解锁图案忘了 如何处理
  12. 人工智能全面战胜人类?下一步是取代人类?
  13. Debian firmware:failed to load i915/kbl_dmc解决
  14. 安装gin失败 # cd .; git clone -- https://github.com/gin-gonic/gin xcrun: error: invalid active develope
  15. PDF迅捷编辑软件编辑PDF文件简单吗
  16. 块存储,文件存储,对象存储的区别和理解
  17. 我所见过的最强武侠原创
  18. Docker技术攻陷笔记
  19. 键盘打字游戏简要代码
  20. An efficient augmented Lagrangian method with applications to total variation minimization论文阅读笔记

热门文章

  1. 分割数组(将数组三等分)
  2. 2022-2028年中国机制砂石行业投资分析及前景预测报告
  3. 科大奥锐干涉法测微小量实验的数据_光学干涉观测精确丈量宇宙 | 赛先生天文...
  4. 【Springboot】日志
  5. pip 将 某包指定到某目录 批量安装
  6. 【TensorFlow】理解tf.nn.conv2d方法 ( 附代码详解注释 )
  7. 硬核科普:到底啥是云原生?
  8. 为什么您应该使用基于标准的开发实践
  9. struct.error: ushort format requires 0 <= number <= 0xffff
  10. Invoking Page() in async task.