Go语言学习Day2:注释与变量

news2024/12/25 10:33:11

名人说:莫道桑榆晚,为霞尚满天。——刘禹锡(刘梦得,诗豪)
创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊)

目录

      • 1、注释
        • ①为什么要写注释?
        • ②单行注释
        • ③多行注释
      • 2、变量
        • ①变量的定义
        • ②交换
        • ③变量的本质
        • ④匿名变量
        • ⑤变量的作用域
        • ⑥常量
        • ⑦iota
      • 3、总结

1、注释

①为什么要写注释?

官方点儿来说,在编程中,注释是用来解释代码的目的和功能,以及某些实现的逻辑和原因。注释能够帮助其他开发者更好地理解和维护代码,同时也是自己未来回顾代码时的重要提示。良好的注释习惯可以提高代码的可读性和可维护性。

在咱们日常生活与工作中,写注释的作用无非两点:

  • 自己看得懂

自己看得懂,是因为咱们开发一个项目,工程量大,代码量很多,如果不加注释,过了一段时间,就会感叹自己写了什么,看的两眼懵懵。如果加了注释,一看这个代码是做这个的,功能比如是增删改查等等,立马就清晰明了了。

  • 别人看得懂

别人看得懂,在于在公司企业里,虽然会要求有独立开发的能力,但是实际上大厂往往分工很细,团队一起完成,这样也就涉及到了团队之间的项目对接,这个时候,你把未注释的代码发过去,对面微微一笑,显然,可读性比较差。因此,注释也要让别人能看懂咱们写的代码。

②单行注释

Go语言中的单行注释使用 // 符号。例如:

// 这是单行注释
// 输出Hello,World!
fmt.Println("Hello, World!")
③多行注释

多行注释或块注释可以使用 /**/ 包裹一段文字。例如:

/*
这是一个多行注释。
可以跨越多行。
同样实现的是 输出Hello,World!
*/
fmt.Println("Hello, World!")

一个小案例,使用go语言输出Hello World!:

//Code_流苏(CSDN)
package main

import "fmt"

//单行注释
/*多行注释 与C、C++相同*/
func main() {
	fmt.Println("Hello World!")
}

image-20240326001025785

2、变量

①变量的定义

在Go语言中,变量可以通过 var 关键字来定义,格式为 var 变量名 变量类型。Go语言也支持类型推断,所以可以不显式声明变量类型。例如:

var a int = 10  // 显式类型声明
var b = 20      // 类型推断\

案例1 :var定义单个变量

package main

import "fmt"

func main() {
	// var用来声明变量name string是变量的类型
	var name string = "yueliusu"
	//给name重新赋值
	name = "123"
	//输出打印name,并换行
	fmt.Println(name)
}

image-20240326002946524

案例2 :var定义多个变量

package main

import "fmt"

func main() {
	//var关键字定义多个变量
	var (
		name string
		age  int
		addr string
	)
	name = "yueliusu"
	age = 21
	addr = "henan"

	fmt.Println(name, age, addr)
}

image-20240326112340314

案例3 :短变量声明:=方式来定义变量

在Go语言中,还可以使用短变量声明的方式来定义变量,例如在函数内部使用:=来进行变量的定义和初始化。但在全局作用域中,或者需要显式指定变量类型的场景下,就需要像上述示例那样使用var关键字进行定义。

package main

import "fmt"

func main() {
    //:= 短变量声明  自动推导 自动声明变量的类型
    name := "yueliusu" //通过所赋的值,自动识别出为string类型,说明name要声明为string类型
    age := 21          //通过所赋的值,自动识别出为int类型,说明age要声明为int类型

    fmt.Println(name, age)
    fmt.Printf("%T,%T", name, age)
}

image-20240326112721246

②交换

在C、C++、JAVA等语言中,我们在进行变量交换的时候,一般会考虑使用临时变量,来作为交换的中间者,例如下图,我们要实现A与B交换,那么可以先将A的值给C,然后B的值给A,最后再将C的值给B,这样变量交换就完成了。

image-20240326112830139

但是在Go语言中,可以利用平行赋值的特性来交换两个变量的值,无需使用临时变量。例如:

a, b := 1, 2
a, b = b, a  // 交换a和b的值

案例:交换a,b的值,

package main

func main() {
    //var定义变量a b,将其声明为int类型,并分别赋值100 200
    var a int = 100
    var b int = 200
    //交换前
    println("交换前 a =", a, "a =", b) //a = 100 a = 200
    //平行赋值
    b, a = a, b
    //交换后
    println("交换后 a =", a, "b =", b) //a = 200 b = 100
}

