首页 > 其他分享 >go变量和常量

go变量和常量

时间:2024-11-13 21:08:12浏览次数:1  
标签:常量 fmt 定义 var num go main 变量

go基础语法

【1】、注释

我们为什么要写注释?

一个项目,是很多组成的。写的时候,你能看懂的。 半年、一年 (时间久了,自己写代码看不懂了)

对接、项目很多时候都是多人协作完成。(很难沟通,直接读懂代码是比较困难)

在刚开始学习的时候,不喜欢写注释。

什么是注释: 来描述我当前这个代码是做什么的,或者一些批注

写注释是一个十分良好的习惯,我们都应该按照要求给自己代码写好注释,为了自己,也为了他人。很多大公司里也是对注释有严格要求的。

//   单行注释

/*
多行注释
*/

// 代表是main包,下面如果存在 main 函数,那么就是程序的入口
package main

// 导入了一个 fmt 包,可以通过它来调用打印函数、输出一行话....
import "fmt"

// main函数  func 函数  main 函数的名字 () 没有参数
func main() {
   // 打印了一句helloworld
   fmt.Println("Hello,World!")

}

【2】、变量

1、变量的定义

程序 : 我们向电脑说了一段话,需要电脑才能理解 (沟通机制 ,xxx语言 -- 汇编 -- 机器码)

电脑实际上识别的是机器码 : 0 1 1 1 0 1 (高低电频)

机器码 : 穿孔纸带

汇编:早些时候,现在的很多机器硬件底层代码,都是汇编

人能读懂的代码:英文、中文

将我们的语言和机器进行对接 (C、Java、Go ---> 编译器 --> 计算机中去执行:无需理解的,我们只需要写我们能看懂的代码即可 )

我们理解的世界、和计算机的世界要一一对应:

定义:一切都是需要去定义的。

计算机也需要去定义一些东西。

名字(变量)

name = 张三

name = 李四

计算机也需要这样来认识我们写的代码,也需要一个格式

通过 var 关键字来定义变量

变量名字 需要告诉计算机这个信息(变量)是什么类型的,数据类型:数字、字符串、小数.... = "变量的值"

**公式:定义变量 var 变量名 变量类型 **

package main

import "fmt"

func main() {
	var name string = "zhangsan"
	var age int = 18
	var a string
	// string类型变量不赋值,默认是空字符串
	var b int
	// int类型变量不赋值,默认是0
	
    // 可以同时定义多个变量 var()
    var (
    addr string
    phone string
    )
	fmt.Printf("%s,%d\n", name, age)
    
    
    name = "wangwu"
    
    // 使用变量,直接打印即可
	fmt.Printf("%s\n", a)
	fmt.Printf("%d\n", b)
}

短变量的申明方式(语法糖,方便开发人员开发)

package main

import "fmt"

func main() {

   // 只定义变量,不使用可以吗. 理论可以,实际在Go语言中不行。
   // 无意义代码,报错!

   // 问题1 :能不能不写数据类型
   // 问题2 :不用var 直接定义变量呢?

   // 自动推导,一个短变量声明
   name := "kuangshen"
   age := 18
   // 语法糖(偷懒,简化开发!)
   // := 相当于快递定义变量。如果给这个变量赋值了,那么会自动推导它的类型
   // var 、 数据类型的定义都被省略的。
   // 数据类型 go语言中基本的数据类型。

   fmt.Println(name)
   fmt.Println(age)

   // 定义了变量name2
   var name2 string
   // 在快速声明中,如果 := 左边的变量已经存在了,那么它将无法创建,无法重新定义
   name3 := "qinjiang222"
   fmt.Println(name2)
   fmt.Println(name3)
   name3 = "zhangsan666"
}

小结

1、定义变量使用定式 var 变量名称 变量数据类型

2、给变量赋值 。 定义的时候直接赋值、 通过变量名来赋值、

3、语法糖 := 。 可以通过它来快速定义变量,如果是基本数据类型,字符串、数字,它会自动推导类型

2、变量的交换

package main

import "fmt"

