当前位置: 首页 > news >正文

第一个 Go 程序“hello,world“ 与 main 函数

第一个 Go 程序"hello,world" 与 main 函数

文章目录

  • 第一个 Go 程序"hello,world" 与 main 函数
    • 一.创建“hello,world”示例程序
    • 二. “hello,world” 程序结构拆解
    • 三、main 函数
    • 四、Go 语言中程序是怎么编译的?

一.创建“hello,world”示例程序

创建一个叫做 maingo 文件。

mkdir syntax/helloworld  // 创建存储helloworld示例的文件夹

啰嗦一下 Go 的命名规则。Go 源文件总是用全小写字母形式的短小单词命名,并且以.go 扩展名结尾。以下是Go文件命名规则的主要要点:

  1. 使用小写字母:Go文件名应该使用小写字母,不推荐使用大写字母或驼峰命名法。这是因为Go的命名约定中,使用大写字母开头的标识符是公有的,而使用小写字母开头的标识符是私有的。
  2. 下划线不推荐:虽然Go允许在文件名中使用下划线字符(_),但不推荐在文件名中使用下划线。通常,Go文件名应该是简单的单词,以描述文件内容或包功能为主。
  3. 使用有意义的文件名:文件名应该能够清晰地表达文件的用途和内容。这有助于提高代码的可读性和维护性。
  4. 避免特殊字符和空格:文件名中不应包含特殊字符、空格或其他不允许的字符。
  5. 避免关键字:文件名不应与Go的关键字(例如ifelsefor等)冲突。

如果要在源文件的名字中使用多个单词,我们通常直接是将多个单词连接起来作为源文件名,而不是使用其他分隔符,比如下划线。也就是说,我们通常使用 helloworld.go 作为文件名而不是 hello_world.go。

因为下划线这种分隔符,在 Go 源文件命名中有特殊作用,在Go语言中使用下划线作为源文件命名的分隔符,主要是为了进行包范围控制,避免命名冲突。

这里我们创建一个名为 main.go 的源文件

touch syntax/helloworld/main.go

打开刚刚创建的 main.go 文件,键入下面这些代码:

package mainimport "fmt"func main() {fmt.Println("hello, world")
}

写完后,我们保存文件并回到终端窗口,然后在 Linux 或 macOS 系统中,你就可以通过输入下面这个命令来编译和运行这个文件了:

go build main.go
./main

如果是在 Windows 系统中呢,你需要把上面命令中的./main 替换为.\main.exe

go build main.go
main.exe

输出结果如下:

在这里插入图片描述

二. “hello,world” 程序结构拆解

首先,第一个值得注意的部分是这个:

package main

这行代码定义了 Go 中的一个包 package包是 Go 语言的基本组成单元,通常使用单个的小写单词命名,一个 Go 程序本质上就是一组包的集合。所有 Go 代码都有自己隶属的包,在这里我们的“hello,world”示例的所有代码都在一个名为 main 的包中。main 包在 Go 中是一个特殊的包,整个 Go 程序中仅允许存在一个名为 main 的包。

**主程序函数:**main 包中的主要代码是 main 函数:

func main() {fmt.Println("hello, world")
}

main入口

  • 这里的 main 函数就是当你运行一个可执行的 Go 程序的时候,所有的代码都会从这个入口函数开始运行。
  • 这段代码的第一行声明了一个名为 main 的、没有任何参数和返回值的函数。如果你需要给函数声明参数的话,那么就必须把它们放置在圆括号 () 中。

导入包

import "fmt"

在 main 函数体中,通过 fmt 这个限定标识符(Qualified Identifier)调用 Println 函数。虽然两处都使用了“fmt”这个字面值,但在这两处“fmt”字面值所代表的含义却是不一样的:

  • import “fmt” 一行中“fmt”代表的是包的导入路径(Import),它表示的是标准库下的 fmt 目录,整个 import 声明语句的含义是导入标准库 fmt 目录下的包;
  • fmt.Println 函数调用一行中的“fmt”代表的则是包名。

通常导入路径的最后一个分段名与包名是相同的,这里很容易让人误解 import 声明语句中的“fmt”指的是包名,其实并不是这样的,只有 fmt.Println 函数调用一行中的“fmt”代表的则是包名。