image-20240326114350271

③变量的本质

在Go语言中,变量的本质是一块用于存储数据的内存空间

变量赋值实际上是改变这块内存空间存储的值

案例:打印变量

package main

import "fmt"

func main() {
    var num int
    num = 100
    //打印变量的内存地址 %p
    fmt.Printf("num:%d,内存地址:%p \n", num, &num) //&为取地址

    num = 200
    fmt.Printf("num:%d,内存地址:%p", num, &num)
    
   // 打印内存地址的方式之一。 Print  f格式化输出
   // 第一个参数 输出字符串
   // % 占位符。
   // 占位符的数量,要和后面待输出的数量保持一致
   // %d 数字 int d
   // %p 内存地址,num需要取出变量的地址。
   // %s 字符串。
   // \n 换行
}

image-20240326114720960

可以看到咱们定义的变量,其实是在内存中开辟了一个空间,而这个空间里可以存放数据。如图0x开头的那就是所开辟空间的地址,而100、200则是这个空间中存放的数据。

④匿名变量

在Go语言中,匿名变量用一个下划线 _ 表示,它可以忽略函数返回值时的占位符,不占用命名空间,也不会分配内存。

_, b := 5, 7  // 忽略第一个返回值

案例:匿名变量的实现与打印输出

package main

import "fmt"

func test() (int, int) {
    return 100, 200
}

//Go 语言中,匿名变量(或称为空白标识符)是一个特殊的变量:_。
//它用于在不需要使用到某个变量值的场合。
//使用匿名变量的好处是可以避免编译器错误,比如当函数返回多个值而你只需要其中一部分时。

func main() {
    //_为匿名变量的显示方式
    //a, b := test()
    //fmt.Println(a, b)
    a, _ := test()
    fmt.Println(a)
    _, b := test()
    fmt.Println(b)
    fmt.Println(a, b)
}

/*匿名变量不占用命名空间,不会分配内存,因此不存在重复定义的问题。
它通常仅用于忽略函数的返回值或忽略循环中的部分变量。*/
//在函数的调用中,每一次出现的匿名变量都是独立的,它们之间不共享值。

image-20240326115338151

⑤变量的作用域

变量的作用域是指程序中变量可以被访问的范围。在Go语言中,变量可以有三种作用域或身份:

  • 局部变量

局部变量在函数内部定义,只在该函数内部有效;

  • 全局变量

全局变量在函数外部定义,整个包都可以访问;

  • 形式参数

形式参数在函数定义中,作为函数的输入。

案例:作用域

package main

import "fmt"

// 全局变量
var name string = "zhangsan"

func main() {
    // =表示赋值,将等号右边的值赋值给左边的值

    // 局部变量
    var age int = 18
    var name string = "lisi"
    //输出打印出来是局部变量name的值
    fmt.Println(name, age)
    //输出打印出来是全局变量name的值
    aaa()
}

func aaa() {
    fmt.Println(name)
}

image-20240326115654899

此外,咱们还需要知道一个原则,变量声明中时需要注意的,就近原则

案例:就近原则

package main

import "fmt"

// Go语言程序中全局变量与局部变量名称可以相同,但是函数体内的局部变量会被优先考虑。
// string  int   float64  浮点数(小数)
var a float64 = 3.14

func main() {
    var a float64 = 2.18
    fmt.Println(a) //2.18
}

image-20240326115824863

从输出结果上我们可以看出来,首先全局声明了a(全局变量),并进行了赋值,后面又在main函数中再次声明了a(局部变量),之后输出的值为后者的值2.18,也就是在一个变量同时进行全局和局部声明的话,在输出时,会就近输出。

⑥常量

在Go语言中,常量是使用 const 关键字定义的,一旦定义不能被修改。常量可以是字符、字符串、布尔或数值类型。

简单来说,常量就是不能变化的量。例如下面咱们定义一个圆周率π = 3.14,那么通过const定义后,它便不能修改了。

const Pi = 3.14

案例:常量的定义与打印输出

package main

import (
    "fmt"
)

func main() {
    //常量使用const来声明
    const URL string = "https://yueliusu.blog.csdn.net/" //显示定义
    const URL2 = "https://yueliusu.blog.csdn.net/"       //隐式定义

    const a, b, c = 3.14, "yueliusu", false //同时定义多个常量

    fmt.Println(URL)
    fmt.Println(URL2)
    fmt.Println(a, b, c)
}

image-20240326120240589

⑦iota

在Go语言中,iota 是一个特殊的常量,它用于在 const 关键字下创建一系列相关的常量。当在一个 const 块中使用 iota 时,它会自动从0开始计数,每定义一个常量,iota 的值就会自增1

