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

【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 语言的代码结构简洁而完整,仅凭 packageimport 和 func main 这些基本概念就能构建一个可运行的程序。

        在后续,我们将进一步探讨如何使用变量、自定义函数等内容。在此之前,我们先来了解 Go 语言的开发环境如何搭建,这是运行上述 Go 代码并让程序运行起来的前提。

Go 语言环境搭建

        要搭建 Go 语言的开发环境,首先需要下载 Go 语言的安装包。你可以访问 Go 官方网站 https://golang.org/dl/ 或者国内的镜像网站 https://golang.google.cn/dl/ 来下载(由于网络原因,如果无法访问国外官网,可以选择国内的镜像网站进行下载)。

在下载页面,根据你所使用的操作系统(无论是 Windows、macOS 还是 Linux)选择合适的安装包。以下是下载步骤的简要说明:

  1. 访问 Go 语言官方网站或国内镜像网站。
  2. 在下载页面中,找到适合你操作系统的 Go 版本。
  3. 点击相应的下载链接,下载 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 环境变量。

手动添加步骤如下:

  1. 打开“控制面板”。
  2. 选择“系统和安全”。
  3. 点击“系统”。
  4. 在系统属性窗口中,选择“高级”选项卡。
  5. 点击“环境变量”按钮。
  6. 在环境变量窗口中,找到并选择“Path”变量,然后点击“编辑”。
  7. 在编辑环境变量窗口中,点击“新建”,然后输入 C:\Go\bin
  8. 点击“确定”保存更改。
  9. 退出所有打开的命令行窗口,然后打开一个新的命令行窗口以使更改生效。

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:代表要编译的目标操作系统。常见的值有 linuxwindowsdarwin 等。
  • GOARCH:代表要编译的目标处理器架构。常见的值有 386amd64arm64 等。

通过组合不同的 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)等任务上的最先进嵌入是否同样适用于聚类或…...

31. 1049. 最后一块石头的重量 II, 494.目标和,474.一和零

class Solution { public:int lastStoneWeightII(vector<int>& stones) {int sum 0;for(int stone : stones) sum stone;int bagSize sum /2;vector<int> dp(bagSize 1, 0);for(int i 0; i < stones.size(); i){ //遍历物品for(int j bagSize; j >…...

PDF 中图表的解析探究

PDF 中图表的解析探究 0. 引言1. 开源方案探究 0. 引言 一直以来&#xff0c;对文档中的图片和表格处理都非常有挑战性。这篇文章记录一下最近工作上在这块的探究。图表分为图片和表格&#xff0c;这篇文章主要记录了对表格的探究。还有&#xff0c;我个人主要做日本项目&…...

递推(C语言)

文章目录 1.斐波那契数列2.太波那契数列3.二维递推问题4.实战4.1 力扣509 斐波那契数4.2 力扣70 爬楼梯4.3 力扣119 杨辉三角|| 递推最通俗的理解就是数列&#xff0c;递推和数列的关系就好比 算法 和 数据结构 的关系&#xff0c;数列有点 像数据结构中的线性表(可以是顺序表&…...

安卓微信8.0之后如何利用缓存找回的三天之前不可见的朋友圈图片

安卓微信8.0之后如何利用缓存找回的三天之前不可见的朋友圈图片 复习了下安卓程序的知识&#xff0c;我们会了解到&#xff0c;安卓程序清楚数据的时候有两个选项 一个是清除全部数据一个是清除缓存。 清除全部数据表示清除应用数据缓存。 对于安卓微信8.0之后而言&#xff0…...

ES6 Class(类) 总结(九)

ES6 中的 class 是一种面向对象编程的语法糖&#xff0c;提供了一种简洁的方式来定义对象的结构和行为。 JavaScript 语言中&#xff0c;生成实例对象的传统方法是通过构造函数。下面是一个例子。 function Point(x, y) {this.x x;this.y y; } Point.prototype.toString fu…...

使用 Vue.js 和 Element Plus 实现自动完成搜索功能

使用 Vue.js 和 Element Plus 实现自动完成搜索功能 一、前言1.环境准备2.组件配置3.后端数据请求4.样式5.总结 一、前言 在前端开发中&#xff0c;实现自动完成&#xff08;autocomplete&#xff09;功能可以极大地提升用户体验&#xff0c;特别是在需要用户输入和选择内容的…...

SpringBoot自定义starter

SpringBoot自定义starter 1、SpringBoot之starter机制 1.1、什么是自定义starter ​ SpringBoot中的starter是一种非常重要的机制(自动化配置)&#xff0c;能够抛弃以前繁杂的配置&#xff0c;将其统一集成进starter&#xff0c;应用者只需要在maven中引入starter依赖&#…...

深入探索大语言模型

深入探索大语言模型 引言 大语言模型&#xff08;LLM&#xff09;是现代人工智能领域中最为重要的突破之一。这些模型在自然语言处理&#xff08;NLP&#xff09;任务中展示了惊人的能力&#xff0c;从文本生成到问答系统&#xff0c;无所不包。本文将从多个角度全面介绍大语…...

querylist多线程采集curlMulti时,报错Curl error(60)

前言 在使用querylist多线程采集的时候&#xff0c;报错: Curl error(60)。测试了下用http时没有问题&#xff0c;https时有问题。其原因在于多线程采集库引用的另一个库有问题。需要手动更改。 解决 找到&#xff1a;vendor/ares333/php-curl/src/Curl.php 文件&#xff0c…...

Python数据分析~~美食排行榜

目录 1.模块的导入和路径的选择 2.访问前面五行数据 3.按照条件进行筛选 4.获取店铺评分里面的最高分 5.打印对应的店铺的名字 1.模块的导入和路径的选择 # 导入pandas模块&#xff0c;简称为pd import pandas as pd # 使用read_csv()函数 # TODO 读取路径"/Users/fe…...