【Golang】案例为基浅谈Go的变量与常量

news2024/11/25 9:49:49
婉拒了哈

📓推荐网站(不断完善中):个人博客

📌个人主页:个人主页

👉相关专栏:CSDN专栏、个人专栏

🏝立志赚钱,干活想躺,瞎分享的摸鱼工程师一枚

🍒前言

在上一篇文章中,博主对于Go语言中的一些基本语法与变量的初步定义做了初步介绍。

在这篇文章主要是对于变量的进一步应用,以及对于Go语言中常量的介绍。

那么我们就看以下内容!

文章目录

  • 🍒前言
    • @[toc]
  • 1.变量交换
  • 2.匿名变量
    • 2.1.如何理解这个匿名变量的使用场景?
  • 3.关于作用域
    • 3.1.局部变量
    • 3.2.全局变量
    • 3.3.形式参数
  • 4.关于常量
    • 4.1.常量的使用
    • 4.2.常量使用的细节
    • 4.3.iota常量生成器
  • 5.关于源码
  • 🍊写在结尾

img%2F01-1

1.变量交换

简单阐述一下什么是变量交换,顾名思义,就是将变量的值进行交换的一个动作

例如我们定义了两个变量a:=10b:=20,那么这时候我们想要将两个变量的值进行交换的话,在Go语言中为我们提供了比较方便的方式。

案例

package main

import "fmt"

func main() {
	
	// 定义变量a、b,并且分别赋值10、20
	a, b := 10, 20
	// 第一轮输出查看结果
	fmt.Println("原本a、b的结果为:", a, b)
	// 然后我们可以直接用 = 号来对a、b进行快速赋值,交换他们的位置
	a, b = b, a
  // 第二轮输出查看结果
	fmt.Println("新输出的a、b结果为:", a, b)

}

通过以上代码我们可以看到,在=的右侧寓意为赋值,因为在Go中支持多赋值和多声明的代码形式,所以我们只需要将要赋值的变量进行位置对换,那么新的值就被赋予了。


2.匿名变量

阐述完变量交换,那么我们就不得不提变量中的一个特殊存在,那就是匿名变量

将值赋予给匿名变量实际上也就等于将这个值给抛弃了。通常也称之为抛弃值

关键标识

利用 _ 下划线,来标识匿名变量,也是我们所说的空白标识符

案例

package main

import "fmt"

func main() {

	// 定义变量
	_, a := 10, 7
	// 使用匿名变量的时候10就是抛弃值
	fmt.Println("输出结果:", a)
}

2.1.如何理解这个匿名变量的使用场景?

可能很多人会有疑问这个匿名变量有什么意义,其实在实际的使用场景中,匿名变量的使用意义个人感觉更趋近于占位符。

假设我们用到了某个函数名字叫Dial()的函数,这个函数会返回两个值给我们,那么我们只需要其中的一个值即可,另一个值我们用不到,但是因为是返回值,代码规则里面我们要接收,所以这时候我们就可以用匿名变量来占住另一个值的位置,代码如下。

案例

package main

import (
	"fmt"
	"net"
)
func main() {

    //conn, err := net.Dial("tcp", "127.0.0.1:8080")
    //如果不想接收err的值,那么可以使用_表示,这就是匿名变量
    conn, _ := net.Dial("tcp", "127.0.0.1:8080")
		fmt.Println(conn)
}

这里的net.Dial()函数就有两个返回值,分别为conn,err,那么我们只需要conn这个返回值的时候,我们就可以利用到匿名变量来占位获取到另一个返回值,但是我们可以不需要用到这个返回值。


3.关于作用域

一个变量(常量、类型或函数)在程序中都有一定的作用范围,称之为作用域

首先Go语言的特殊性导致在编译的过程中如果出现你定义的变量、常量、函数等没有被使用的话,编译是无法通过的,所以了解作用范围是很有必要的。

了解作用域可以更好的定义你需要使用的内容,也可以解决一些编译过程中的错误。

根据定义的位置总结三种

  • 函数内定义的变量称为局部变量
  • 函数外定义的变量称为全局变量
  • 函数定义中的变量称为形式参数

所谓的函数可以暂时先理解成一块代码片段,比如我们案例中常用的main()就是函数

将内容定义在函数的{ }内,就可以称之为定义在函数体内。

3.1.局部变量

在函数体内声明的变量称之为局部变量,它们的作用域只在函数体内,函数的参数和返回值变量都属于局部变量。

(扩展)局部变量不是一直存在的,它只在定义它的函数被调用后存在,函数调用结束后这个局部变量就会被销毁。

案例

package main

import "fmt"

func main() {

	// 定义变量,以下这些定义在main()函数中的都可以称之为局部变量
	a := 10
	b := 20
	c := a + b
  // 输出局部变量
	fmt.Println("输出局部变量为:", a, b, c)

}

