Go_变量使用详解

变量

变量的本质是计算机分配的一块内存,用于存放数据,变量是在程序运行过程中,其值可以发生改变的数据,变量属于临时存储,当程序运行结束,存放该数据的内存就会释放,该变量就会随着内存的释放而消失。

局部变量&全局变量

  • 定义函数内部的变量称为局部变量,作用域在函数的内部。
  • 定义函数外部的变量称为全局变量,作用域是其它函数都可以使用。
  • 如果全局变量和局部变量的名字相同,在函数内使用时局部变量的优先级大于全局变量,采用就近原则。

变量名

  • 因为内存分配发生在运行期,所以在编码阶段我们用一个易于阅读的名字来表示这段内存,称为变量名。 而变量名只是为了让我们开发者更好的查找和使用,实际上编译后的机器码从不使用变量名,而是通过内存地址来访问目标数据。

  • 声明变量后就可以用=为它分配该类型的任何值

  • 变量名首字母大小写决定了其作用域,首字母大写相当于公开,可以被包外引用,而小写相当于私有,仅能在包内使用。(fmt.Println中的P是大写的,这样它就可以在任意包下被调用)

命名规则:

  • 优先选用有实际含义,易于阅读和理解的字母、单词或组合对变量、常量、函数、 自定义类型进行命名
  • 以字母或下划线开头,由字母、数字和下划线组成,且区分大小写(name、Name、NAME是三个变量)
  • 局部变量优先使用短命名(如下方代码所示)
	var c int                 // c代替countfor i := 0; i < 10; i++ { // i代替indexc++}

变量的定义

仅定义变量未初始化时,变量根据数据类型赋上默认值

整型、浮点型默认值 = 0
字符串默认值 = ""
布尔型默认值 = false
函数、指针变量、切片默认值 = nil

格式:

var 变量名 数据类型 // 仅定义,未赋值
var 变量名 数据类型 = 变量值 // 定义并赋值

演示:

func main() {var x int  		   // 定义x	没初始化	默认值0var y = 1  		   // 定义y	有初始化	数据类型int  将1赋值给yvar z bool       // 定义z	没初始化	默认值为falsevar a int				 // 先定义aa = 1						 // 然后把1再赋值给afmt.Println(x, y, z, a)
}

可以一次性定义多个变量

var 变量1,变量2 = 变量1,变量2

演示:

func main() {var x, y int               // 多个变量相同数据类型var n, m = 100, "itzhuzhu" // 多个变量不同数据类型fmt.Println(x, y, n, m)
}

多个变量以组的方式定义,不再需要每行都写var

func main() {var (x, y int               // 多个变量相同数据类型n, m = 100, "itzhuzhu" // 多个变量不同数据类型)fmt.Println(x, y, n, m)
}

自动推导类型

在给变量赋值时,可以简化书写,使用:代替var由编译器根据赋值数据推断数据类型。

func main() {w := 1x, y, z := 2.3, 4, "itzhuzhu"fmt.Println(w, x, y, z)var intVal int intVal =1 
}

拆分:=,:=做了两步的工作,所以声明的时候使用:=,再次赋值的时候使用=

	name := "娜可露露"// 相当于var name stringname  = "娜可露露"

自动推导类型的弊端:

  • 定义变量同时要显式初始化,不能自定义数据类型
  • 自动推导类型创建的变量是局部变量,只能在同一个作用域下被调用
var x = 1            // 定义全局变量func main() {fmt.Println(&x, x) // 全局变量var x = "局部变量" // 局部变量fmt.Println(&x, x)
}

输出:

0x10425c288 1
0x14000010070 局部变量

自动推导类型前提是至少有一个新声明的变量出现在左侧且在同一个作用域,即使其他变量名是重复的,编译器也不会报错

func main() {x := 1fmt.Println(&x)x, y := 2, "abc" // x在这里是重新赋值   y是定义新变量fmt.Println(&x, x, y)
}

打印结果:

0x14000096f60
0x14000096f60 2 abc

没有新的变量

func main() {x := 1fmt.Println(&x)x := 2 // 报错:':=' 的左侧没有新变量fmt.Println(&x, x)
}

有新的变量但不在同一个作用域将作为新变量定义

