使用 Go 实现 HelloWorld 程序,并分析其结构
在学习任何新的编程语言时,编写一个 “Hello, World” 程序通常是最初的入门步骤。这不仅是一个传统,也是一种快速了解语言基本语法和运行机制的有效方法。对于 Go 语言,这个过程不仅可以帮助新手快速入门,还提供了一个窗口,通过它可以深入了解 Go 的一些核心概念,如包管理、函数声明、以及其他语言结构。
本文旨在通过实现一个简单的 “Hello, World” 程序,展示如何使用 Go 语言。我们不仅会逐行分析代码,还会探讨 Go 的编译和执行流程,以及如何使用标准库中的功能。通过这种方式,我们可以清楚地看到 Go 程序的基本构成,以及它为什么能够在软件开发中提供高效率和高性能。
文章目录
- 1、Hello World
- 1.1、创建示例程序文件夹
- 2.2、编写并运行第一个 Go 程序
- 2、"hello,world" 示例程序的结构
- 2.1、包声明与 main 包
- 2.2、导入语句
- 2.3、主函数
1、Hello World
程序员这个职业虽然历史不长,但它继承了一项悠久的编程传统:几乎每种编程语言的学习都从一个名为"hello, world"的示例程序开始。这一传统始于 20 世纪 70 年代,由布莱恩·科尼根(Brian W. Kernighan)和 C 语言之父丹尼斯·里奇(Dennis M. Ritchie)合著的著名书籍《C 程序设计语言》。
接下来,我们将遵循这一传统,使用 Go 语言编写一个打印"hello, world"的示例程序,开启我们的 Go 编程之旅。希望通过这个示例,你能对 Go 程序的结构有一个直观且清晰的理解。在正式开始之前,请注意,对于开发 Go 程序所使用的编辑器工具,我们没有任何具体的要求。
1.1、创建示例程序文件夹
在 Go 语言中编写一个打印"hello, world"的程序是一个简单且经典的入门练习,整个过程只需要两步:创建文件夹和编写及运行代码。首先,我们需要创建一个文件夹来存储我们的 Go 代码。
现在,我们可以打开终端并使用以下命令来创建一个名为 “helloworld” 的文件夹,这个文件夹将用来存储我们的 “hello, world” 示例程序。无论是在 Linux 系统、macOS 系统,还是在 Windows 系统的 PowerShell 终端,这个命令都是相同的:
$ mkdir helloworld
$ cd helloworld
这个命令会在当前目录下创建一个新的名为 “helloworld” 的文件夹。
2.2、编写并运行第一个 Go 程序
首先,我们需要创建一个名为 main.go 的源文件。
在这里,需要说明一下 Go 的命名规则。Go 源文件总是用全小写字母形式的短小单词命名,并以 .go 扩展名结尾。如果要在源文件名中使用多个单词,我们通常将多个单词直接连接起来作为源文件名,而不使用其他分隔符,比如下划线。也就是说,我们通常使用 helloworld.go 作为文件名而不是 hello_world.go。这是因为下划线在 Go 源文件命名中有特殊的作用。总的来说,我们尽量避免使用超过两个单词的组合作为文件名,以免造成混淆。
现在,我们打开刚刚创建的 main.go 文件,输入以下代码:
package mainimport "fmt"func main() {fmt.Println("hello, world")
}
写完后,我们保存文件并回到终端窗口。接下来,在 Linux 或 macOS 系统中,可以通过输入下面这个命令来编译和运行这个文件了:
go build main.go
./main
输出应该是:
hello, world
如果是在 Windows 系统中,我们需要把上面命令中的 ./main 替换为 .\main.exe。
go build main.go
.\main.exe
无论你使用哪种操作系统,到这里你都应该能看到终端输出的 “hello, world” 字符串了。
如果你没有看到这个输出结果,那可能是 Go 安装过程的问题,或者源文件编辑出现了问题,需要你再次仔细确认。
如果一切顺利,那么恭喜你!你已经完成了第一个 Go 程序,并正式成为了 Go 开发者!
2、“hello,world” 示例程序的结构
现在,让我们回过头来仔细看看"hello,world"示例程序中到底发生了什么。
2.1、包声明与 main 包
第一个值得注意的部分是这个:
package main
在 Go 语言中,package main 这行代码非常关键,它标识了文件所属的包。在 Go 中,包是代码组织和模块化的基本单元。通常,一个包由单个小写单词命名,以简洁明了的方式描述其功能或内容。
包的角色和重要性:
- 代码封装:包用于封装相关的功能,使代码更加模块化。通过封装,开发者可以将具有相似功能的代码组织在一起,使得维护和理解代码更加容易;
- 命名空间:每个包提供了一个命名空间,帮助避免名称冲突。例如,两个不同的包可以有函数或变量名相同,因为它们的包名不同,它们实际上是隔离的;
- 重用性:包可以被不同的程序重用。标准库中的包如
fmt或math,以及社区贡献的包,都是可被多个项目共同使用的资源,增强了代码的复用性。
main 包的特殊性:
main 包在 Go 程序中具有特别的地位,因为它定义了可执行程序的入口:
- 入口点:
main包必须包含一个无参数、无返回值的main函数,程序执行从这里开始; - 唯一性:在一个可执行程序中,
main包是必须的,并且一个项目中只能有一个这样的包。如果存在多个main包,程序将无法编译; - 执行性质:仅当程序需要生成一个可执行文件时,
main包才是必需的。库代码通常位于非main包中,因为它们不是独立运行的程序,而是作为模块被其他程序调用。
2.2、导入语句
在 Go 语言中,import 语句用于导入所需的包,以便在程序中使用包内定义的函数、类型等。以下是几种使用 import 语句的不同方式及其意义:
接下来我们看一下,示例程序中的导入语句:
import "fmt"
这条语句告诉 Go 编译器程序需要使用 fmt 包,该包提供了格式化输入/输出的功能。在 Go 中,推荐使用包的绝对路径进行导入,这通常以项目的根目录为起点。
2.3、主函数
在 Go 语言中,main 包内的 main 函数是非常关键的,因为它是每个可执行程序的起点。当你运行一个可执行的 Go 程序时,程序的执行始于 main 函数。这个函数具有独特的结构特点:
func main() {fmt.Println("hello, world")
}
函数结构详解:
- 函数声明:
func main()表示声明了一个名为main的函数,它没有参数并且不返回任何值。如果将来需要给函数添加参数,它们必须放在圆括号()中。 - 函数体:函数体由花括号
{}包围。在 Go 中,所有函数的实现都必须包含在花括号内。按照 Go 语言的惯例,左花括号{放置在函数声明的同一行,后面跟一个空格。 - 函数题内容:
fmt.Println("hello, world")这一行代码已经完成了整个示例程序的所有工作了:将字符串输出到终端的标准输出(stdout)上。
相关文章:
使用 Go 实现 HelloWorld 程序,并分析其结构
在学习任何新的编程语言时,编写一个 “Hello, World” 程序通常是最初的入门步骤。这不仅是一个传统,也是一种快速了解语言基本语法和运行机制的有效方法。对于 Go 语言,这个过程不仅可以帮助新手快速入门,还提供了一个窗口&#…...
机器学习:在Python中sklearn库的使用,纯干货!12个小时的整理!
无监督学习是在没有标签的数据上训练的。其主要目的可能包括聚类、降维、生成模型等。 以下是 6 个重要的无监督学习算法,这些算法都可以通过使用sklearn(Scikit-learn)库在Python中很好地处理: 目录 K-Means 聚类 层次聚类 …...
XSS 攻击
XSS 攻击简介 定义: XSS(跨站脚本攻击)是一种网络安全漏洞,攻击者通过在 Web 页面中注入恶意代码,利用用户的浏览器执行这些恶意脚本,从而实施攻击。 解决方案: 过滤用户输入: 对…...
.Net Core 中间件与过滤器
过滤器这个是.Net MVC旧有的功能,中间件这个概念是新出的, ASP.NET Core只是完成了HTTP请求调度、报文解析等必要的工作,像检查用户身份、设置缓存报文头等操作都是在中间件中完成,中间件就是ASP.NET Core的一个组件,…...
【ARMv7-A】——WFI(wait for interrupt)
文章目录 WFI基本原理使用场景多任务模型注意事项代码实例linux 内核中的 WFI 指令不使用 WFI 指令测试使用 WFI 指令测试WFI WFI 即 Wait for interrupt,常用于低功耗。 WFI (Wait for interrupt) 和 WFE (Wait for event) 是两个让 ARM 核进入 low-power standby 模式的指…...
92. 反转链表 II
题目描述 给你单链表的头指针 head 和两个整数 left 和 right ,其中 left < right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。 示例 示例 1: 输入:head [1,2,3,4,5], left 2, right 4 输出&#…...
Modbus工业网关
随着工业自动化程度的不断提高,设备之间的数据通信与交互变得至关重要。在这一背景下,Modbus协议凭借其简单、可靠、开放的特点,成为了工业自动化领域中最常用的通信协议之一。而HiWoo Box网关作为一款支持Modbus协议的工业网关设备ÿ…...
c++——模板初始识
1.函数模板 我们经常用到Swap函数交换两个值。由于需要交换的数据的类型不同,我们就需要写不同参数类型的同名函数,也就是函数重载: 然而这三个函数的逻辑是一样的,写这么多有些多此一举,通过函数模版可以写一个通用…...
帆软生成csv文件
帆软官网提供了导出csv文件的插件,需要下载指定版本的插件 请选择具体的详情点击官网介绍:文档介绍 插件地址:插件地址...
12.Redis之补充类型渐进式遍历
1.stream 官方文档的意思, 就是 stream 类型就可以用来模拟实现这种事件传播的机制~~stream 就是一个队列(阻塞队列)redis 作为一个消息队列的重要支撑属于是 List blpop/brpop 升级版本.用于做消息队列 2.geospatial 用来存储坐标 (经纬度)存储一些点之后,就可以让用户给定…...
品牌做电商控价的原因
品牌控价确实是一项至关重要的任务,它关乎着品牌形象、市场定位以及长期发展的稳定性。在电商平台上,价格的公开性和透明度使得消费者、经销商和其他渠道参与方都能够轻易地进行价格比较。因此,品牌方必须对电商渠道的价格进行严格的管控&…...
安全面试中的一个基础问题:你如何在数据库中存储密码?
3分钟讲解。 上周的面试故事 职位:初级安全工程师,刚毕业。 开始面试。 我:“这里你提到对数据安全有很好的理解。你能举例说明哪些方面的数据安全吗?” A:“当然。例如,当我们构建一个系统时,会…...
【python深度学习】——torch.min()
【python深度学习】——torch.min 1. torch.min()1.1 计算整个张量的最小值1.2 沿特定维度计算最小值1.3 比较两个张量 1. torch.min() torch.min()接受的参数如下: input: 输入的张量。dim: 沿指定维度寻找最小值。如果指定了该参数,返回一个元组,其中…...
华为校招机试 - 最久最少使用缓存(20240508)
题目描述 无线通信移动性需要在基站上配置邻区(本端基站的小区 LocalCell 与周边邻基站的小区 NeighborCelI 映射)关系, 为了能够加速无线算法的计算效率,设计一个邻区关系缓存表,用于快速的通过本小区 LocalCell 查询到邻小区 NeighborCell。 但是缓存表有一定的规格限…...
第三部分:领域驱动设计之分析模式和设计模式应用于模型
分析模式 分析模式是一种概念集合,用来表示业务建模中的常见结构。它可能只与一个领域有关,也可能跨越多个领域。“分析模式”这个名字本身就强调了其概念本质。分析模式并不是技术解决方案,他们只是些参考,用来指导人们设计特定领…...
PID传感器在光电显示行业VOC气体检测的应用
随着光电显示技术的飞速发展,液晶显示器等显示器件产品已经成为我们日常生活和工作中不可或缺的一部分。然而,在生产过程中,液晶显示器会释放大量的挥发性有机物(VOC)气体,对生产环境及工作人员的健康构成威…...
iOS推送证书过期处理
苹果推送证书的有效期都是一年,将要过期的时候,苹果官方会发邮件提醒。 一、过期 在电脑上找到并打开其它->钥匙串访问; 我的证书可以看到各个App的推送证书,如果过期了,显示红色X 二、重新创建 1、登陆apple开…...
蓝海卓越计费管理系统 agent_setstate.php SQL注入漏洞复现
0x01 产品简介 蓝海卓越计费管理系统是一套以实现网络运营为基础,增强全局安全为中心,提高管理效率为目的的网络安全运营管理系统,提供“高安全、可运营、易管理”的运营管理体验,基于标准的RADIUS协议开发,它不仅支持PPPOE和WEB认证计费,还支持802.1X接入控制技术,与其…...
【leetcode2765--最长交替子数组】
要求:给定一个数组,找出符合【x, x1,x,x-1】这样循环的最大交替数组长度。 思路:用两层while循环,第一个while用来找到符合这个循环的开头位置,第二个用来找到该循环的结束位置,并比较一下max进行记录。 …...
java文档管理系统的设计与实现源码(springboot+vue+mysql)
风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的文档管理系统的设计与实现。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 文档管理系统的…...
BlockingQueue实现原理与生产者消费者模式
前言 在现代软件开发中,BlockingQueue实现原理与生产者消费者模式是一个非常重要的技术点。本文将从原理到实践,带你深入理解这一技术,并通过完整的代码示例帮助你快速掌握核心知识点。 核心概念 基本原理 BlockingQueue实现原理与生产者消费…...
老旧小区门禁改造:业主权益与合规指引
一、费用来源与使用规范小区门禁改造并非全部由业主自费承担,可按合规渠道统筹资金,优先使用公共补贴与专项维修资金。资金使用优先级:政府老旧小区改造财政补贴>住宅专项维修资金>业主自筹财政补贴:老旧小…...
XHS-Downloader:小红书内容采集的技术架构与多模式部署方案
XHS-Downloader:小红书内容采集的技术架构与多模式部署方案 【免费下载链接】XHS-Downloader 小红书(XiaoHongShu、RedNote)链接提取/作品采集工具:提取账号发布、收藏、点赞、专辑作品链接;提取搜索结果作品、用户链接…...
Python代码性能优化实战:从循环到并发的全方位加速技巧
1. 项目概述:为什么你的Python代码总是“慢半拍”?干了这么多年开发,我见过太多同事和学员写的Python代码,功能上没问题,逻辑也清晰,但就是跑起来“慢半拍”。尤其是在处理数据清洗、批量文件操作或者实现一…...
网安从业者必学 100 个核心知识点,自查进阶必备
100条必背网络安全知识点,你都掌握了吗? 1988年,一款名为“莫里斯蠕虫”的程序悄然传播,它最初是康奈尔大学研究员的实验项目,目的是测量互联网规模。可谁也没想到,这个程序失控后感染了数千台电脑&#x…...
ARMv8 AArch32虚拟内存系统与异常处理机制详解
1. AArch32虚拟内存系统架构概述AArch32是ARMv8架构中的32位执行状态,其虚拟内存系统架构(VMSAv8-32)是现代嵌入式系统和虚拟化平台的核心组件。这套系统通过精巧的硬件设计实现了内存隔离、访问控制和地址转换等关键功能。VMSAv8-32最显著的特点是采用了两阶段地址…...
从Noise2Noise到Neighbor2Neighbor:图解自监督去噪的演进与核心‘采样’技巧
从Noise2Noise到Neighbor2Neighbor:自监督去噪技术的范式跃迁与工程实践 当你在昏暗环境下用手机拍摄一张照片时,那些恼人的彩色颗粒可能让你直接点击删除键。传统去噪方法需要大量"干净-噪声"图像对进行训练,而真实世界中获取完美…...
历年各批次“重点小巨人”企业全面分析报告
国家级重点专精特新“小巨人”企业是专注于细分市场、创新能力强、市场占有率高、掌握关键核心技术、质量效益优的“排头兵”企业。自政策实施以来,重点“小巨人”已逐步成为我国培育新质生产力、推进新型工业化、提升产业链供应链韧性与安全水平的核心抓手。从工业…...
python健身服务管理系统_健身房教练预约系统qeif6f6f
目录同行可拿货,招校园代理 ,本人源头供货商项目概述核心功能技术实现项目特点应用场景项目技术支持源码获取详细视频演示 :同行可合作点击我获取源码->获取博主联系方式->进我个人主页-->同行可拿货,招校园代理 ,本人源头供货商 项目概述 Python健身服务…...
机器学习之逻辑回归算法
一、逻辑回归简介 1. 定义 逻辑回归(Logistic Regression)是一种有监督学习算法,主要用于解决二分类问题的统计学习方法。尽管名字中带有“回归”,但它实际上是一种分类算法。 大白话解释 逻辑回归就是一种“做判断题”的算法&…...