3.2.全局变量

在函数体外声明的变量称之为全局变量,全局变量只需要在一个源文件中定义,就可以在所有源文件中使用,当然,不包含这个全局变量的源文件需要使用“import”关键字引入全局变量所在的源文件之后才能使用这个全局变量。

全局变量声明必须以 var 关键字开头,如果想要在外部包中使用(也就是想要被别的包进行import引用),那么全局变量的首字母必须大写

案例

package main

import "fmt"

// 定义全局变量,必须有var关键字,并且在函数体外面
var a = 10
var b = "let's go"

func main() {
	// 在main()函数中调用a、b
	fmt.Println("输出全局变量为:", a, b)
	demo()
}

func demo() {
	// 因为是全局使用,在要在这个源码中我们的方法都能调用到
	// 因此我在sum()函数中也可以调用到b变量的值
	fmt.Println("调用sum()函数输出的全局变量为:", b)
}

可以看到如上案例,无论是在main()函数中还是在我们的demo()函数中,我们都可以得到a、b的值进行输出

使用细节:关于全局与局部同名怎么办?

大家可能会思考一个问题,如果我有一个全局变量叫a,同时我又在函数中也定义了一个局部变量a,这两个变量的名字相同但是值不同,那么我们程序应该采用谁?

其实大部分时候遇到这种情况,程序当中遵循的一般都是就近原则,也就是说很多时候我们的程序是谁离得近,就用谁。

也就说出现如上情况我们会优先先采用离得近的局部变量

案例

package main

import "fmt"

var a = "这是全局变量"

func main() {

	a := "这是局部变量"
	fmt.Println("在main中会采用的变量是:", a)
	demo()
}

func demo() {
	fmt.Println("如果没有局部变量影响: ", a)
}

得到的结果是:

在main中会采用的变量是: 这是局部变量
如果没有局部变量影响: 这是全局变量

注意:虽然这种情况会出现,但是还是不要出现这种让人容易产生歧义的代码,规则虽然没有不允许但是代码规范上显然这样是不对的

3.3.形式参数

在定义函数时函数名后面括号中的变量叫做形式参数(简称形参)。形式参数只在函数调用时才会生效,函数调用结束后就会被销毁,在函数未被调用时,函数的形参并不占用实际的存储单元,也没有实际值。

形式参数某种意义上也是一个被声明的局部变量,所以我们在定义局部变量的时候不要出现局部变量与形式参数重名的情况为好。

案例

package main

import "fmt"

// 定义了全局变量
var a = "这是全局变量"

func main() {
	// 这里是局部变量
	a := "这是main的局部变量a"
	b := "这是main的局部变量b"
	fmt.Println("输出变量的值为: ", a, b)
	// 在调用test()函数的时候传递局部变量a、b的值
	test(a, b)
}

// 在函数中定义形参a、b,那么当test()函数被调用的时候
// 形参就可以直接被当作局部变量来使用,值则是由调用者的传递内容来决定的
func test(a, b string) {
	// 输出结果
	fmt.Println("这是由main传过来的内容:", a, b)
}

得到的输出结果为:

输出变量的值为: 这是main的局部变量a 这是main的局部变量b
这是由main传过来的内容: 这是main的局部变量a 这是main的局部变量b

通过上述案例,让我们对 局部变量全局变量形式参数 有一个了解,并且分清楚他们之间的区别和使用


4.关于常量

在我们开始介绍代码中的常量的时候,我们要先阐述一下什么叫做常量

实际上所谓的常量就是一个不会改变的值,用来存储一些我们自己事先规定好、不会改变的值

4.1.常量的使用

Go语言中的常量使用关键字const定义,用于存储不会改变的数据,常量是在编译时被创建的,即使定义在函数内部也是如此,并且只能是布尔型数字型(整数型、浮点型和复数)和字符串型

由于编译时的限制,定义常量的表达式必须为能被编译器求值的常量表达式

语法

// 注意了 []表示 数据类型 可写,可不写
const 常量名 [数据类型] =

从之前的变量声明中我们可以知道,其实Go语言很多时候想要简化一些批量性的动作,因此在定义常量的时候也可以采用批量式的定义。

批量定义的语法

const (
	常量名1 =1
  常量名2 =2
  ...
)

所有常量的运算都可以在编译期完成,这样不仅可以减少运行时的工作,也方便其他代码的编译优化,当操作数是常量时,一些运行时的错误也可以在编译时被发现,例如整数除零、字符串索引越界、任何导致无效浮点数的操作等。

案例

// 单个定义常量
const pi= 3.14159

// 批量定义常量
const (
    e  = 2.7182818
    pi = 3.1415926
)

4.2.常量使用的细节

