Go 语言变量

news2024/11/17 17:40:59

变量来源于数学,是计算机语言中能储存计算结果或能表示值抽象概念。

变量可以通过变量名访问。

Go 语言变量名由字母、数字、下划线组成,其中首个字符不能为数字。

声明变量的一般形式是使用 var 关键字:

var identifier type

可以一次声明多个变量:

var identifier1, identifier2 type

实例

package main
import "fmt"
func main() {
    var a string = "Runoob"
    fmt.Println(a)

    var b, c int = 1, 2
    fmt.Println(b, c)
}

以上实例输出结果为:

Runoob
1 2

变量声明

第一种,指定变量类型,如果没有初始化,则变量默认为零值

var v_name v_type
v_name = value

零值就是变量没有做初始化时系统默认设置的值。

实例

package main
import "fmt"
func main() {

    // 声明一个变量并初始化
    var a = "RUNOOB"
    fmt.Println(a)

    // 没有初始化就为零值
    var b int
    fmt.Println(b)

    // bool 零值为 false
    var c bool
    fmt.Println(c)
}

以上实例执行结果为:

RUNOOB
0
false
  • 数值类型(包括complex64/128)为 0

  • 布尔类型为 false

  • 字符串为 ""(空字符串)

  • 以下几种类型为 nil

    var a *int
    var a []int
    var a map[string] int
    var a chan int
    var a func(string) int
    var a error // error 是接口

实例

package main

import "fmt"

func main() {
    var i int
    var f float64
    var b bool
    var s string
    fmt.Printf("%v %v %v %q\n", i, f, b, s)
}

输出结果是:

0 0 false ""

第二种,根据值自行判定变量类型。

var v_name = value

实例

package main
import "fmt"
func main() {
    var d = true
    fmt.Println(d)
}

输出结果是:

true

第三种,如果变量已经使用 var 声明过了,再使用 := 声明变量,就产生编译错误,格式:

v_name := value

例如:

var intVal int 
intVal :=1 // 这时候会产生编译错误,因为 intVal 已经声明,不需要重新声明

直接使用下面的语句即可:

intVal := 1 // 此时不会产生编译错误,因为有声明新的变量,因为 := 是一个声明语句

intVal := 1 相等于:

var intVal int 
intVal =1 

可以将 var f string = "Runoob" 简写为 f := "Runoob":

实例

package main
import "fmt"
func main() {
    f := "Runoob" // var f string = "Runoob"

    fmt.Println(f)
}

输出结果是:

Runoob

多变量声明

//类型相同多个变量, 非全局变量
var vname1, vname2, vname3 type
vname1, vname2, vname3 = v1, v2, v3

var vname1, vname2, vname3 = v1, v2, v3 // 和 python 很像,不需要显示声明类型,自动推断

vname1, vname2, vname3 := v1, v2, v3 // 出现在 := 左侧的变量不应该是已经被声明过的,否则会导致编译错误


// 这种因式分解关键字的写法一般用于声明全局变量
var (
    vname1 v_type1
    vname2 v_type2
)

实例

package main

var x, y int
var (  // 这种因式分解关键字的写法一般用于声明全局变量
    a int
    b bool
)

var c, d int = 1, 2
var e, f = 123, "hello"

//这种不带声明格式的只能在函数体中出现
//g, h := 123, "hello"

func main(){
    g, h := 123, "hello"
    println(x, y, a, b, c, d, e, f, g, h)
}

以上实例执行结果为:

0 0 0 false 1 2 123 hello 123 hello

值类型和引用类型

所有像 int、float、bool 和 string 这些基本类型都属于值类型,使用这些类型的变量直接指向存在内存中的值:

当使用等号 = 将一个变量的值赋值给另一个变量时,如:j = i,实际上是在内存中将 i 的值进行了拷贝:

你可以通过 &i 来获取变量 i 的内存地址,例如:0xf840000040(每次的地址都可能不一样)。

值类型变量的值存储在堆中。

内存地址会根据机器的不同而有所不同,甚至相同的程序在不同的机器上执行后也会有不同的内存地址。因为每台机器可能有不同的存储器布局,并且位置分配也可能不同。

更复杂的数据通常会需要使用多个字,这些数据一般使用引用类型保存。

一个引用类型的变量 r1 存储的是 r1 的值所在的内存地址(数字),或内存地址中第一个字所在的位置。

这个内存地址称之为指针,这个指针实际上也被存在另外的某一个值中。

同一个引用类型的指针指向的多个字可以是在连续的内存地址中(内存布局是连续的),这也是计算效率最高的一种存储形式;也可以将这些字分散存放在内存中,每个字都指示了下一个字所在的内存地址。

当使用赋值语句 r2 = r1 时,只有引用(地址)被复制。

如果 r1 的值被改变了,那么这个值的所有引用都会指向被修改后的内容,在这个例子中,r2 也会受到影响。


简短形式,使用 := 赋值操作符