main 函数体中之所以可以调用 fmt 包的 Println 函数,还有最后一个原因,那就是 Println 函数名的首字母是大写的。在 Go 语言中,只有首字母为大写的标识符才是导出的(Exported),才能对包外的代码可见;如果首字母是小写的,那么就说明这个标识符仅限于在声明它的包内可见。

三、main 函数

  • Go语言程序的默认入口函数(主函数)func main()
  • main函数只能用于main包中,且只能定义一个。

四、Go 语言中程序是怎么编译的?

刚刚我在运行"hello, world"程序之前,输入了 go build 命令,还有它附带的源文件名参数来编译它:

$go build main.go

打开终端,可以通过输入下面这个 ls 命令看到刚刚生成的可执行文件:

$ls
main    main.go

和python 等其他语言不通的是,最终将mian运行在没有安装 Go 的环境中。如果是python 项目的话还需要安装python解释器和项目依赖等。

Go 是一种编译型语言,这意味着只有你编译完 Go 程序之后,才可以将生成的可执行文件交付于其他人吗,Go程序的编译过程可以总结为以下几个关键步骤:

  1. 词法与语法分析:编译器首先解析源代码文件 , 将代码转换成Token序列 , 然后按照语言定义的文法规则生成抽象语法树(AST) 。
  2. 类型检查:编译器对AST进行类型检查 , 验证变量 、 常量 、 函数等的类型正确性 , 同时对一些内置函数进行展开和处理 。
  3. 中间代码生成:经过类型检查后 , 编译器将AST转换成中间代码 , 使用了SSA(Static Single Assignment Form)特性 , 有助于代码优化 。
  4. 机器码生成:最后 , 编译器根据目标机器的架构(如amd64 、 arm 、 x86等)生成相应的机器码 , 使程序可以在不同的硬件上运行 。

img

具体请参考链接:Go程序是如何编译运行的

相关文章:

第一个 Go 程序“hello,world“ 与 main 函数

第一个 Go 程序"hello,world" 与 main 函数 文章目录 第一个 Go 程序"hello,world" 与 main 函数一.创建“hello,world”示例程序二. “hello,world” 程序结构拆解三、main 函数四、Go 语言中程序是怎么编译…...

MySQL缓冲池Buffer Pool

前言 ​ 在应用系统中,为加速数据访问,会把高频的数据放在「缓存」(Redis、MongoDB)里,减轻数据库的压力。在操作系统中,为了减少磁盘IO,同时为了快速响应,引入了「缓冲池」(buffer pool)机制。 ​ MySQL…...

springboot实现发送邮箱验证码

准备工作 在邮箱官网开放SMTP授权,获取相应密钥,才可以进行发送邮件 这里以网易163邮箱为例,登录邮箱后,依次点击“设置-POP3/SMTP/IMAP” ,然后开启SMTP服务。这时候会提示一个授权码,例如:H…...

ESP8266使用记录(三)

