第一个 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程序是如何编译运行的

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

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

相关文章

C++qt Day10

1.制作闹钟 头文件 #include <QWidget> #include <QTimerEvent> #include <QTime> #include <QtTextToSpeech/QTextToSpeech> #include <QTextEdit> #include <QString>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMES…

PowerDesigner 连接 MYSQL

我使用的是powerDesigner16的版本&#xff0c;使用前先保证安装了 mysql odbc 驱动包 选择&#xff1a;文件 -> 反向工程 -> database… 一大波图片正在来袭。。。 点击确认 至此连接成功

代码随想录二刷day37

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、力扣738. 单调递增的数字二、力扣968. 监控二叉树 前言 一、力扣738. 单调递增的数字 class Solution {public int monotoneIncreasingDigits(int n) {Str…

【JavaScript保姆级教程】Javascript常量

文章目录 前言一、常量1.1 常量是什么1.2 常量的作用 二、示例代码2.1 示例1&#xff1a;声明一个常量2.2 示例2&#xff1a;常量的命名规则2.3 示例3&#xff1a;常量与变量的区别 总结 前言 欢迎来到【JavaScript保姆级教程】&#xff01;在本篇教程中&#xff0c;我们将讨论…

【激光雷达码盘偏摆角的真假点映射关系】

激光雷达码盘偏摆角的真假点映射关系 一、概要二、完架构流程三、技术细节四、完整代码 一、概要 本代码主要计算激光雷达码盘偏摆角&#xff08;也可以理解为雷达的零位角&#xff09;导致的实际slam建图距离的偏差&#xff0c;只取了第一个象限作为分析目标。最终得出的结论是…

浅谈Deep Learning 与 Machine Learning 与Artificial Intelligence

文章目录 三者的联系与区别 三者的联系与区别 “Deep Learning is a kind of Machine Learning, and Machine Learning is a kind of Artificial Intelligence.” 人工智能&#xff08;AI&#xff09;&#xff0c;机器学习&#xff08;Machine Learning&#xff0c;简称ML&am…

41. Linux系统配置FTP服务器并在QT中使用QFtp实现文件上传

1. 说明 这篇博客主要记录一些在Linux系统中搭建FTP服务器时踩过的一些坑,以及在使用QFtp上传文件时需要注意的问题。 2. FTP环境搭建 在linux系统中,需要安装vsftpd,可以在终端中输入下面的命令进行安装: sudo apt-get install vsftpd使用上述命令安装后,系统中会有一…

深入探索RTPS/DDS协议:为嵌入式设备打造的可移植C++实现指南

第一部分&#xff1a;RTPS/DDS协议简介及其在嵌入式设备中的重要性 1. RTPS/DDS协议简介 RTPS (Real-Time Publish-Subscribe) 和 DDS (Data Distribution Service) 是两个紧密相关的中间件协议&#xff0c;专为实时系统设计。它们为分布式应用提供了一种高效、可靠和可扩展的…

价值1000的情感爆文写作prompt,助你写出10万+阅读微信爆文

原文&#xff1a;价值1000的情感爆文写作prompt&#xff0c;助你写出10万阅读微信爆文 - 知乎 是否经常看到一些自媒体晒出这样的图片&#xff1f; 或者是这样的10w的阅读文章 那么这是真实能赚钱的吗&#xff1f;还是自媒体夸大其说&#xff0c;吸引流量。 我们先简单了解什…

什么是重入锁?

重入锁&#xff08;Reentrant Lock&#xff09;是一种在多线程编程中用于控制对共享资源访问的锁机制。它的特点是允许同一个线程多次获得同一把锁&#xff0c;也就是说&#xff0c;线程可以进入由它已经持有的锁所保护的代码块&#xff0c;而不会被自己持有的锁所阻塞。这种特…

基础练习 回文数

问题描述 1221是一个非常特殊的数&#xff0c;它从左边读和从右边读是一样的&#xff0c;编程求所有这样的四位十进制数。 输出格式 按从小到大的顺序输出满足条件的四位十进制数。 solution1 #include <stdio.h> int main(){int n 1000, n1, n2, n3, n4;while(n &…

【C++】bitset位图的简单模拟实现及常见面试题

文章目录 前言一、 bitset模拟实现二、 常见面试题1.给你一百亿个整数&#xff0c;找到只出现一次的数字2. 给两个文件&#xff0c;分别有100亿个整数&#xff0c;我们只有1G内存&#xff0c;如何找到两个文件交集&#xff1f; 前言 快速查找某个数据是否在一个集合中排序 去重…

有名管道及其应用

创建FIFO文件 1.通过命令&#xff1a; mkfifo 文件名 2.通过函数: mkfifo #include <sys/types.h> #include <sys/stat.h> int mkfifo(const char *pathname, mode_t mode); 参数&#xff1a; -pathname&#xff1a;管道名称的路径 -mode&#xff1a;文件的权限&a…

每日两题 70爬楼梯 746使用最小花费爬楼梯(动态规划)

70 70 题目 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1a;有两种方法可以爬到楼顶。 1 阶 1 阶2 阶 示例 …

程序员的快乐如此简单

最近在GitHub上发起了一个关于Beego框架的小插件的开源仓库&#xff0c;这一举动虽然看似微小&#xff0c;但其中的快乐和意义却是无法用言语表达的。 Beego是一个开源的Go语言Web框架&#xff0c;它采用了MVC架构模式&#xff0c;并集成了很多常用的功能和中间件。小插件是指…

【RUST】HashMap、vector和String

HashMap 新建一个哈希hash use std::colection::HashMap;let mut scores HashMap::new();scores.insert(String::from("Blue"), 10); score.Vector 创建vector let arr vec![2, 3, 5]; let arr: [i32; 3] [2, 3, 5]; // 创建定长数组访问vec中的元素 # 报错…

软件工程 第一次随堂练习

以下答案是经过人工智能生成&#xff0c;个人理解得出的答案&#xff0c;若有不同见解&#xff0c;请在评论区留言或私信 说明下列需求分别属于下面的哪种类型&#xff0c;为什么&#xff1f; A.业务需求 B.用户需求 C.系统级&#xff08;功能&#xff09;需求 D.性能需求 E.质…

AIGC绘本——海马搬家来喽

随着ChatGPT的快速发展&#xff0c;人工智能领域也发生了翻天覆地的变化。今天&#xff0c;我们迎合科技潮流&#xff0c;利用AIGC的强大能力&#xff0c;可以创作很多精彩的作品&#xff0c;比如这样一本名为《海马搬家》的绘本&#xff08;注&#xff1a;此绘本根据同名儿童故…

线性绘制在NSDT 3D场布中的应用

什么是线性摆放&#xff1f; 线性摆放是指将一系列对象按照直线或者曲线进行排列&#xff0c;形成一条线或者弧线状的布局方式。在3D场布中&#xff0c;线性摆放可以应用于多个领域和场景&#xff0c;如展览设计、景观规划、商业空间布置等。 线性绘制在3D场布中的应用 展览设…

OpenCV自学笔记十三:图像梯度

目录 1、Sobel算子及函数使用 2、Scharr算子及函数使用 3、Lapiacian算子及函数使用 1、Sobel算子及函数使用 Sobel算子是一种常用于图像边缘检测的算法&#xff0c;它利用了图像中像素灰度值的变化来寻找边缘。在OpenCV中&#xff0c;可以使用函数cv2.Sobel()来实现Sobel算…