package main

import "fmt"

// iota 常数计数器
// 在Go语言中,iota 是一个特殊的常量,它用于在 const 关键字下创建一系列相关的常量。
// 当在一个 const 块中使用 iota 时,它会自动从0开始计数,每定义一个常量,iota 的值就会自增1。
func main() {
    const (
       a = iota  //0
       b		 //1
       c		 //2
       d = "haha"//haha  (3)
       e		 //haha  (4)
       f = 100	 //100	 (5)	
       g		 //100	 (6)
       h = iota  //7
       i		 //8
    )
    const (
       j = iota //0
       k        //1
       l		//2
    )
    fmt.Println(a, b, c, d, e, f, g, h, i, j, k, l)
}

image-20240326143013279

3、总结

1.注释,给自己看也给别人看,良好习惯

2.变量的定义 var 变量名 变量类型

3.变量的赋值 变量 = 变量值

4.变量定义,短变量声明 := ,只能用在变量中,可以自动推导基本数据类型、只能用在局部变量中

5.变量的本质- 内存空间,变量的赋值-往空间里放东西

6.匿名变量 _

7.变量的作用域 :全局变量、局部变量 (同名-就近原则)

8.常量的定义和场景 (const)无法修改的值才会设置为常量,方便使用,通常使用大写

很感谢你能看到这里,如有相关疑问,还请下方评论留言。
Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊)
希望本篇内容能对大家有所帮助,如果大家喜欢的话,请动动手点个赞和关注吧,非常感谢你们的支持!

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

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

相关文章

Android卡顿掉帧问题分析之工具篇

“工欲善其事,必先利其器”,在开始着手分析卡顿问题之前,我们还必须要掌握一些分析性能问题的工具与手段,也就是掌握分析问题所使用的“器”,才能帮助我们更好的观测系统运行的状态,找到性能问题的原因。Sy…

AI助力智慧农田作物病虫害监测,基于YOLOv5全系列【n/s/m/l/x】参数模型开发构建花田作物种植场景下棉花作物常见病虫害检测识别系统

智慧农业是一个很大的应用市场,将当下如火如荼的AI模型技术与现实的农业生产场景相结合能够有效提升生产效率,农作物在整个种植周期中有很多工作需要进行,如:浇水、施肥、除草除虫等等,本文的主要目的是想要以棉花作物…

基于SpringBoot和Vue的车辆管理系统的设计与实现

今天要和大家聊的是一款基于SpringBoot和Vue的车辆管理系统的设计与实现 !!! 有需要的小伙伴可以通过文章末尾名片咨询我哦!!! 💕💕作者:李同学 💕&#x1f…

吴恩达深度学习笔记:浅层神经网络(Shallow neural networks)3.6-3.8