通过udp把mpu6050数据发送到PC端 /********************************************************************** 项目名称/Project : 零基础入门学用物联网 程序名称/Program name : ESP8266WiFiUdp_12 团队/Team : 太极创客团队 / Taichi-Maker (w…...

基于微信小程序的在线视频课程学习平台设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言用户微信端的主要功能有:管理员的主要功能有:具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉…...

CloudCompare 二次开发(15)——点云添加高斯噪声

目录 一、概述二、代码集成三、结果展示一、概述 不依赖任何第三方点云相关库,使用CloudCompare编程实现点云添加高斯噪声。添加高斯噪声的算法原理见:PCL 点云添加高斯噪声并保存。 二、代码集成 1、mainwindow.h文件public中添加: void doActionAddGassNoise(); //…...

一波免费、好用的API接口分享

全国快递物流地图轨迹查询:【H5物流轨迹、单号识别】通过物流单号和收寄件地址,自动评估物流时效,并在地图中展示包裹运输轨迹。包括顺丰、圆通、申通等主流快递公司。自动识别快递公司及单号,实时查询,稳定高效&#…...

Android App ~ LiveData

LiveData 两种更新数据方式 setValue(T value)postValue(T value) setValue()只能在主线程中调用,postValue()可以在任何线程中调用。 MutableLiveData 1.首先LiveData其实与数据实体类(POJO类)是一样的东西,它负责暂存数据. 2.其次LiveData其实也是一个观察者…...

全球第4大操作系统(鸿蒙)的软件后缀.hap

system exe 2022-12-01 04:38:38 首页 > 操作系统 145|0条评论 鸿蒙OS兼容已有安卓程序:这事不稀奇。 其实一个系统兼容另外系统的可执行程序并非新鲜事,比如linux下的wine和crossover可以兼容许多win系统的.exe程序。 作为回应,Wind…...

算法练习第六十四天

LCR 184. 设计自助结算系统 - 力扣(LeetCode) 总结:利用一个双端维护队列一个往后递减的队列,对头是最大值,每次进入一个新值时就一直和队尾元素比较将比新的值小的数排出,这样能保证留在队列中的数都是会…...

安卓系列机型 框架LSP 安装步骤 支持多机型 LSP框架通用安装步骤【二】

​​​​​​安卓玩机教程---全机型安卓4----安卓12 框架xp edx lsp安装方法【一】 低版本可以参考上个博文了解相关安装方法。 LSP框架优点 简单来说装lsp框架的优点在于可以安装各种模块。包括 但不限于系统优化 加速 游戏开挂等等的模块。大致相当于电脑的扩展油猴 Lspos…...

实现一个宽高自适应的正方形

.square {width: 10%;height: 10vw;background: tomato; }.square {width: 20%;height: 0;padding-top: 20%;background: orange; }.square {width: 30%;overflow: hidden;background: yellow; } .square::after {content: ;display: block;margin-top: 100%; }...

shell脚本命令

Shell命令是在类Unix操作系统中使用的命令行解释器(shell)中执行的命令。Shell命令可以用于执行系统命令、操作文件、进行文本处理、管理进程等。以下是一些常见的Shell命令: 1. ls:列出当前目录下的文件和文件夹。 2. cd&#x…...

Vue2023 面试归纳及复习(2)

1 vue3中的动态组件和KeepAlive组件 动态组件component <component>动态组件是一种可以根据数据变化而动态加载不同组件的方式。使用动态组件可以有效地减少代码复杂度&#xff0c;提高组件的复用性和灵活性。 动态组件通过一个特殊的属性is来实现动态加载&#xff0c…...

idea 本地项目上传到 Git 步骤

第一步&#xff1a;菜单栏 VCS——>import into Version control——>Create git Repository——>弹出框找到选中自己项目——>点击Ok 第二步&#xff1a;选中项目右键 ——>git——>Add 文件会变成绿色表示成功 第三步:VCS——>commit——>ok 提交到…...

【从0学习Solidity】41. WETH

【从0学习Solidity】41. WETH 博主简介&#xff1a;不写代码没饭吃&#xff0c;一名全栈领域的创作者&#xff0c;专注于研究互联网产品的解决方案和技术。熟悉云原生、微服务架构&#xff0c;分享一些项目实战经验以及前沿技术的见解。关注我们的主页&#xff0c;探索全栈开发…...

微信小程序的无限瀑布流写法

微信小程序的无限瀑布流实现总算做完了&#xff0c;换了好几种方法&#xff0c;过程中出现了各种BUG。 首先官方有瀑布流的插件&#xff08;Skyline /grid-view&#xff09;&#xff0c;不是原生的我就不想引入&#xff0c;因为我的方块流页面已经搭好了&#xff0c;引入说不定…...

前有CAP理论,后有BASE理论,分布式系统理论基石

&#x1f9d1;‍&#x1f4bb;作者名称&#xff1a;DaenCode &#x1f3a4;作者简介&#xff1a;CSDN实力新星&#xff0c;后端开发两年经验&#xff0c;曾担任甲方技术代表&#xff0c;业余独自创办智源恩创网络科技工作室。会点点Java相关技术栈、帆软报表、低代码平台快速开…...

HTTP、TCP、SOCKET三者之间区别和原理

7层网络模型 网络在世界范围内实现互联的标准框架 7层为理想模型&#xff0c;一般实际运用没有7层 详细内容 HTTP属于7层应用层 BSD socket属于5层会话层 TCP/IP属于4成传输层 TCP/IP协议 三次握手 笔者解析&#xff1a; 第一次握手&#xff1a;实现第一步需要客户端主动…...

flutter项目中常用第三方模块

flutter项目中常用第三方模块 持续更新中序言关于第三方模块安装flutter_native_splash使用方式模块配置 flutter_localizations模块配置使用方式 get_storage模块配置使用方式 get模块配置使用方式 持续更新中 序言 本章介绍项目中常用第三方模块&#xff0c;方便快速构建项目…...

SEM教程丨如何用“场景词”突围,月揽165个询盘?

很多工业设备老板觉得SEM就是“谁出价高谁就赢”&#xff0c;结果往往是钱烧了一大堆&#xff0c;机器没卖出去几台。今天我们要复盘的是某食品安检设备公司的实操案例&#xff0c;看看它是如何摆脱“无效烧钱”&#xff0c;稳稳拿下月均165个精准咨询的 &#x1f34e;。 一、 …...

从MySQL到Neo4j:用你熟悉的SQL思维,快速上手CQL创建第一个知识图谱

从MySQL到Neo4j&#xff1a;用SQL思维快速构建知识图谱的实战指南 当你在MySQL中熟练编写JOIN查询时&#xff0c;是否想过这些表关系本质上就是一张网&#xff1f;图数据库将这种网状关系作为一等公民&#xff0c;而Neo4j正是这个领域的佼佼者。本文会带你用熟悉的SQL视角&…...

户外太阳能监控供电方案:如何用CN3791芯片为3.7V锂电池设计稳定充电电路?

户外太阳能监控供电方案&#xff1a;CN3791芯片在3.7V锂电池充电电路中的实战设计 清晨六点&#xff0c;当第一缕阳光洒在郊区的通信基站上&#xff0c;搭载CN3791芯片的太阳能供电系统已经开始为锂电池注入能量——这正是现代户外监控设备赖以生存的"能量心脏"。在无…...

从USB2.0到USB3.0:硬件工程师必须知道的电源管理与布线升级要点(含电平转换案例)

从USB2.0到USB3.0&#xff1a;硬件工程师必须掌握的电源管理与布线升级实战指南 在硬件设计领域&#xff0c;接口技术的迭代往往带来性能的飞跃&#xff0c;但同时也伴随着设计复杂度的显著提升。USB3.0作为当前主流的高速接口标准&#xff0c;其传输速率相比USB2.0提升了近10倍…...

查询不准?响应延迟?Perplexity阅读推荐失效全归因,一线SRE团队72小时压测实录

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;查询不准&#xff1f;响应延迟&#xff1f;Perplexity阅读推荐失效全归因&#xff0c;一线SRE团队72小时压测实录 问题爆发现场还原 凌晨2:17&#xff0c;Perplexity阅读推荐API的P99延迟突增至8.4s&a…...

为什么你的Perplexity本地服务响应慢3.7倍?:NVIDIA驱动版本、vLLM推理后端与量化精度的隐性博弈

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;Perplexity本地服务查询 Perplexity 作为一款强调实时信息检索与引用溯源的 AI 工具&#xff0c;其官方未提供公开的本地化部署方案。但开发者可通过构建轻量级代理服务&#xff0c;将本地运行的大语言模型&a…...

Perplexity环境新闻检索失效真相(2024最新API响应延迟根因分析)

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;Perplexity环境新闻搜索 Perplexity 是一款基于大语言模型的实时信息检索工具&#xff0c;其核心优势在于融合权威信源与上下文感知能力&#xff0c;特别适用于需要高时效性与高可信度的新闻类查询场景。在该环…...

终极AMD Ryzen调试指南:简单三步掌握硬件性能调优

终极AMD Ryzen调试指南&#xff1a;简单三步掌握硬件性能调优 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gitcod…...

KMS智能激活脚本:3分钟永久激活Windows和Office的终极指南

KMS智能激活脚本&#xff1a;3分钟永久激活Windows和Office的终极指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统频繁弹出激活提示而烦恼吗&#xff1f;Office文档突然变…...

告别Unity WebGL的模糊UI:用Vue3重构前端界面,手把手教你实现双向通信

Unity WebGL与Vue3的完美联姻&#xff1a;打造高清交互界面的实战指南 1. 为什么需要重构Unity WebGL的UI系统&#xff1f; 许多Unity开发者都曾经历过这样的困境&#xff1a;当我们将精心制作的3D项目发布为WebGL版本时&#xff0c;原生UGUI在浏览器中的表现往往不尽如人意。模…...