func main() {x := 1fmt.Println(&x){x, y := 1, 2 // 这里的x和上面的x已经是不同作用域了,x,y全部视为定义新变量fmt.Println(&x, x, y)}
}

输出:

0x14000064f60
0x14000064f58 1 2

多变量赋值

在进行多变量赋值操作时,首先计算出所有右值,然后依次完成赋值操作,但必须保证左右值的数据类型相同

func main() {x, y := 1, 2    // x:1  y:2x, y = y+3, x+2 // 先计算出右值y+3、x+2,然后再把结果赋值给左边的x、y变量fmt.Println(y)
}

变量值交换:

func main() {var a = 1var b = 2var c int    // 定义第3个变量c = a				 // 把a的值给ca = b				 // 把b的值给ab = c				 // 把c的值给bfmt.Println(a, b)
}// 也可以使用自动推导类型赋值的方式交换变量值
func main() {var a = 1var b = 2a, b = b, afmt.Println(a, b)
}

忽略占位符/匿名变量

通常定义变量后未使用编译器就会报错,使用_可用来临时规避编译器对未使用变量和导入包的错误检查,匿名变量既不占用命名空间,也不会分配内存。

import ("fmt"_"os"	// 对于还没用到且不想删除的可以加上占位符,避免编译报错
)
	_, err = conn.Write([]byte(fileName))	// _:表示忽略占位符if err != nil {fmt.Println("conn.Write err:", err)return
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/572129.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

硬币找零问题,动态规划基础,百度面试题

问题描述&#xff1a;给出几种面值的硬币&#xff0c;要求用这几种硬币找零出所给零钱数&#xff0c;用的硬币数要最少。 过去我们用过贪心法解决此类问题&#xff0c;包括本人在百度面试时&#xff0c;也是用的贪心法&#xff08;面试官对这个解答不满意&#xff09;&#xff…

Go_数据类型

数据类型&#xff1a; 计算机存储设备最小信息单位是位&#xff08;bit&#xff09;&#xff0c;最小的存储单元是字节&#xff08;byte&#xff09;&#xff0c;占用字节的不同&#xff0c;所表示能存储的数据长度不同。数据类型用来说明数据的数据的结构&#xff0c;便于后面…

HashMap之扰动函数和低位掩码

我们都知道&#xff0c;hashMap在实现的时候&#xff0c;为了寻找在数组上的位置&#xff0c;主要做了两件事 int hash hash(key); int i indexFor(key, table.length); 这个时候得到i才是数组上的位置。 这两个方法详解如下 JDK8对扰动函数的修改&#xff0c;只进行了一次移…

Go_运算符及优先级

运算符&#xff1a; 很久以前&#xff0c;流传程序算法数据这样的说法。算法是什么&#xff1f;通俗点说就是解决问题的过程。小到加法指令&#xff0c;大到成千上万台服务器组成的分布式计算集群。抛去抽象概念和宏观架构&#xff0c;最终都由最基础的机器指令过程去处理不同层…

mvn 修改所有子项目pom版本

mvn versions:set -DgenerateBackupPomsfalse -DnewVersion1.3.0 转载于:https://www.cnblogs.com/sidesky/p/7344713.html

Go_流程、跳转控制语详解

流程控制语句分类&#xff1a; 流程控制语句可以控制代码的执行顺序和条件 顺序结构&#xff1a;普通的代码&#xff0c;由上而下依次执行分支结构(if, switch)循环结构(for) if语句&#xff1a; 条件表达式值必须是bool类型&#xff0c;不可省略括号&#xff0c;且左大括号…

HDU 4027 Can you answer these queries?(线段树/区间不等更新)

传送门 Can you answer these queries? Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others)Total Submission(s): 18290 Accepted Submission(s): 4308 Description A lot of battleships of evil are arranged in a line before the b…

Go_秒懂函数、参数、可变参数、匿名函数、回调函数、内置函数

函数是将具有独立功能的代码块组成一个整体&#xff0c;使其具有特殊功能的代码集。它将复杂的算法过程分解为若干个小任务&#xff0c;隐藏相关细节&#xff0c;使得程序结构更加清晰&#xff0c;易于维护。通过接收输入参数完成一段算法指令&#xff0c;输出或存储相关结果。…

NE2018届校招内推笔试——数据挖掘

【单选题|2分/题】 1、在只有两类的情况下&#xff0c;二维特征向量通过共享相同的协方差矩阵的正态分布生成&#xff0c;其中协方差矩阵为&#xff1a; 均值向量分别为&#xff1a;&#xff0c;则根据贝叶斯分类&#xff0c;样本分类为&#xff1a;&#xff08;&#xff09; A…