func main() {
   /* 在编程中遇到的第一个问题:变量交换
   var a int = 100
   var b int = 200

   var t int
   t = a
   a = b
   b = t
   */
   // 在Go语言中,程序变量交换,也有语法糖
   var a int = 100
   var b int = 200
   // fmt.Println 可以传递多个参数,用逗号隔开,直接打印
   fmt.Println("a=", a, ",b=", b)
   // 把a,b赋值给b,a  语法糖, 底层本质还是用到了临时变量。简化我们的开发
   b, a = a, b
   fmt.Println("交换后 a=", a, ",b=", b)
   
   // 复杂的问题都给我们简单化了,我们开发很轻松,编译器帮我们在底层处理。
}

3、从内存地址理解变量

package main

import "fmt"

func main() {
   // 变量到底是个什么玩意?
   // num 实际上是一片内存空间
   // 我们想要看一个变量的内存地址,只需要在变量名前加上 & 即可。
   // 取地址符 (指针)
   var num int
   num = 1000
   // 思考:这个num在计算机中是什么样子的。 num
   fmt.Printf("num的值:%d,内存地址:%p\n", num, &num)
   num = 2000
   fmt.Printf("num的值:%d,内存地址:%p\n", num, &num)

   // 汇编。理解一切

   var name string
   name = "张三"
   // 思考:这个num在计算机中是什么样子的。 num
   fmt.Printf("num的值:%s,内存地址:%p\n", name, &name)
   name = "李四"
   fmt.Printf("num的值:%s,内存地址:%p\n", name, &name)
    
   // 打印内存地址的方式之一。 Print  f格式化输出
   // 内存
   // 第一个参数 输出字符串
   // % 占位符。
   // 占位符的数量,要和后面待输出的数量一直
   // %d 数字 int d
   // %p 内存地址,num需要取出变量的地址。
   // %s 字符串。
   // \n 换行
   //fmt.Printf("num的值:%d",num)
}

4、匿名变量

package main

import "fmt"
// 变量 ( 有名字、没有名字:匿名 )
// 十分特殊、匿名变量 (黑洞,一切东西丢进去,任何赋值给匿名变量的值都会被丢弃)
// _ 下划线,就是匿名变量在Go语言中

func main() {
	a, b := test()
	fmt.Println("a=", a, "b=", b)

	// 我只想要test返回的第一个结果,此时就需要使用匿名变量
	c, _ := test()
	fmt.Println("c=", c)
	_, d := test()
	fmt.Println("d=", d)
}

// test 函数名 (参数1、参数2....)
func test() (int, int) {
	return 1, 2
}

5、变量的作用域

package main

import "fmt"

// 全局变量:在当前的go文件中生效
// 定义在go文件中的非函数内,在package和import下面
// 全局变量在定义时必选使用var,不能使用语法糖
// 全局变量和局部变量是可以重名的,局部变量优先
var c int

func main() {
	var a int = 3
	var b int = 4
	c = a + b
	fmt.Printf("a=%d,b=%d,c=%d\n", a, b, c)
	fmt.Printf("%p\n", &c)  // 这里的c是全局变量
	b = 2
	c := a + b
    
	fmt.Printf("a=%d,b=%d,c=%d\n", a, b, c)
	fmt.Printf("%p\n", &c) 
}
0xc683c8
a=3,b=4,c=7
0xb383c8
a=3,b=2,c=5
0xc00001a0f0

【3】、常量

常量: 不能变化的量。 这个变量是一个特殊的变量,无法改变的。 关键字 const

两个区别:变量的定义使用 var 、常量的定义是使用const

是什么机制导致他无法改变的?

Go语言底层的约定,实际上它是可以改变的,需要跳过常量名,直接找到内存地址,进行修改值。

package main

import "fmt"

func main() {
	const URL string = "www.baidu.com"
	const url string = "www.baidu.com"
	// 对于常量来说,我们约定一般使用大写字母
	// 常量不能使用语法糖定义

	// 隐式定义,不加数据类型
	const URL2 = "www.jd.com"
	fmt.Println(URL, URL2)

	// 常量允许定义之后不去使用,这就能说明常量和变量的内存地址是不一样的
}

1、特殊的常量

iota

// 特殊的常量 iota 常量计数器
package main

import "fmt"

func main() {
	// iota 默认值是0,在一组const中,那么他会+1
	// 可以理解为iota是计算常量的个数
	const (
		a = iota
		b = iota
		c = iota
		// 0 1 2
		d = 0
		e = iota
		// 0 1 2 0 4
		// 在定义const的时候,如果下面的常量没有赋值,默认沿用上一个常量定义的赋值
		f
		g
		h = iota
		// 0 1 2 0 4 5 6 7
	)
	const (
		i = iota
		j = 0
		k = iota
		// 0 0 2
	)
	fmt.Println(i, j, k)
	fmt.Println(a, b, c, d, e, f, g, h)
}

