Go基础语法:变量和常量

2023-09-20 14:45:00

2.1 变量的声明

变量名、常量名、函数名统称为标识符。标识符由字母、数字和下划线组成,只能以字母或下划线开头。

Go 语言中推荐使用驼峰命名方式。

命名方式:stu_name 下划线方式;stuName 小驼峰方式;StuName 大驼峰方式

Go 语言中的变量必须先声明再使用;非全局变量(函数内的变量)声明之后必须使用,否则报错

同一个作用域内不能有重名的变量。

2.1.1 标准声明方式

var 变量名 变量类型

如:

var s1 string
var num int
var isok bool

2.1.2 批量声明

var (
	a string
	b int
	c bool
	d float32
)

2.1.4 类型推导方式声明

即在声明变量时直接赋值,且并不需要声明其类型,系统会根据变量值自动推断变量的类型,推荐使用这种方式:

var age = 28

2.1.5 短变量声明

在函数内部时,可以直接使用简短的声明方式——:=

package main

import "fmt"

func main() {
	// 简短声明方式,省略了 var ,仅能用于函数内部
	s3 := 13
	fmt.Printf("%d \n", s3)
}

2.1.6 匿名变量

在使用多重赋值时,如果想要忽略某个值,可以使用 匿名变量(anonymous variable) 。匿名变量用下划线 _ 表示。

匿名变量不占用命名空间,不会分配内存,所以匿名变量之间不存在重复声明。

package main

import "fmt"

func main() {
	x, _ := foo()
	_, y := foo()

	// x= 10
	fmt.Println("x=", x)
	// y= 张三
	fmt.Println("y=", y)
}

func foo() (int, string) {
	return 10, "张三"
}

2.2 变量的初始化

2.2.1 声明时初始化

可以在声明的同时初始化,格式为:var 变量名 类型 = 表达式,如:

var name string = "张三"
var age int = 18

2.2.2 先声明后初始化

也可以先声明再初始化,声明后系统会自动对变量对应的内存区域进行初始化操作。每个变量会被初始化为其类型的默认值。如:整型和浮点型变量的默认值为 0,字符串变量的默认值为空字符串,布尔类型的变量默认为 flase ,切片、函数、指针变量的默认值为 nil。如下:

package main

import "fmt"

var age int

func main() {
	//输出 0 
	fmt.Printf("%d \n", age)
	age = 18
	//输出 18
	fmt.Printf("%d \n", age)
}

fmt 包中有三种 print : Print——普通打印,Printf——可以使用占位符的格式化打印,Println——带有换行符的打印

2.2.3 批量初始化

var name, age = "张三", 18

2.3 常量

常量是恒定不变的值,多用于定义程序运行期间不会改变的一些值。常量关键字 const,在定义常量时必须赋值。如:

const pi = 3.1415
const e = 2.7182

多个常量也可以一起声明

const (
	pi = 3.1415
	e  = 2.7182
)

const 同时声明多个常量时,如果省略了值则表示和上面一行的值相同,如:

package main

import "fmt"

const (
	a = 100
	b
	c = 200
	d
)

func main() {
	// 100
	fmt.Println("a=", a)
	// 100
	fmt.Println("b=", b)
	//200
	fmt.Println("c=", c)
	//200
	fmt.Println("d=", d)
}

2.4 iota

2.4.1 iota 的基本定义和使用

iota 是 go 语言中的常量计数器,只能在常量的表达式中使用。

iotaconst 关键字出现时将被重置为 0,const 中每新增一行常量声明都将使 iota 计数一次。

使用 iota 能简化定义,在定义枚举时很有用。

package main

import "fmt"

const (
	a = iota
	b
	c
)

func main() {
	// 0
	fmt.Println("a=", a)
	// 1
	fmt.Println("b=", b)
	//2
	fmt.Println("c=", c)
}

2.4.2 常见示例

  • 使用 _ 跳过某些值:
package main

import "fmt"

const (
	a = iota
	b
	_
	c
)

func main() {
	// 0
	fmt.Println("a=", a)
	// 1
	fmt.Println("b=", b)
	// 3
	fmt.Println("c=", c)
}
  • iota 声明中间插队
package main

import "fmt"

const (
	a = iota
	b = 100
	c
	d = iota
	e
)

func main() {
	// 0
	fmt.Println("a=", a)
	// 100
	fmt.Println("b=", b)
	// 100
	fmt.Println("c=", c)
	// 3
	fmt.Println("d=", d)
	// 4
	fmt.Println("e=", e)
}
  • 多个常量声明在一行
package main

import "fmt"

const (
	a, b = iota + 1, iota + 2
	c, d = iota + 1, iota + 2
	e, f
)

func main() {
	// 1
	fmt.Println("a=", a)
	// 2
	fmt.Println("b=", b)
	// 2
	fmt.Println("c=", c)
	// 3
	fmt.Println("d=", d)
	// 3
	fmt.Println("e=", e)
	// 4
	fmt.Println("f=", f)
}
package main

import "fmt"

const (
	a, b = iota + 1, iota + 2
	c, d
	e, f
)