目录 第一门课:神经网络和深度学习 (Neural Networks and Deep Learning)第三周:浅层神经网络(Shallow neural networks)3.6 激活函数(Activation functions)3.7 为什么需要非线性激活函数?(why need a non…

Databend 开源周报第 137 期

Databend 是一款现代云数仓。专为弹性和高效设计,为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务:https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展,遇到更贴近你心意的 Databend 。 支持查询匹配倒…

区块链安全之DDoS防护的重要性及其实施策略

随着区块链技术的不断发展和广泛应用,其安全问题也日益凸显。其中,分布式拒绝服务(DDoS)攻击是对区块链网络稳定性和效率构成潜在威胁的重要因素之一。本文旨在深入探讨区块链为何需要采取DDoS高防措施,并提出相应的防护策略。 一、区块链面…

Spark RDD、DataFrame和DataSet的区别

Spark RDD、DataFrame和DataSet的区别 在比较这三者的区别之前,先看看他们各自的定义是什么。 Spark RDD RDD是一种弹性分布式数据集,是一种只读分区数据。它是spark的基础数据结构,具有内存计算能力、数据容错性以及数据不可修改特性。 S…

教程3_图像的轮廓

目录 目标 1. 特征矩 2、轮廓质心 3. 轮廓面积 4. 轮廓周长 5. 轮廓近似 6. 轮廓凸包 7. 边界矩形 7.1.直角矩形 7.2. 旋转矩形 8. 最小闭合圈 9. 拟合一个椭圆 10. 拟合直线 目标 在本文中,我们将学习 - 如何找到轮廓的不同特征,例如面积&…

API网关-Apisix路由配置教程(数据编辑器方式)

文章目录 前言一、端口修改1. apisix 端口修改2. dashboard 端口修改3. 登录密码修改 二、常用插件介绍1. 常用转换插件1.1 proxy-rewrite插件1.1.1 属性字段1.1.2 配置示例 2. 常用认证插件2.1 key-auth插件2.1.1 消费者端字段2.1.2 路由端字段2.1.3 配置示例 2.2 basic-auth插…

工作多年,如何从 CRUD Boy 转型为分布式系统架构师?解锁分布式系统的艺术:从零开始理解分布式系统架构与设计原理!...

编程是一门艺术,它的魅力在于创造。 65 哥已经工作5年了,一直做着简单重复的编程工作,活活熬成了一个只会 CRUD 的打工 boy。 65 哥:总是听大佬讲分布式分布式,什么才是分布式系统呢? 分布式系统是一个硬件…

PyCharm Pro 2023 for Mac/Win:打造极致Python开发体验

在数字化浪潮席卷全球的今天,Python已成为众多开发者手中的利器。无论是数据分析、机器学习还是Web开发,Python都以其简洁易懂的语法和强大的功能库赢得了广泛好评。而在这个高效编程的时代,一款出色的Python开发工具,无疑能让开发…

基于word2vec+LSTM模型实现百度贴吧恶意评论预测

大家好,我是带我去滑雪! Word2Vec模型能够将词语映射到高维空间中的向量表示,同时保留了词语之间的语义信息和上下文关系。这使得模型能够更好地理解评论中的语境和含义。LSTM模型是一种适用于处理序列数据的深度学习模型,能够有效…

鸡兔同笼问题:利用Scratch C/C++ Python解决

文章目录: 一:问题 二:解决办法 1.通过Scratch解决 2.通过C/C解决 3.通过Python解决 一:问题 该问题大约在1500年前的《孙子算经》中就有记载:“今有雉兔同笼,上有三十五头,下有九十四足&…

【数字图像处理】改变图像灰度级别

改变图像灰度级别 首先,对原始图像 O O O进行灰度级量化: q int ⁡ ( O 2 i ) 2 i , q\operatorname{int}\left(\frac{O}{2^{i}}\right) \times 2^{i}, qint(2iO​)2i, 灰度级别256,128,64,32,16,8&…

百度蜘蛛池,权重蜘蛛池,泛站蜘蛛池,shell蜘蛛池-权重蜘蛛池

蜘蛛池的作用及其类型 蜘蛛池的主要作用是加速搜索引擎蜘蛛对网站链接的爬取,从而实现快速收录。使用权重蜘蛛池可以提高搜索引擎蜘蛛对网站链接的权重评价,实现秒收效果和发布外链的目的。常见的蜘蛛池有百度蜘蛛池、搜狗蜘蛛池和谷歌蜘蛛池等。 本文…

blog-engine-06-pelican 静态网站生成 windows11 安装实战笔记

拓展阅读 blog-engine-01-常见博客引擎 jekyll/hugo/Hexo/Pelican/Gatsby/VuePress/Nuxt.js/Middleman 对比 blog-engine-02-通过博客引擎 jekyll 构建 github pages 博客实战笔记 blog-engine-02-博客引擎jekyll-jekyll 博客引擎介绍 blog-engine-02-博客引擎jekyll-jekyl…

python安装与使用

1安装 1.0下载 从官网下载安装包欢迎来到 Python.orghttps://www.python.org/ 1.1安装 双击安装包 将 图中选项勾选 之后如图 在点击 等待安装,安装之后关闭(Close) 2实现第一个python程序 2.0打开python运行环境 安装之后在开始菜单…

使用小皮【phpstudy】运行Vue+MySql项目

现在的情况是我扒到了一个开源的项目,现在想要实现一下前端对应的功能,后端是完备的,但是需要调用数据库将数据跑起来,这里可以使用到MySql数据库,这里我还发现了一个比较好用的软件小皮【phpStudy】 官网 一 安装软件…

LabVIEW智能家居安防系统

LabVIEW智能家居安防系统 随着科技的飞速发展和人们生活水平的不断提升,智能家居系统以其便利性和高效性,逐渐成为现代生活的新趋势。智能家居安防系统作为智能家居系统的重要组成部分,不仅能够提高家庭的安全性,还能为用户提供更…

Kubernetes示例yaml:1. service-deployment.yaml

service-deployment.yaml 示例 apiVersion: apps/v1 kind: Deployment metadata:name: example-plusnamespace: aaaalabels:app: example-prdapp_unit: AAAA-EXAMPLE spec:replicas: 2selector:matchLabels:app: example-prdtemplate:metadata:labels:app: example-prdapp_uni…