标签:常量,fmt,定义,var,num,go,main,变量
From: https://www.cnblogs.com/xuruizhao/p/18544819

相关文章

  • go中if、for
    流程控制面向过程编程自上而下的执行()面向对象编程:让程序像人一样的思考来运行,而不是机械式的自上而下(架构)将世界抽象为一个个的对象,然后用程序来模拟这一个个的对象,然后进行一些人工化的操作实现现实世界的逻辑定义(属性)判断(对错,导向不同的结果)循环(很多事情本质上......
  • GO面试-切片
    一、结构介绍切片(Slice)在Go语言中,有一个很常用的数据结构,切片是一个拥有相同类型元素的可变长度的序列,它是基于数组类型做的一层封装。它非常灵活,支持自动扩容。并发不安全。切片是一种引用类型,它有三个属性:指针,长度和容量。底层源码定义:typeslicestruct{arrayunsa......
  • 【Jenkins】如何在Pipeline中使用环境变量?
    在JenkinsPipeline中使用环境变量是一种常见的做法,可以帮助你在不同的构建步骤之间传递信息,或者为你的构建提供可配置的选项。环境变量可以在Jenkins的系统级别定义,也可以在Pipeline脚本中直接定义。在Pipeline中使用环境变量1.系统级别的环境变量你可以在Jenkins的全......
  • 解析 Go 切片:为何按值传递时会发生改变?|得物技术
    一、前言在Go语言中,切片是一个非常常用的数据结构,很多开发者在编写代码时都会频繁使用它。尽管切片很方便,但有一个问题常常让人感到困惑:当我们把切片作为参数传递给函数时,为什么有时候切片的内容会发生变化?这让很多人一头雾水,甚至在调试时浪费了不少时间。这篇文章简单明了地......
  • luogo P1182 数据分段
    数列分段SectionII题目描述对于给定的一个长度为N的正整数数列A1~N,现要将其分成M(M<=N)段,并要求每段连续,且每段和的最大值最小。关于最大值最小:例如一数列42451要分成3段。将其如下分段:[42][45][1]第一段和为6,第2段和为9,第3段和为1,和最大值为9。......
  • 【python系列】python之变量赋值操作
    1.前言变量是什么?我们学任何什么东西,都要从定义入手,只有清晰且无歧义的定义,才能真正理解这个概念是什么意思。维基百科的定义:在数学、物理学中,变量(variable)又称变数,是表达式或公式中,没有固定的值而可以变动的数或量;该数或量可以是随意的,也可能是未指定或未定的。——Wik......
  • 嵌入式开发套件(golang版本)
    1.watchdog(软件看门狗:守护+升级)2.gate(主程序)3.web(api版本+升级包) OTA升级流程watchdog启动后检查守护进程gate是否正在运行,如果没有,api对比版本号,下载解压tar文件包,启动守护进程gate,循环判断 测试前 测试后 结束gate进程,watchdog重新拉起 ......
  • 根据后缀名把Excel文件转换成可以插入MongoDB数据库的数据
    importpandasaspdimportosdefconvert_file_to_json(file_path):#检查文件扩展名并读取文件_,file_extension=os.path.splitext(file_path)iffile_extension.lower()=='.csv':df=pd.read_csv(file_path)eliffile_extension.lower......
  • MIGO DUMP LCX_RAP_EVENT_RUNTIME CL_RAP_EVENT_MANAGER==========CP
    MIGO收货时发生DUMP运行事务代码:SBGRFCCONF创建入站目标输入目标BGPF 保存即可 TRANSLATEwithxEnglishArabicHebrewPolishBulgarianHindiPortugueseCatalanHmongDawRomanianChineseSimplifiedHungarianRussianChineseTraditi......
  • 2024-11-13:求出所有子序列的能量和。用go语言,给定一个整数数组nums和一个正整数k, 定义
    2024-11-13:求出所有子序列的能量和。用go语言,给定一个整数数组nums和一个正整数k,定义一个子序列的能量为子序列中任意两个元素之间的差值绝对值的最小值。找出nums中长度为k的所有子序列的能量和,对结果取模10^9+7后返回。输入:nums=[1,2,3,4],k=3。输出:4。解释:nums......