第一个 Go 程序"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 main

import "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等)生成相应的机器码 , 使程序可以在不同的硬件上运行 。

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

第一个 Go 程序"hello,world" 与 main 函数和Go常用基本命令的更多相关文章

  1. 写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度

    import java.util.Scanner; /** * [程序38] * * 题目:写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度. * * @author Jame ...

  2. 38 写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。

    题目:写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度. public class _038PrintLength { public static void main(Stri ...

  3. 三、第一个cocos2d程序的代码分析

    http://blog.csdn.net/q199109106q/article/details/8591706 在第一讲中已经新建了第一个cocos2d程序,运行效果如下: 在这讲中我们来分析下里面 ...

  4. C#.NET学习笔记2---C#.第一个C#程序

    C#.NET学习笔记2---C#.第一个C#程序 技术qq交流群:JavaDream:251572072  教程下载,在线交流:创梦IT社区:www.credream.com 6.第一个C#程序:   ...

  5. 【C++探索之旅】第一部分第三课:第一个C++程序

    内容简介 1.第一部分第三课:第一个C++程序 2.第一部分第四课预告:内存的使用 第一个C++程序 经过上两课之后,我们已经知道了什么是编程,编程的语言,编程的必要软件,C++是什么,我们也安装了适 ...

  6. (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序

    每次使用 Visual Studio 的模板创建一个 UWP 程序,我们会在项目中发现大量的项目文件.配置.应用启动流程代码和界面代码.然而这些文件在 UWP 程序中到底是如何工作起来的? 我从零开始 ...

  7. 第一个Swift程序Hello World

    import Foundation print("Hello, World!") print("I am here!") var arr=["项羽&q ...

  8. WPF 用Main函数方式启动程序

    原文:WPF 用Main函数方式启动程序 WPF默认程序启动:新建project后自动生成的App.xaml中指定程序启动方式(StartupUri="MainWindow.xaml&quo ...

  9. 【转载】linux操作系统与应用程序的main函数

    来源:https://blog.csdn.net/h542723151/article/details/52154871 这几天一直在纠结: main函数是程序的入口,一个程序启动后,经过bootlo ...

  10. 基础概念(3):怎么写一个c程序?

    总结卡片: 遵循c语言的规则,即可写出c程序.规则下有两个重要概念:函数与变量.就好像游戏中的打仗,要考虑怎么打,谁来打."怎么打"就是流程,把流程封装起来就是函数,流程也叫算法. ...

随机推荐

  1. 通用密钥,无需密码,在无密码元年实现Passkeys通用密钥登录(基于Django4.2/Python3.10)

    毋庸讳言,密码是极其伟大的发明,但拜病毒和黑客所赐,一旦密码泄露,我们就得绞尽脑汁再想另外一个密码,但记忆力并不是一个靠谱的东西,一旦遗忘密码,也会造成严重的后果,2023年业界巨头Google已经率 ...

  2. Typora 主题Mo Dark 样式

    Mo Dark 主题样式 html { font-size: 16px; } /*加粗字体样式*/ strong { -webkit-background-clip: text; -webkit-te ...

  3. Maven资源大于配置问题

    资源大于配置问题 <!--pom.xml中在build中配置resources,来防止我们资源导出失败的问题--> <build> <resources> < ...

  4. P8903 [USACO22DEC] Bribing Friends G 看电影

    P8903 [USACO22DEC] Bribing Friends G 看电影 目录 P8903 [USACO22DEC] Bribing Friends G 看电影 题目描述 输入格式 输出格式 ...

  5. 从0开发WebGPU渲染引擎:开篇

    大家好,本系列会从0开始,开发一个基于WebGPU的路径追踪渲染器,使用深度学习降噪.DLSS等AI技术实现实时渲染:并且基于自研的低代码开发平台,让用户可以通过可视化拖拽的方式快速搭建自定义的Web ...

  6. 用windows脚本命令netsh快速启用、禁用网络

    用windows脚本命令netsh快速启用.禁用网络 不知道你有没有这种需求:公司单位里的网络是内网,有时需要连接手机热点wifi网络,这时就需要先禁用内网网卡,启用无线网卡.连接内网的时候又需要先禁 ...

  7. 反射(Java Reflection)

    Java反射机制概述 Reflection(反射)是Java被视为动态语言的关键,反射机制允许程序在执行期借助于ReflectionAPI取得任何类的内部信息,并能直接操作任意对象的内部属性及方法. ...

  8. OO第二次大作业

    前言 前言的前言 第二篇blog跟上一篇只隔了将近一个月,但是感觉心境上好像发生了很多的变化,认识到了自己存在的很多不足(可能是菜单折磨的),感觉对很多东西都一知半解,希望在写完这篇总结性blog之后 ...

  9. 《敏捷无敌之DevOps时代》读后感

    背景: 2020年基于我司业务形态,我开始实行敏捷项目管理.以敏捷为道,Scrum为法,迭代为术,禅道作器,大张旗鼓的搞了2年敏捷开发.随着时间推移,问题出现在2022年,当时我们已经完全按照Scru ...

  10. 本地连接阿里云上的mysql centos

    首先写下原因: 未让3306端口通过防火墙 1.  检查端口是否被防火墙挡住 telnet ip地址 3306 在windows中打开telnet应用, 参考:https://www.cnblogs. ...