我们知道可以在变量的初始化时省略变量的类型而由系统自动推断,声明语句写上 var 关键字其实是显得有些多余了,因此我们可以将它们简写为 a := 50 或 b := false。

a 和 b 的类型(int 和 bool)将由编译器自动推断。

这是使用变量的首选形式,但是它只能被用在函数体内,而不可以用于全局变量的声明与赋值。使用操作符 := 可以高效地创建一个新的变量,称之为初始化声明。

注意事项

如果在相同的代码块中,我们不可以再次对于相同名称的变量使用初始化声明,例如:a := 20 就是不被允许的,编译器会提示错误 no new variables on left side of :=,但是 a = 20 是可以的,因为这是给相同的变量赋予一个新的值。

如果你在定义变量 a 之前使用它,则会得到编译错误 undefined: a。

如果你声明了一个局部变量却没有在相同的代码块中使用它,同样会得到编译错误,例如下面这个例子当中的变量 a:

实例

package main

import "fmt"

func main() {
   var a string = "abc"
   fmt.Println("hello, world")
}

尝试编译这段代码将得到错误 a declared but not used

此外,单纯地给 a 赋值也是不够的,这个值必须被使用,所以使用

fmt.Println("hello, world", a)

会移除错误。

但是全局变量是允许声明但不使用的。 同一类型的多个变量可以声明在同一行,如:

var a, b, c int

多变量可以在同一行进行赋值,如:

var a, b int
var c string
a, b, c = 5, 7, "abc"

上面这行假设了变量 a,b 和 c 都已经被声明,否则的话应该这样使用:

a, b, c := 5, 7, "abc"

右边的这些值以相同的顺序赋值给左边的变量,所以 a 的值是 5, b 的值是 7,c 的值是 "abc"。

这被称为 并行 或 同时 赋值。

如果你想要交换两个变量的值,则可以简单地使用 a, b = b, a,两个变量的类型必须是相同。

空白标识符 _ 也被用于抛弃值,如值 5 在:_, b = 5, 7 中被抛弃。

_ 实际上是一个只写变量,你不能得到它的值。这样做是因为 Go 语言中你必须使用所有被声明的变量,但有时你并不需要使用从一个函数得到的所有返回值。

并行赋值也被用于当一个函数返回多个返回值时,比如这里的 val 和错误 err 是通过调用 Func1 函数同时得到:val, err = Func1(var1)。

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

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

相关文章

基于PHP+MySQL新生报到管理系统(含论文)

每年都有大量的新生需要报到,但是很多时候因为是第一次到本校进行报到,不知道具体的报到流程和学校的安排,如果挨个的去通知无形之间会给工作人员增加工作量,目前最好的办法就是开发一套新生报到系统,让新生可以自己去查看具体的工作流程和安排 本系统是基于PHP和mysql来进行开…

九、数据库的备份还原

九、数据库的备份还原 1、归档管理 使用DM Manager: 点击注册的实例连接->右键->管理服务器 点击系统管理->点击配置->点击转换 点击归档配置->归档 使用DISQL: #创建文件夹存放日志文件 mkdir /dm/dmarch#登录disql disql SYSDBA SY…

细胞衰老——酪氨酸激酶抑制剂

20 世纪 60 年代,Hayflick 和 Moorhea 首次引入细胞衰老的概念,以描述正常的人类二倍体细胞株在连续培养后出现的不可逆的生长停滞现象。后来的研究表明,细胞衰老可由端粒缩短或功能障碍、致癌基因激活、DNA 损伤和突变,以及许多不…

外汇天眼:如果你想成为前5%的交易者

如一个交易者在世界5%的交易俱乐部中,那就意味着其账户获得持续的收益,并且达到全球95%的交易者所达不到高度。而我们需要明确的是这些成功交易者是通过小而稳定的收益建立一个账户,并以可控的速度构建来完成的。 那么天眼君给大家抛出一个问…

当 xxl-job 遇上 docker → 它晕了,我也乱了!

admin 和 executor 都单独部署 部署很简单,我就不具体演示了(不是主角,没戏份!) 直接看效果 192.168.8.222 上部署 xxl-job-admin 192.168.8.223 上部署 xxl-job-executor 是不是很简单? 效果也和我们预想…

物联网智慧养老平台解析

在智慧养老解决方案中,物联网技术的应用是核心,无论是老人的定位还是生物波雷达的跌倒检测都是物联网技术的应用。 一、 系统介绍 RTLS的全称是real time location system,是一种基于信号的无线电定位手段,目前国内RTLS行业主要用…

【0109】Linux系统监测工具sysstat介绍

文章目录 1. sysstat介绍2. sysstat安装2.1 从源码编译sysstat2.1.1 为Android设备编译3. CPU状态查看4. IO状态查看5. 进程状态查看6. 线程状态查看7. 系统活动状态查看1. sysstat介绍 sysstat实际上是一个工具箱,这其中包含了好几个工具。它们的介绍如下: 2. sysstat安装…