其实在使用常量的过程中,我们除了采用批量定义的方式来定义常量,我们还可以用另一种方式在批量定义常量的同时,简化常量初始化(赋值)的过程。

简单来说,假设我要定义a、b、c、d四个常量。a、b的值都定义为10,c、d的值都定义为20,那么我们在初始化的时候就可以进行一些简化操作。

案例解析

package main

import "fmt"

const (
	a = 10
	b
	c = 20
	d
)

func main() {

	fmt.Println("输出定义的常量:", a, b, c, d)
}

最终得到的输出结果为:

输出定义的常量: 10 10 20 20

4.3.iota常量生成器

常量声明可以使用 iota 常量生成器初始化,它用于生成一组以相似规则初始化的常量,但是不用每行都写一遍初始化表达式。

简单来说呢,就是有点类似于计数器的存在,在定义第一个常量的时候会被归置为0,然后依此累加1

需求

我们从需求出发可能更好理解这个iota

假设我们要定义常量为周一到周天,那么周一为0,依次类推周天为6。

案例解析

package main

import "fmt"

// 定义周一到周天
const (
	Monday = iota
	Tuesday
	Wednesday
	Thursday
	Friday
	Saturday
	Sunday //6
)

func main() {

	fmt.Println("输出日期的值为:", Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday)
}

输出的结果为:

输出日期的值为: 0 1 2 3 4 5 6

当然我们知道iota的初始值默认归0,但是只要你在第一步对iota进行运算操作,比如Monday = iota+1,那么你可以发现在改变初始值的情况下,后续的值也会陆续发生改变,可以动手试试哦!


5.关于源码

博主将接下来系列中学习到的源码做了统一保存,在 Github 上,分享给有需要的人(禁止未经说明直接复制转载)。

如有需要可以 点击这里🚪 进行查看,创作不易,如果您觉得不错可以给博主点个 star🌟 ,感激不尽!

希望能够通过 案例 + 注释 + 讲解 的方式在学习过程中的经验和理解分享给大家同时能对想要学习的人提供一些帮助。

🍊写在结尾

本章节内容主要是讲述了一些关于变量的进一步细节运用,以及关于常量的知识,这两部分的内容在未来我们实际开发代码当中还是比较经常用到的,所以还是要好好的去梳理和理解一下。

以上为个人分享,如有错误请指出

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

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

相关文章

Python图像识别实战(三):基于OpenCV实现批量单图像超分辨重建(附源码和实现效果)

前面我介绍了可视化的一些方法以及机器学习在预测方面的应用,分为分类问题(预测值是离散型)和回归问题(预测值是连续型)(具体见之前的文章)。 从本期开始,我将做一个关于图像识别的…

“命悬一线”复试上岸浙大MBA的经验分享~

作为去年踩线上岸浙大MBA的幸运者,希望自己的一些经历和经验能够帮助到今年的考生。因为去年在联考初试准备的时间不是很充分,加上在职工作相对比较忙,真正能用到学习上时间真的不多。笔试成绩只拿到191分,在去年的复试考生里算是…

Qt+C++基本绘图(画线,画圆,矩形, 撤销,重做)

程序示例精选 QtC基本绘图(画线,圆,矩形画线) 如需安装运行环境或远程调试,见文章底部微信名片,由专业技术人员远程协助! 前言 这篇博客针对《QtC基本绘图(画线,画圆,矩形, 撤销&am…

Redis常见面试题(四)

1、Redis有哪些淘汰策略? Redis目前有8种淘汰策略: 1)Volatile-lru: 设置了过期时间的Key使用了LRU算法淘汰; 2)Allkeys-lru: 所有key使用LRU算法; 3)Volatile-lfu: 设置了过期时间的key使用了LFU算法淘汰; 4)Allkeys-lfu: …

一文读懂页面布局

一. 前端布局 谈到浏览器页面,我们肯定是希望页面越美观越好,这样才能吸引用户点击。页面美观就自然需要用到各种布局,好的布局不仅能提高用户体验感留住用户,还能提高维护的效率。本文就列举一下常用的前端布局,并配上…

【MATLAB教程案例65】深度学习网络建模2,通过deepNetworkDesigner工具箱实现

欢迎订阅《FPGA学习入门100例教程》、《MATLAB学习入门100例教程》 目录 1.软件版本 2.分类识别数据库的应用

第八章练习题-2

