【Go系列】 Go语言的入门
为什么要学习Go
从今天起,我们将一同启程探索 Go 语言的奥秘。我会用简单明了的方式,逐一讲解 Go 语言的各个知识点,帮助你从基础做起,一步步深化理解。不论你之前是否有过 Go 语言的接触经验,这个系列文章都将助你收获满满。
现在,让我以一个经典的例子“Hello World”来带你入门 Go 语言,了解它是如何运行起来的。
开始学习
Hello, 世界
若你曾学习过 C 语言,那么对下面这个经典示例应该颇为熟悉。借助这个例子,我将首先为你简要介绍 Go 语言的一些关键概念,帮助你初步把握 Go 语言代码的结构和风貌。以下是示例代码:
package mainimport "fmt"func main() {fmt.Println("Hello, World!")}
这五行的代码组合便形成了一个完整的 Go 程序,你会发现它非常易于理解。接下来,我将执行这段代码,让我们观察一下运行后的输出。操作步骤是打开命令行终端,输入以下指令,并按下回车键。
$ go run main.goHello, World!
当我输入命令 go run main.go
并按下回车键后,屏幕上显示的“Hello, World!”便是我们的 Go 程序运行后的输出结果。
在这里,go
是 Go 语言附带的工具链中的一个命令,它与您可能熟悉的如 ls
这样的命令行工具一样,是一个可执行程序。go
命令提供了多种功能,包括运行、编译 Go 代码,以及生成可执行文件等。
run
是 go
命令下的一个选项,它用于指示工具链执行指定的 Go 程序。而 main.go
则是我编写的 Go 代码文件。因此,整个命令 go run main.go
的含义是,使用 Go 工具链来运行 main.go
文件中的代码。
程序结构分析
为了让一个 Go 语言程序顺利执行,关键在于包含 package main
和 main
函数这两个要素。package main
指示这是一个可执行的应用程序,而 main
函数则是程序启动的入口点。
在“Hello, 世界”这个基础示例中,我们见证了 Go 语言程序的基本骨架。以下是对程序结构的逐步解析,以及 Go 语言核心概念的介绍。
首行的 package main
声明了当前文件 ch01/main.go
所属的包。在 Go 语言中,package
是声明包的关键字,而 main
是包的名称。main
包在 Go 语言中具有特殊意义,它表明你的项目是一个独立的可执行程序,而不是供其他项目引用的库。
第二行的 import "fmt"
是引入 fmt
包的声明。import
是 Go 语言的关键字,用于导入所需的包。这里我们导入了 fmt
包,以便在后续代码中使用它提供的功能。
第三行的 func main()
定义了 main
函数。func
是 Go 语言中声明函数的关键字,main
是函数名,而空括号 ()
表示该函数不接受任何参数。在 Go 语言中,main
函数是程序的入口点,程序启动时首先执行的就是 main
函数,通过它来调用其他函数以实现业务逻辑。
第四行的 fmt.Println("Hello, 世界")
是调用 fmt
包中的 Println
函数来输出文本“Hello, 世界”。要使用一个包的功能,必须先将其导入。Println
函数是 fmt
包提供的一个函数,用于在控制台上打印信息。
最后一行的大括号 }
标志着 main
函数体的结束。至此,我们完成了对这段代码的分析,执行程序后便能看到“Hello, 世界”的输出。
通过上述分析,我们可以看出 Go 语言的代码结构简洁而完整,仅凭 package
、import
和 func main
这些基本概念就能构建一个可运行的程序。
在后续,我们将进一步探讨如何使用变量、自定义函数等内容。在此之前,我们先来了解 Go 语言的开发环境如何搭建,这是运行上述 Go 代码并让程序运行起来的前提。
Go 语言环境搭建
要搭建 Go 语言的开发环境,首先需要下载 Go 语言的安装包。你可以访问 Go 官方网站 https://golang.org/dl/ 或者国内的镜像网站 https://golang.google.cn/dl/ 来下载(由于网络原因,如果无法访问国外官网,可以选择国内的镜像网站进行下载)。
在下载页面,根据你所使用的操作系统(无论是 Windows、macOS 还是 Linux)选择合适的安装包。以下是下载步骤的简要说明:
- 访问 Go 语言官方网站或国内镜像网站。
- 在下载页面中,找到适合你操作系统的 Go 版本。
- 点击相应的下载链接,下载 Go 安装包。
Windows MSI 下安装
在 Windows 系统中,MSI 安装包是一个便捷的选择,因为它提供了一个直观的安装界面,让用户能够轻松地配置 Go 语言开发环境。对于大多数现代的 Windows 操作系统,它们都是 64 位的,因此你应该下载 go1.20.windows-amd64.msi
。如果你使用的是 32 位的 Windows 系统,那么你应该选择 go1.15.windows-386.msi
。
下载并双击安装包后,你会被引导通过一系列的安装步骤。在安装过程中,你可以选择将 Go 安装到默认的 C:\Go
目录,或者根据自己的喜好选择一个不同的目录。
一旦你选择安装到 C:\Go
目录,安装程序会自动将 C:\Go\bin
目录添加到你的系统 PATH 环境变量中。这样,你就可以在任何命令提示符中直接运行 Go 命令了。如果你发现安装程序没有添加这个路径,你也可以手动将其添加到 PATH 环境变量。
手动添加步骤如下:
- 打开“控制面板”。
- 选择“系统和安全”。
- 点击“系统”。
- 在系统属性窗口中,选择“高级”选项卡。
- 点击“环境变量”按钮。
- 在环境变量窗口中,找到并选择“Path”变量,然后点击“编辑”。
- 在编辑环境变量窗口中,点击“新建”,然后输入
C:\Go\bin
。 - 点击“确定”保存更改。
- 退出所有打开的命令行窗口,然后打开一个新的命令行窗口以使更改生效。
Linux 下安装
如果要安装1.18以下的版本可以直接
sudo apt-get install golang-goyum install golang-go
第一行为Ubuntu的下载,第二行为Redhat的下载方式。
如果要通过安装包安装的话,由于Linux 系统有 32 位和 64 位,你可以根据你的 Linux 操作系统选择相应的压缩包,它们分别是 go1.20.linux-386.tar.gz 和 go1.20.linux-amd64.tar.gz。
下载成功后,需要先进行解压,假设你下载的是 go1.20.linux-amd64.tar.gz,在终端通过如下命令即可解压:
sudo tar -C /usr/local -xzf go1.20.linux-amd64.tar.gz
然后把 /usr/local/go/bin 添加到 PATH 环境变量中,就可以使用 Go 语言开发工具包了。
把下面这段添加到 /etc/profile 或者 $HOME/.profile 文件中,保存后退出即可成功添加环境变量。
export PATH=$PATH:/usr/local/go/bin
macOS 下安装
如果你的操作系统是 macOS,可以采用 PKG 安装包。下载 go1.20.darwin-amd64.pkg 后,双击按照提示安装即可。安装成功后,路径 /usr/local/go/bin 应该已经被添加到了 PATH 环境变量中,如果没有的话,你可以手动添加,和上面 Linux 的方式一样,把如下内容添加到 /etc/profile 或者 $HOME/.profile 文件保存即可。
export PATH=$PATH:/usr/local/go/bin
安装测试
安装成功后,可以打开终端或者命令提示符,输入 go version 来验证 Go 语言是否安装成功。如果成功的话,会打印出 Go 语言的版本和系统信息,如下所示:
$ go versiongo version go1.20 darwin/amd64
环境变量设置
在安装了 Go 语言开发工具包之后,虽然你已经拥有了编译和运行 Go 程序的基本能力,但还有一些重要的环境变量需要设置,以确保 Go 开发环境完整。这两个关键的环境变量是 GOPATH
和 GOBIN
。
- GOPATH:这是 Go 项目的工作目录,它在 Go Module 之前是非常重要的,现在主要用于存放使用
go get
命令获取的项目。 - GOBIN:这是 Go 编译生成的程序的安装目录。当你使用
go install
命令时,编译后的 Go 程序会被安装到GOBIN
目录中,这样你就可以在命令行中直接使用这些程序。
假设你的工作目录是 /Users/ubuntu/go
,你需要将 GOPATH
环境变量设置为 /Users/ubuntu/go
,并将 GOBIN
环境变量设置为 $GOPATH/bin
。
在 Linux 和 macOS 系统下,你可以将以下内容添加到 /etc/profile
或者你的用户目录下的 .profile
文件中,以设置这些环境变量:
export GOPATH=/Users/ubuntu/go
export GOBIN=$GOPATH/bin
export PATH=$PATH:$GOBIN
如果在 Windows 系统中,可以通过控制面板 -> 高级 -> 环境变量选项添加这两个环境变量。
项目结构
在 Go 语言的现代项目中,Go Module 是一个推荐的管理依赖和构建项目的工具。它允许你在项目的任何位置创建一个 Go 语言项目,而不需要依赖于全局的 GOPATH 环境变量。
假设你的项目位置是 /Users/ubuntu/goProject/,打开终端,输入如下命令切换到该目录下:
$ cd /Users/ubuntu/goProject/
可以执行如下命令创建一个 Go Module 项目, 会生成一个go.mod文件:
$ go mod init
然后在当前目录下创建一个 main.go 文件,这样整个项目目录结构是:
goProject├── go.mod├── lib└── main.go
其中 main.go 是整个项目的入口文件,里面有 main 函数。lib 目录是项目的子模块,根据项目需求可以新建很多个目录作为子模块,也可以继续嵌套为子模块的子模块。
编译发布
完成了你的 Go 项目后,你可以选择将代码编译成一个可执行文件,以便在终端中直接运行,或者将其发布到 $GOBIN
目录,以便在系统环境中直接使用。
$ go build main.go
回车执行后会在当前目录生成 main 可执行文件,现在,我们来测试下它是否可用。
$ ./main Hello, World!
如果成功打印出“Hello, World!”,证明程序成功生成。
把它安装到 $GOBIN 目录或者任意位置:
$ go install main.go
跨平台编译
在 Go 语言开发工具包中,一个令人印象深刻的功能就是它的跨平台编译能力。这意味着你可以在一个操作系统上开发代码,然后编译出可以在其他操作系统上运行的可执行程序。例如,如果你在 macOS 上开发,你可以编译出能在 Linux 或 Windows 上运行的程序。
跨平台编译允许你选择你最喜欢的操作系统作为开发环境,然后轻松地将代码编译成适合发布平台的可执行程序。
Go 语言通过两个环境变量来控制跨平台编译:
- GOOS:代表要编译的目标操作系统。常见的值有
linux
、windows
、darwin
等。 - GOARCH:代表要编译的目标处理器架构。常见的值有
386
、amd64
、arm64
等。
通过组合不同的 GOOS
和 GOARCH
值,你可以编译出适用于不同平台的可执行程序。例如,如果你在 macOS 上开发,且你的系统是 AMD64 架构,你可以这样编译出一个适用于 Linux AMD64 架构的可执行程序:
$ GOOS=linux GOARCH=amd64 go build main.go
在这个命令中:
GOOS=linux
:告诉 Go 编译器目标操作系统是 Linux。GOARCH=amd64
:告诉 Go 编译器目标处理器架构是 AMD64。go build -o linux-amd64-hello-world .
:编译当前目录下的 Go 源文件,并将输出命名为linux-amd64-hello-world
。
完成编译后,你将得到一个名为 linux-amd64-hello-world
的可执行文件,它可以在 Linux AMD64 架构的系统上运行。这样,你就可以选择在 macOS 上开发,然后编译出适用于其他平台的可执行程序,以便在不同环境中运行你的 Go 程序。
Go 编辑器推荐
在软件开发领域,选择一款合适的编辑器对于提高工作效率至关重要。今天,我想向大家推荐两款备受开发者喜爱的编辑器,它们分别是 Visual Studio Code 和 JetBrains 的 Goland。
Visual Studio Code 这款编辑器是一款由微软开发的免费开源代码编辑器,拥有丰富的插件和扩展功能。对于 Go 语言开发,Visual Studio Code 提供了专门的 Go 扩展插件,它可以帮助你更高效地编写、调试和测试 Go 代码。你可以在 Visual Studio Code 的官方网站 Visual Studio Code - Code Editing. Redefined 下载这款编辑器,并安装 Go 扩展插件来开始你的 Go 开发之旅。
Goland是一款由老牌 IDE 厂商 JetBrains 推出的 Go 语言集成开发环境。它不仅集成了所有必要的 Go 插件,还提供了一系列强大的功能,如代码补全、代码格式化、代码重构、代码导航等。Goland 适合所有水平的开发者,无论是初学者还是经验丰富的老手,都能在 Goland 中找到适合自己的开发体验。你可以在 Goland 的官方网站 GoLand by JetBrains: More than just a Go IDE 下载并安装 Goland,开始使用这款功能强大的 Go 开发工具。
选择哪款编辑器取决于你的个人偏好和需求。如果你喜欢轻量级的编辑器并且需要丰富的插件支持,Visual Studio Code 是一个不错的选择。而如果你更倾向于使用集成度更高、功能更全面的 IDE,Goland 可能会更符合你的需求。无论你选择哪款编辑器,它们都能帮助你更高效地开发 Go 语言应用程序。
相关文章:

【Go系列】 Go语言的入门
为什么要学习Go 从今天起,我们将一同启程探索 Go 语言的奥秘。我会用简单明了的方式,逐一讲解 Go 语言的各个知识点,帮助你从基础做起,一步步深化理解。不论你之前是否有过 Go 语言的接触经验,这个系列文章都将助你收获…...

Dify 与 Xinference 最佳组合 GPU 环境部署全流程
背景介绍 在前一篇文章 RAG 项目对比 之后,确定 Dify 目前最合适的 RAG 框架。本次就尝试在本地 GPU 设备上部署 Dify 服务。 Dify 是将模型的加载独立出去的,因此需要选择合适的模型加载框架。调研一番之后选择了 Xinference,理由如下&…...

MICCAI 2024Centerline Boundary Dice Loss for Vascular Segmentation
MICCAI 2024 Centerline Boundary Dice Loss for Vascular Segmentation MICCAI 2024Centerline Boundary Dice Loss for Vascular Segmentation中心线边界Dice损失用于血管分割**摘要**:1. 引言相关工作: 2. 方法预备知识Dice的变化 3 实验3.1 数据集3.2 设置3.3 结…...

golang验证Etherscan上的智能合约
文章目录 golang验证Etherscan上的智能合约为什么要验证智能合约如何使用golang去验证合约获取EtherscanAPI密钥Verify Source Code接口Check Source Code Verification Status接口演示示例及注意事项网络问题无法调用Etherscan接口(最重要的步骤) golan…...
Visual Studio编译优化选项
目录 /O1 和 /O2 /Ox 内联函数 虚函数优化 代码重排 循环优化 链接时间优化 代码分割 数学优化 其他优化选项 在Visual Studio中,编译优化选项是用于提高程序性能的重要工具。编译器提供了多种优化级别和选项,可以根据不同的需要进行选择。 在…...