Go_数组遍历、最大值、求和、多维数组

数组&#xff1a; 数组就是用来存储数据的容器&#xff0c;存储多个数据时数据类型要一致。如果想要保存任意类型数据&#xff0c;需要声明为接口类型数组数组定义完成后&#xff0c;可以对数组进行赋值操作。数组是通过下标来进行操作的&#xff0c;下标的范围是从0开始到数组…

全局变量和环境变量的区别

全局变量:启动脚本了.在各线程,以及主程序中.可以互相传递值.每次启动脚本,初始值都一样.环境变量:启动脚本了.在各线程,以及主程序中.可以互相传递值.每次启动脚本,初始值是上次停止脚本时的值. 例子:Global 全局变量Dimenv 环境变量全局变量 全局变量 1环境变量 环境变量 …

不满足依赖关系

今晚上脑残&#xff0c;替换了实体&#xff0c;把报错的也都替换完成了&#xff0c;但是运行报错&#xff1a; 大概的意思就是说不满足XXXXXX依赖关系&#xff0c;但是找了半天都没有找到&#xff0c;最后是mapper的实体类全路径替换的时候&#xff0c;脑残在后面加上了.java。…

Go_切片(初始化、遍历、截取、修改、append、copy、切片作为函数参数、切片求和、切片求最大值)

切片&#xff1a; 切片的长度是不固定的&#xff0c;可以追加数据&#xff0c;可以理解是一个动态数组&#xff0c;切片的底层是一个结构体切片类型&#xff08;slice&#xff09;本身并不是动态数组或数组指针。它内部通过指针引用底层数组&#xff0c;设定相关属性将操作限定…

Golang——递归的使用

递归指的是函数定义中调用函数本身的现象&#xff08;自己调自己&#xff09;把一个复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算 递归注意事项&#xff1a; 递归一定要有出口。否则内存溢出(出口…

阿里巴巴Java开发手册——速读记录

本随笔基于阿里巴巴Java开发手册V1.2&#xff0c;陆陆续续记录一些现阶段能理解的&#xff0c;有启发的内容&#xff0c;并将持续更新 最佳实践——插件使用已经发布为随笔&#xff01;http://www.cnblogs.com/jiangbei/p/7668654.html 一、编程规范 1.命名规范 &#xff08;1&…

Go_map集合初始化、键值操作、map作为函数参数的使用

map&#xff1a; map是key-value的数据结构&#xff0c;类似于Java的集合&#xff0c;又称为字典&#xff0c;像新华字典就是key:value类型展示的map是无序的&#xff0c;其中key是不允许重复的&#xff0c;key不存在相当于添加&#xff0c;存在相当于修改map的key必须可以进行…

Angular 小试牛刀[1]:Getting Started

首先&#xff0c;Angular2 与 Angular1.x 版本没有多大关系&#xff0c;甚至可以说是两个完全不一样的框架&#xff0c;故 Angular 指的是 Angular2 及以上的版本。而 Angular 与 TypeScript 的完美结合&#xff0c;对于一个 .NET 开发者来说&#xff0c;实在是找不到不用它的理…

Go_指针的使用、数组指针和指针数组、指针与切片、指针与结构体、多级指针

指针&#xff1a; 指针是一个特殊的变量&#xff0c;因为它存储的数据是另一个变量的内存地址&#xff0c;指针本身也是有内存地址的指针的数据类型有int、float、bool、string、数组、结构体指针的作用就是可以通过变量/对象的内存地址去操作变量/对象 注意&#xff1a; 取址运…

linux驱动编写(Kconfig文件和Makefile文件)

在Linux编写驱动的过程中&#xff0c;有两个文件是我们必须要了解和知晓的。这其中&#xff0c;一个是Kconfig文件&#xff0c;另外一个是Makefile文件。如果大家比较熟悉的话&#xff0c;那么肯定对内核编译需要的.config文件不陌生&#xff0c;在.config文件中&#xff0c;我…

Go_结构体与数组、切片、map、方法、作为函数参数、type、Tag

结构体&#xff1a; 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合结构体可以很好的管理数据&#xff0c;使用结构体可以提高程序的易读性&#xff0c;类似于Java的类一样结构体内成员名必须唯一&#xff0c;可用_补位&#xff0c;支持使用自身类型的指针成员。…