第七题 答案 package com.hspedu.homework.homework07;public class HomeWork07 {public static void main(String[] args) {} } class Test{ //父类String name "Rose";Test(){System.out.println("Test");}Test(String name){this.name name;} } clas…

国考省考行测:标题选择题,仍然是考主旨,借助关联词、主体、结构、或对策分析法找正确的标题,通过偏颇,片面,无关,过重,空泛的方法排除错误选项

国考省考行测:标题选择题,仍然是考主旨,借助关联词、主体、结构、或对策分析法找正确的标题,通过偏颇,片面,无关,过重,空泛的方法排除错误选项 2022找工作是学历、能力和运气的超强…

[附源码]Python计算机毕业设计Django校园商铺

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

44_外部SRAM实验

目录 IS62WV51216简介 IS62WV51216框图 IS62WV51216读时序 IS62WV51216写时序 FSMC简介 FSMC寄存器介绍 硬件连接图 实验源码 IS62WV51216简介 IS62WV51216ISSi (Integrated Silicon Solution,Inc)公司生产的一颗16位宽512K (512*16,即1M字节)容量的CMOS静态内存(SRAM…

现在市场上IT人才大量涌现,现在开始学习编程,以后会有前途吗?

现在市场上IT人才大量涌现,如果我现在开始学习编程,以后会有前途吗?答案是肯定的,一定有前途而且前途远大!下面分析一下具体原因: 未来一定是信息化社会 当今我们正处在第三次信息化浪潮中,这次…

P4 PyTorch 合并与分割

前言: 目录 cat stack split chunk一 cat(合并) df torch.cat([df1,df2,df3],dim0) 要合并的维度可以不相等,其它维度大小必须一样 应用场景: 比如有两个统计数据[class,students,scores] A [4,32,8], 4个…

架构师必读 —— 逻辑模型(5)

宏观在先,微观在后 如果只看局部判断问题,就会阻碍逻辑思考。首先,为了不迷失整体,就要从宏观捕捉事物。宏观是指整体和概要,微观是指局部、细节、个别的部分。我们要首先从宏观上考虑,再逐步展开至微观。 …

“ 这片绿茵场从不缺乏天才,努力才是最终的入场券——梅西 ”

前言 想了又想还是忍不住想发布一篇文章来纪念一下2022年的卡塔尔世界杯,这伟大的诸神黄昏之战。4年一届的世界杯像是一把衡量时间的坐标,正所谓青春不过几届世界杯!2014巴西世界杯在上初一,2018俄罗斯世界杯在上高二,…

使用Easyswoole 搭建简单的Websoket服务

步骤1 修改配置文件MAIN_SERVER.SERVER_TYPE为EASYSWOOLE_WEB_SOCKET_SERVER 如dev.php <?php use EasySwoole\Log\LoggerInterface;return [SERVER_NAME>"EasySwoole",MAIN_SERVER>[LISTEN_ADDRESS>0.0.0.0,PORT>19501,"SERVER_TYPE&quo…

新鲜事儿!只有AI作品的电影节;酷~AI纹身设计师;ChatGPT的接生婆RLHF;Wayve自动驾驶模型MILE… | ShowMeAI资讯日报

&#x1f440;日报合辑 | &#x1f3a1;AI应用与工具大全 | &#x1f514;公众号资料下载 | &#x1f369;韩信子 &#x1f4e2; 『AI Film Festival』只接受AI作品的电影节&#xff0c;一万美元奖金花落谁家&#xff1f; https://aiff.runwayml.com/ Runway ML公司12月7日推…

前端开发--JavaScript基础知识点大全

前端开发--JavaScript基础知识点大全JavaScript 基础1、JavaScript介绍2、变量3、数据类型4、类型转换5、 运算符6、语句6.1 表达式和语句6.2 分支语句6.3 循环语句7、数组8、函数9、对象10、更多JavaScript 基础 1、JavaScript介绍 JavaScript是一种运行在客户端&#xff08…

一个桌面弹幕软件,用来记单词刚刚好

弹幕单词是一款桌面弹幕软件&#xff0c;它可以把词条以弹幕的形式呈现在桌面上&#xff0c;不管这个词条是英语单词还是中文成语&#xff0c;只要结合了相关资料&#xff0c;就非常方便的使用鼠标右键查看此弹幕的相关资料&#xff0c;下面我们来看看这个软件如何使用吧 快速入…

大学生家乡主题甘肃介绍网页代码 dreamweaver网页设计作业制作 WEB静态网页作业模板 dw个人网页作业成品

家乡旅游景点网页作业制作 网页代码运用了DIV盒子的使用方法&#xff0c;如盒子的嵌套、浮动、margin、border、background等属性的使用&#xff0c;外部大盒子设定居中&#xff0c;内部左中右布局&#xff0c;下方横向浮动排列&#xff0c;大学学习的前端知识点和布局方式都有…

前端vue面试题集锦1

Vue.extend 作用和原理 官方解释&#xff1a;Vue.extend 使用基础 Vue 构造器&#xff0c;创建一个“子类”。参数是一个包含组件选项的对象。 其实就是一个子类构造器 是 Vue 组件的核心 api 实现思路就是使用原型继承的方法返回了 Vue 的子类 并且利用 mergeOptions 把传入…