Go语言–>变量

在 Go 语言中,定义变量有几种常见的方式。下面是一些常见的语法和用法:

1. 使用 var 关键字定义变量

最常见的方式是使用 var 关键字,后面跟上变量名和类型。你也可以为变量赋初值。

基本格式:

var variableName type

示例:

在go语言中定义了一个变量,指定变量类型,如果没有初始化,则变量默认为零值。零值就是变量没有做初始化时系统默认设置的值。

类型零值
整型 (int, int32, int64 等)0
浮点型 (float32, float64)0.0
布尔型 (bool)false
字符串 (string)空字符串 ""
指针nil
var age int // 定义一个整数类型的变量 age
var name string // 定义一个字符串类型的变量 name

也可以在定义时给变量赋初值:

var age int = 30 // 定义变量并赋初值
var name string = "Alice" // 定义变量并赋初值

使用类型推断:

如果你给变量赋了初值,Go 可以自动推断出变量的类型(类型推断)。这种情况下,你可以省略类型。

var age = 30 // Go 自动推断 age 为 int 类型
var name = "Alice" // Go 自动推断 name 为 string 类型

2. 短变量声明 :=

Go 还提供了一个简洁的方式来声明和初始化变量,叫做短变量声明。它通常在函数内部使用,省略了 var 关键字,自动根据初始值推断变量的类型。

基本格式:

variableName := value

当我们定义一个变量后又使用该符号初始化变量,就会产生编译错误,因为该符号其实是一个声明语句
也就是说intVal := 1相等于:

var intVal int 
intVal =1 

示例:

age := 30 // 自动推断 age 为 int 类型
name := "Alice" // 自动推断 name 为 string 类型

注意:短变量声明只能在函数内部使用,不能在函数外部使用。

3. 声明常量 const

常量的值在编译时就已经确定,不会改变。常量通过 const 关键字声明。

基本格式:

const constantName type = value

示例:

const pi float64 = 3.14159 // 定义一个浮动常量 pi
const message = "Hello, World!" // 定义一个字符串常量 message,Go 会自动推断类型为 string

4. 多个变量声明

Go 允许你在一行中声明多个变量,可以使用 var 关键字或者短变量声明。

使用 var 声明多个变量:

var a, b, c int // 声明多个 int 类型的变量

使用短变量声明:

a, b, c := 1, 2, 3 // 声明多个变量并初始化

5. 全局变量和局部变量

  • 全局变量:在函数外部声明的变量是全局变量,在整个包内都能访问。

函数外定义的变量为全局变量,全局变量只需要在一个源文件中定义,就可以在所有源文件中使用,甚至可以使用import引入外部包来使用。全局变量声明必须以 var 关键字开头,如果想要在外部包中使用全局变量的首字母必须大写。

  • 局部变量:在函数内部声明的变量是局部变量,只能在该函数内使用。

示例:

package mainimport "fmt"var globalVar = 100 // 全局变量func main() {var localVar = 50 // 局部变量fmt.Println(globalVar)fmt.Println(localVar)
}

6 匿名变量

匿名变量使用 下划线 _ 来表示,它不能用作变量的名称,不能直接访问或修改其值。Go 语言在使用匿名变量时,会自动丢弃对应的值。

示例:
package mainimport "fmt"func main() {a, _ := 10, 20  // 忽略第二个返回值fmt.Println(a)   // 只打印 10
}

匿名变量在以下几种常见场景中很有用:

1) 忽略函数的返回值

当调用一个函数时,返回值中可能有些我们并不关心,只需要其中一部分的值。在这种情况下,使用匿名变量来忽略不需要的值。

示例:
package mainimport "fmt"func getCoordinates() (int, int, int) {return 1, 2, 3
}func main() {x, _, z := getCoordinates()  // 忽略第二个返回值fmt.Println(x, z) // 输出:1 3
}

在这个例子中,函数 getCoordinates 返回了三个值,但我们只关心第一个和第三个值,于是使用 _ 来忽略第二个返回值。

2) 在循环中忽略索引

在某些情况下,当我们不需要使用迭代器的索引值时,可以使用匿名变量来忽略它。

示例:
package mainimport "fmt"func main() {numbers := []int{10, 20, 30}for _, value := range numbers {  // 忽略索引fmt.Println(value)  // 输出 10 20 30}
}

这里,for _, value := range numbers 中的 _ 用来忽略数组的索引,只关注值。

3) 只关注某些字段

有时结构体或接口中包含多个字段,但你只需要其中的一些字段。通过使用匿名变量,你可以只选择需要的字段。

示例:
package mainimport "fmt"type Person struct {Name    stringAge     intAddress string
}func main() {p := Person{"Alice", 30, "New York"}name, _ := p.Name, p.Age  // 只关注 Name,忽略 Agefmt.Println(name)  // 输出:Alice
}