sql业务场景分析思路参考
1、时间可以进行排序,也可以用聚合函数对时间求最大值max(时间) 例如下面的例子:取最晚入职的人,那就是将入职时间倒序排序,然后limit 1 表: 场景:查找最晚入职员工的所有信息 se…...
Django权限系统如何使用?
Django的权限系统是一个强大而灵活的特性,允许你控制不同用户对应用程序中资源的访问。以下是使用Django权限系统的几个基本步骤: 1. 定义模型权限 在你的models.py文件中,你可以为每个模型定义自定义权限。这通过在模型的Meta类里设置perm…...

基于整体学习的大幅面超高分遥感影像桥梁目标检测(含数据集下载地址)
文章摘要 在遥感图像(RSIs)中进行桥梁检测在各种应用中起着至关重要的作用,但与其他对象检测相比,桥梁检测面临独特的挑战。在RSIs中,桥梁在空间尺度和纵横比方面表现出相当大的变化。因此,为了确保桥梁的…...

逻辑回归模型(非回归问题,而是解决二分类问题)
目录: 一、Sigmoid激活函数:二、逻辑回归介绍:三、决策边界四、逻辑回归模型训练过程:1.训练目标:2.梯度下降调整参数: 一、Sigmoid激活函数: Sigmoid函数是构建逻辑回归模型的重要激活函数&am…...
QT的OpenGL渲染窗QOpenGLWidget Class
Qt - QOpenGLWidget (class) (runebook.dev) 一、说明 QOpenGLWidget 类是用于渲染 OpenGL 图形的小部件。从Qt 5.4就开始退出,它对于OpenGL有专门的配合设计。 二、QOpenGLWidget类的成员 2.1 Public类函数 QOpenGLWidget(QWidget *parent nullptr,Qt…...
单元测试和集成测试
软件测试中,单元测试和集成测试是比较常见的方法 单元测试:这是一种专注于最小可测试单元(通常是函数或方法)的测试,用于验证单个组件的行为是否符合预期。它通常由开发者自己完成,可以尽早发现问题&#…...
【JAVA入门】Day15 - 接口
【JAVA入门】Day15 - 接口 文章目录 【JAVA入门】Day15 - 接口一、接口是对“行为”的抽象二、接口的定义和使用三、接口中成员的特点四、接口和类之间的关系五、接口中新增的方法5.1 JDK8开始接口中新增的方法5.1.1 接口中的默认方法5.1.2 接口中的静态方法 5.2 JDK9 开始接口…...
ES6 之 Set 与 Map 数据结构要点总结(一)
Set 数据结构 Set 对象允许你存储任何类型的唯一值,无论是原始值还是对象引用。 特性: 所有值都是唯一的,没有重复。值的顺序是根据添加的顺序确定的。可以使用迭代器遍历 Set。 常用方法: 1. add(value):添加一个新…...

一文学会用RKE部署高可用Kubernetes集群
k8s架构图 RKE简介 RKE全称Rancher Kubernetes Engine,是一个快速的,多功能的 Kubernetes 安装工具。通过RKE,我们可以快速的安装一个高可用K8S集群。RKE 支持多种操作系统,包括 MacOS、Linux 和 Windows。 K8S原生安装需要的先…...

数据加密的常见方法
数据加密是一门历史悠久的技术,它通过加密算法和加密密钥将明文(原始的或未加密的数据)转变为密文,而解密则是通过解密算法和解密密钥将密文恢复为明文。这一技术的核心是密码学,它利用密码技术对信息进行加密,实现信息隐蔽&#…...
天童美语:推荐给孩子的人文历史纪录片
孩子们都有自己的偏好,有的孩子喜欢打游戏,有的孩子喜欢看剧看电影,有的孩子喜欢看书。针对不同的孩子我们要因材施教,所以,广州天童教育给大家推荐一下适合给孩子看的人文历史类的纪录片,让精美的画面&…...

数字人技术如何推动教育事业可持续创新发展?
数字人技术作为一种新兴的教育手段,无论是幼儿园还是大学课堂,数字人都可以融入于各阶段教育中,结合动作捕捉、AI等技术,提高教育资源的利用。 AI智能交互数字人应用: 数字人结合NLP自然语言处理技术以及AI大模型技术…...

FPGA程序设计
在设计FPGA时,多运用模块化的思想取设计模块,将某一功能设计成module。 设计之前要先画一下模块设计图,列出输入输出接口,再进一步设计内部功能。 状态机要画图,确定每个状态和状态之间怎么切换。状态用localparam定…...

彻底开源,免费商用,上海AI实验室把大模型门槛打下来
终于,业内迎来了首个全链条大模型开源体系。 大模型领域,有人探索前沿技术,有人在加速落地,也有人正在推动整个社区进步。 就在近日,AI 社区迎来首个统一的全链条贯穿的大模型开源体系。 虽然社区有LLaMA等影响力较大…...

MTEB评估基准使用指北
文章目录 介绍评估数据 介绍 文本嵌入通常是在单一任务的少量数据集上进行评估,这些数据集未涵盖其可能应用于其他任务的情况,不清楚在语义文本相似性(semantic textual similarity, STS)等任务上的最先进嵌入是否同样适用于聚类或…...

使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...

Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...

《Docker》架构
文章目录 架构模式单机架构应用数据分离架构应用服务器集群架构读写分离/主从分离架构冷热分离架构垂直分库架构微服务架构容器编排架构什么是容器,docker,镜像,k8s 架构模式 单机架构 单机架构其实就是应用服务器和单机服务器都部署在同一…...

基于开源AI智能名片链动2 + 1模式S2B2C商城小程序的沉浸式体验营销研究
摘要:在消费市场竞争日益激烈的当下,传统体验营销方式存在诸多局限。本文聚焦开源AI智能名片链动2 1模式S2B2C商城小程序,探讨其在沉浸式体验营销中的应用。通过对比传统品鉴、工厂参观等初级体验方式,分析沉浸式体验的优势与价值…...
GeoServer发布PostgreSQL图层后WFS查询无主键字段
在使用 GeoServer(版本 2.22.2) 发布 PostgreSQL(PostGIS)中的表为地图服务时,常常会遇到一个小问题: WFS 查询中,主键字段(如 id)莫名其妙地消失了! 即使你在…...
stm32—ADC和DAC
ADC和DAC 在嵌入式系统中,微控制器经常需要与现实世界的模拟信号进行交互。STM32微控制器内置了模拟数字转换器(ADC)和数字模拟转换器(DAC),它们是实现这种交互的关键模块。 1. 模拟数字转换器(…...