用DIV+CSS技术设计的餐饮美食网页与实现制作(web前端网页制作课作业)HTML+CSS+JavaScript美食汇响应式美食菜谱网站模板

👨‍🎓静态网站的编写主要是用HTML DIVCSS JS等来完成页面的排版设计👩‍🎓,常用的网页设计软件有Dreamweaver、EditPlus、HBuilderX、VScode 、Webstorm、Animate等等,用的最多的还是DW,当然不同软件写出的…

2022中国5G+工业互联网大会值得关注的那些事

2022中国5G工业互联网大会 2022年11月20日,由工业和信息化部、湖北省人民政府主办的2022中国5G工业互联网大会在湖北武汉开幕。湖北省委书记王蒙徽出席开幕大会。湖北省委副书记、省长王忠林,工业和信息化部党组成员、副部长张云明讲话。湖南省人民政府党…

数商云S2B2C商城积分商城功能如何实现家用电器企业营销价值最大化?

随着数字化商业时代的到来,消费者行为发生了深刻变化,多元化的消费需求不断驱动着品牌营销思维的变革。对于家用电器行业来说,如何顺应消费者的消费行为变化,不断完善整合更新用户需求,应用更智能化的营销手段与消费者…

第四章. Pandas进阶—数据导出

第四章. Pandas进阶 4.7 数据导出 1.导出.xlsx文件 1).语法: DataFrame.to_excel(excel_writer, sheet_nameSheet1, na_rep, float_formatNone, columnsNone, headerTrue, indexTrue, index_labelNone, startrow0, startcol0, engineNone, merge_cellsTrue, encodi…

(续)SSM整合之springmvc笔记(文件上传和下载)(P159-163)

一 .文件下载 ResponseEntity用于控制器方法的返回值类型&#xff0c;该控制器方法的返回值就是响应到浏览器的响应报文 使用ResponseEntity实现下载文件的功能1. 搞一张图片 2. index.html <a th:href"{/test/down}">下载图片</a> 3 .创建控制器Fil…

日本知名汽车零部件公司巡礼株式会社115

株式会社115 业务内容&#xff1a; 拖车用辅助脚、拖车用零件类、特殊车辆用车轴Sub。Assy产品、面向汽车产业的生产设备、面向建设机械的零部件类、面向汽车产业的检查夹具 公司简介&#xff1a; 董事长&#xff1a;佐藤安弘 资本金&#xff1a;4500万日元 员工数&#x…

在线研讨会 | 多说话人语音融合 - NVIDIA NeMo 代码解析

多说话人语音融合 - NVIDIA NeMo 代码解析 多说话人语音融合任务是 TTS 语音合成当中的一个子任务&#xff0c;它是指将两个或者多个说话人的声音进行融合&#xff0c;合成出新的语音的过程&#xff0c;而不需要做任何进一步的微调。多说话人语音融合可以通过插值的方式代替预…

线程创建方式

Thread&#xff1a;线程 创建方式&#xff1a; 方法一&#xff1a;继承Thread类 1. 继承 Thread 来创建一个线程类 2. 创建 MyThread 类的实例 3. 调用 start 方法启动线程 方法2 实现 Runnable 接口 1. 实现 Runnable 接口 2. 创建 Thread 类实例, 调用 Thread 的构造方…

ELK企业级日志分析系统

一 ELK ELK平台是一套完整的日志集中处理解决方案&#xff0c;将 ElasticSearch、Logstash 和 Kiabana 三个开源工具配合使用&#xff0c; 完成更强大的用户对日志的查询、排序、统计需求。 1 ELK各组件概念 ElasticSearch&#xff1a; 是基于Lucene&#xff08;一个全文检索…

X11 Xlib截屏问题及深入分析一 —— 源码位置

在使用类Ubuntu操作系统进行截屏时&#xff0c;发现屏幕有时不能正确截取&#xff0c;于是这才有了这段时间的Spetacle、Flameshot、X11 Xlib的系列文章。最后不使用Qt、直接使用X11 Xlib进行截屏仍然存在同样问题。这就需要深入对于代码进行分析了。再次列出源码如下&#xff…

[附源码]SSM计算机毕业设计高校创新创业服务平台JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

CAD数据文件格式DXF部分实体(圆弧、椭圆、凸度)解析[原理讲解+公式推导+java实现]

文章目录CAD图像读取与显示说明官方实体说明实体圆弧dxf记录信息代码实现测试优化多段线的凸度dxf记录信息代码实现测试椭圆dxf记录信息代码实现测试引用图片引用文章引用CAD图像读取与显示说明 如果想要开发一个可以读取dxf图像的软件&#xff0c;为了方便图像在软件中的绘制&…

优秀开源项目解读(六

一、Piggy Metrics介绍 PiggyMetrics是一个模拟的个人记账理财的应用&#xff0c;原作者称其为一个端到端的微服务PoC(Proof of Concept)&#xff0c;也就是说他开发这个是为了验证微服务架构和Spring Cloud技术栈。PiggyMetrics目前在github上有超过12k星&#xff0c;是学习微…