在这个例子中,结构体 Person 有多个字段,但我们只关心 Name,所以通过匿名变量忽略了 Age 字段。

4) 避免编译器警告

在某些情况下,你可能需要声明一个变量,但你并不打算使用它。为了避免编译器的警告,可以使用匿名变量。

示例:
package mainfunc main() {var _ int  // 这样声明的变量不会被使用
}

这样可以确保变量不会被使用,避免编译器发出警告。

匿名变量的限制

  • 无法访问:匿名变量一旦被赋值,就无法访问其值。例如,你不能像普通变量那样用 fmt.Println() 打印匿名变量的值。
  • 只能丢弃值:匿名变量的作用就是丢弃不需要的值,因此,它只能在接受函数返回值时被使用。
示例:
package mainfunc main() {// 无法访问匿名变量的值_, _ := 1, 2// fmt.Println(_)  // 编译错误:cannot use _ as value
}

匿名变量的优势与适用场景

  • 代码简洁:当你不关心某些返回值时,匿名变量使代码更加简洁,避免了为不使用的变量命名。
  • 避免浪费资源:如果一个函数返回多个值,但你只关心其中的某些值,使用匿名变量可以避免不必要的内存占用和浪费。
  • 保持语义清晰:匿名变量让你显式地表明某些返回值是有意忽略的,这在代码阅读时能提供清晰的语义。

总结

匿名变量(_)在 Go 语言中是一个非常实用的特性,主要用于忽略函数返回值、循环索引值或者结构体字段等。当我们不关心某些数据时,通过使用匿名变量来丢弃它们,能够提高代码的简洁性和可读性。

  • 局限性:匿名变量不能被访问,不能修改其值。

  • 常见用途

    • 忽略不需要的函数返回值
    • 忽略循环中的索引
    • 避免编译器警告
    • 仅关心部分字段

在实际开发中,合理使用匿名变量能够使代码更简洁并提升可读性。如果有不需要的值,使用匿名变量是一个非常优雅的解决方案。

7. 指针变量的定义

Go 语言可以通过 & 来获取变量的地址,从而得到指针。指针变量可以存储其他变量的地址。

基本格式:
var ptr *Type // 定义一个指针变量
示例:
var ptr *int // 定义一个指向 int 类型的指针变量

总结:

  • 使用 var 关键字可以声明变量,并指定类型或初始化值。
  • 使用 := 可以简洁地声明并初始化变量(仅限函数内部)。
  • 使用 const 定义常量,值不可修改。
  • Go 自动推断变量的类型,简化代码书写。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分布式链路追踪的实现原理

分布式链路追踪系统的实现涉及多个核心技术环节,下面我将从数据采集、上下文传播、存储分析等维度深入解析其工作原理。 一、核心架构组件 1. 系统组成模块 #mermaid-svg-pDlZY54w2Z0Bp1H1 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-si…

Python爬虫实战:研究micawber库相关技术构建网页采集系统

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上的数据量呈现出爆炸式增长。如何从海量的网页数据中提取有价值的信息,成为了一个重要的研究课题。网络爬虫作为一种自动获取网页内容的技术,为解决这一问题提供了有效的手段。通过网络爬虫,可以快速、高效地采集…

前端框架Vue3(三)——路由和pinia

路由的理解 路由就是一组key-value的对应关系,多个路由,需要经过路由器的管理。 路由-基本切换效果 导航区、展示区请来路由器制定路由的具体规则(什么路径,对应着什么组件)形成一个一个的路由 【两个注意点】 路由组件…

【go】实现BMI计算小程序与GUI/WEB端实现