func main() {
	// 1
	fmt.Println("a=", a)
	// 2
	fmt.Println("b=", b)
	// 2
	fmt.Println("c=", c)
	// 3
	fmt.Println("d=", d)
	// 3
	fmt.Println("e=", e)
	// 4
	fmt.Println("f=", f)
}
  • 定义数量级
package main

import "fmt"

const (
	_  = iota
	KB = 1 << (10 * iota)
	MB = 1 << (10 * iota)
	GB = 1 << (10 * iota)
	TB = 1 << (10 * iota)
	PB = 1 << (10 * iota)
)

func main() {
	// KB = 1024
	fmt.Println("KB =", KB)
	// MB = 1048576
	fmt.Println("MB =", MB)
	// GB = 1073741824
	fmt.Println("GB =", GB)
	// TB = 1099511627776
	fmt.Println("TB =", TB)
	// PB = 1125899906842624
	fmt.Println("PB =", PB)
}
更多推荐

day40 设计模式、jdk8新特性

一、代理模式为其他对象提供一种代理控制此对象的访问若一个对象不适合直接引用另一个对象,代理对象在客户端和目标对象之间起到中介作用组成:抽象角色:通过接口抽象类真实角色实现了哪些方法代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法可以附加自己的操作真实角色:实现抽象角色,定义业务逻辑,供

【Redis 多机服务的简单认识】

目录主从同步哨兵模式集群服务随着业务的不断发展,单机Redis的性能已经不能满⾜我们的需求了,此时我们需要将单机Redis扩展为多机服务,Redis多机服务主要包含以下3个内容:Redis主从同步Redis哨兵模式Redis集群服务(Redis3.0新增功能)主从同步主从同步(主从复制)是Redis⾼可⽤服务的基⽯,也

OpenCV(三十八):二维码检测

1.二维码识别原理功能图形:位置探测图形:通常,二维码中有三个位置探测图形,呈现L型或大角度十字架形状,分布在二维码的三个角上,用于帮助扫描设备定位二维码的位置和方向。位置探测图形分隔符:帮助扫描设备区分位置探测图形和二维码的数据区域。计算模式:通常是一个小的正方形图案,用于校准扫描设备以捕捉和解码二维码的图像。对齐标

jQuery 框架学习笔记(基础)

WhatjQuery是一种快速、简洁跨游览器的JavaScript函数库,其宗旨是“Writeless,Domore”,它封装JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,优化HTML文档操作、事件处理、动画设计和Ajax交互。注意:jQuery不是将所有的JS封装,只是有选择性的封装

观察者模式 & 发布-订阅模式(设计模式与开发实践 P8)

文章目录观察者模式运用实现观察者模式定义:他用来定义对象之间一种一对多的依赖关系,当一个对象状态发生改变时,所有依赖他的对象都会得到通知运用如果我们使用过DOM上的事件函数,那就接触过观察者模式document.body.addEventListener("click",function(){console.log("

HTML 知识扫盲

写在前面HTML是一门超文本标记语言,不管你听没听说过HTML,但在网上冲浪的途中你无时不刻都在与它接触,他遍布在每个你看得到的互联网的角落。其实对于笔者而言,我已经断断续续地学习过这门语言,经过时间的磋磨,所剩知识也是寥寥无几,这次借此机会复盘并总结一下HTML,当然在这里我不会将HTML语言的细节全盘拖出,只是总结

Android Fragment动画实现

在Android中,你可以使用FragmentTransaction来实现Fragment的动画效果。这允许你在添加、替换或移除Fragment时应用动画,从而改善用户体验。下面是如何实现Fragment动画的基本步骤:1.创建两个Fragment:首先,创建两个Fragment,例如FragmentA和Fragmen

TS同时打包和监视所有ts文件或只指定ts文件

当我们项目中ts文件较多时,我们如何直接打包所有ts文件为js文件?而不是使用tsc文件名一个一个去打包文件一、配置tsconfig.json文件创建一个tsconfig.json文件,该文件中不需要配置任何信息二、控制台输入打包命令在控制台输入如下代码:tsc三、对所有ts文件进行监听但是我们并没有对文件进行监听,修

Linux各种命令-查询篇

目录查看文件内容查看存储空间查看python安装目录查Ubuntu版本查看所有文件(含隐藏文件)查IP查看内存使用情况查看GPU使用情况查看CPU使用情况​​​​​​​查看文件内容cat[选项][文件...]-n:显示行号。-b:显示非空行号。-s:合并空白行。-E:在每行结尾添加$符号。-T:将制表符显示为^I。-v

交换机端口镜像详解

交换机端口镜像是一种网络监控技术,它允许将一个或多个交换机端口的网络流量复制并重定向到另一个端口上,以便进行流量监测、分析和记录。通过端口镜像,管理员可以实时查看特定端口上的流量,以进行网络故障排查、安全审计和性能优化。以下是关于交换机端口镜像的详细介绍:工作原理:交换机端口镜像通过在交换机的配置中指定源端口和目标端口

pycharm 中package, directory, sources root, resources root的区别

【遇到的问题】导入yolov5中有utils文件,自己的代码中也有utils文件,使得yolov5中的这部分引用出错了。【解决方案】单独建立detection文件夹,把检测相关的都放在这里,yolov5是github上拉取的源码,发现yolov5中fromutilsimport...有下划线,且会认为是edgeserv

热文推荐