好的,下面是用 Go 语言实现的一个简单的 BMI(Body Mass Index,身体质量指数)计算器,包含中文注释与完整代码,可以直接运行。 一、BMI 计算公式 BMI体重(kg)身高2(m2&…

Windows系统优化命令-记录

闲着无聊,近来电脑有些卡顿,记录一下相关命令。最好的命令还是格式化╮(╯▽╰)╭ 1. 磁盘清理相关命令 cleanmgr - 磁盘清理工具 cleanmgr启动磁盘清理工具,可清理临时文件、回收站等内容 diskpart - 磁盘分区工具 diskpart用于磁盘管理&…

BFCP协议学习

BFCP是为了SIP呼叫中实现presentation的二进制协议。开源库libbfcp 如何协商角色 SIP 消息的SDP中有BFCP 的部分,其中s-only 代表要当服务器角色,c-only 代表要当client角色。confid, userid 都是需要在后续消息中对齐的。 通过port信息可以为后续bfcp…

常用设计模式系列(十七)—命令模式

常用设计模式系列(十七)—命令模式 第一节、前言 各位老铁好! 今天我来跟大家分享对象行为型模式第二章节——《命令模式》,“命令”一词,通俗易懂,我们在生活中经常会发出各种各样的命令,就像你…

【AI绘画】Stable Diffusion 全面指南:安装、版本对比、功能解析与高级应用

引言:Stable Diffusion 概述 在人工智能图像生成领域,商业工具如Midjourney凭借其集成化服务与高质量输出占据市场,而Stable Diffusion(简称SD)则以开源特性构建了差异化优势。与商业工具依赖云端资源、受限于订阅费用…

kafka使用kraft

window 使用kafka-storage生成生成一个uuid .\kafka-storage.bat random-uuid格式化存储 在这里插入代码片.\kafka-storage.bat format -t 对应的uuid D:\configure\fisher\kafka\config\kraft\server.properties 启动命令 .\kafka-server-start.bat D:\configure\fisher\kafka…

HCIA-Datacom认证笔记:IP路由基础——核心概念与路由分类

网络技术学习中,IP路由是绕不开的核心知识点,对于备考HCIA-Datacom认证的朋友来说,掌握路由基础能为后续学习打下良好基础。今天带朋友们梳理一下IP路由的核心概念、路由表结构及路由分类一、路由核心概念什么是路由? 简单来说&am…

FFmpeg 安装与使用

文章目录1. 环境部署(Windows)1.1. 安装包下载1.2. 配置环境变量1.3. 验证安装2. FFmpeg 基础使用教程2.1. 常用命令格式2.2. 基础功能示例2.2.1. 视频转码(MP4 → MKV)2.2.2. 调整分辨率(1080p → 480p)2.…

Python 数据分析(四):Pandas 进阶

目录 1. 概述2. 缺失项3. 分组聚合4. 数据合并5. 数据可视化 5.1 折线图5.2 条形图5.3 直方图5.4 散点图5.5 饼图 1. 概述 我们在上一篇文章初识 Pandas中已经对 Pandas 作了一些基本介绍,本文我们进一步来学习 Pandas 的一些使用。 2. 缺失项 在现实中我们获…

结构化文本文档的内容抽取与版本重构策略

结构化文本文档的内容抽取与版本重构策略 摘要 本文深入探讨了结构化文本文档处理领域中的两大核心技术——内容抽取与版本重构。文章首先分析了结构化文档的特点及其在现代信息管理中的重要性,随后系统性地介绍了文档内容抽取的技术路线与方法论,包括…

【BUUCTF系列】[HCTF 2018]WarmUp1

本文仅用于技术研究,禁止用于非法用途。 Author:枷锁 点开题目显示一个图片,没有任何交互功能,我们直接查看网页源代码我们可以看到有一个歆慕的注释source.php,我们进行拼接,访问一下这个文件在url后加上/source.php进…

Flutter Chen Generator - IconFont Generator

Flutter Chen Generator 🚀 一个强大的Flutter代码生成工具包,包含多个实用的代码生成器。 ✨ 功能特性 📁 资源生成器 (Assets Generator) 🔄 自动扫描assets目录并生成Dart常量🧠 智能驼峰命名转换,保…

【MATLAB】(二)基础知识

一.MATLAB命令1.指令行“头首”的 “>>” 是 “指令输入提示符” ,它是自动输入的。“>>” 为运算提示符,表示MATLAB处于准备就绪状态。如在提示符后输入一条命令或一段程序后按Enter键,MATLAB将给出对应的结果,并将结…

Day36| 1049. 最后一块石头的重量 II、494.目标和、474.一和零

文章链接 1049. 最后一块石头的重量 II 解题关键:找到重量和尽量相等的两堆 确定dp数组以及下标的含义 dp[j]表示容量(这里说容量更形象,其实就是重量)为j的背包,最多可以背最大重量为dp[j]。 确定递推公式 01背包…

【A*/BFS】P5507 机关

# P5507 机关 题目描述 这扇门上有一个机关,上面一共有12个旋钮,每个旋钮有4个状态,将旋钮的状态用数字111到444表示 每个旋钮只能向一个方向旋转(状态:1->2->3->4->1),在旋转时&am…

终结集成乱局:模型上下文协议(MCP)如何重构AI工具生态?

AI 助手正处于能力发展的初级阶段。它们擅长处理独立任务——例如解析 PDF、编写 SQL 语句、等等——但当你要求它们在 Slack、Gmail 和 Jira 等平台间协同操作时,整个流程就变得异常复杂且脆弱,如同调试一套由众多 API 密钥串联的精密机械(鲁…

谈谈毕业工作一年后的变化

文章目录谈谈毕业工作一年后的变化工作篇生活篇谈谈毕业工作一年后的变化 工作篇 2025.7.30 21:49 呼~再次打开这个网站发布文章,是多么陌生。仿佛有说不完的话,但如今时间却不允许我无限制的长篇大论的写下去了。 先说下工作吧。 毕业后工作好快啊&…