【Golang】(1)Go的运行流程步骤与包的概念

本文涉及的产品
应用实时监控服务-可观测链路OpenTelemetry版,每月50GB免费额度
可观测可视化 Grafana 版,10个用户账号 1个月
应用实时监控服务-应用监控,每月50GB免费额度
简介: 初次上手Go语言!先来了解它的运行流程吧!在Go中对包的概念又有怎样不同的见解呢?

1. 快速入门

所有的go开发,都必须存在并包含在某一个包内

.go 是go语言程序的后缀名

1.1 编译

通过使用 go build 命令对该go文件进行编译,生成.exe文件

1.2 运行

运行刚刚生成出来的test.exe文件既可,不过并不不是双击,而是在命令行中执行这个文件

你也可以不通过编译命令,直接运行,使用 go run 命令即可

但是在工作环境中,流程上还是必须要先编译,再运行

go run 命令,其实并没有跳过编译这个步骤

编译的步骤其实只是被隐藏了起来,没有创建出 **.exe这个文件 。

在底层中已经帮你完成了go build命令

2. 执行流程

  • 如果是对源码编译后,再执行,Go的执行流程则是上图中上侧的流程
  • 而如果是对源码直接执行 go run 源码,Go的执行流程则是上图中下侧的流程

区别:

  1. 如果我们先编译生成了可执行文件,那么我们可以将该可执行文件拷贝到没有Go开发环境的机器上,仍然可以运行
  2. 如果我们直接 go run go源代码,那么如果要在另外的一个机器上这么运行,也需要go开发环境,否则无法执行
  3. 在编译时,编译器会将程序运行依赖的库文件包含在可执行文件中,所以可执行文件变大了很多

3. 编译和运行的注意事项

  • 有了Go源文件,通过编译器将其编译成机器可以识别的二进制文件
  • 在该源文件目录下,通过go build 对 源文件 进行编译,可以指定生成的可执行文件名,在windows下必须是 .exe后缀
go build -o 指定的文件名+后缀名 源代码名称+后缀名
  • 如果程序没有错误,没有任何提示,会在当前目录下出现一个可执行文件
    (windows下是.exe,linux下是一个可执行文件),该文件是二进制文件,也是可以被执行的程序
  • 如果程序有错误,在编译时,会在错误的那行报错

3.1 开发注意事项

  1. Go源文件以“go”为扩展名
  2. Go应用程序的执行入口是main()函数
  3. Go语言严格区分大小写
  4. Go方法由一条条语句构成,每个语句后不需要分号(Go语言会在每行后自动加分号),这也体现出Golang的简洁性
  5. Go编译器是一行行进行编译的,因此我们一行就写一条语句,不能把多条语句写在同一个,否则报错
  6. Go语言定义的变量或import的包如果没有使用到,带吧不能够编译通过
  7. 大括号都是成对出现的,缺一不可

关于注释:在go语言中,更加推荐行注释,而不是块注释

4. 导入

4.1 直接导入

package main // 把这个test.go 归属到main
import "fmt" // 引入一个包 fmt
func main() {
  // 打印
  fmt.Println("see,is\n",
    "go!")
}

使用import "包名"进行导入包名,在go中,所有的显式导入操作最好都要使用它。

在这个例子中,导入了“fmt”包,使用了该包下的Println方法。

4.2 匿名导入

package main
import _ "fmt" // 匿名导入
func main() {
}

如果只导入不调用,通常这么做是为了调用该包下的 init 函数

我们只需在导入包的前面加上**下划线_**就说明了该包是以匿名状态导入 import _ "包名"

4.3 批量导入

package main
// 批量导入
import (
  "fmt"
  _ "fmt"
  "math"
)
func main() {
  fmt.Println(math.Abs(15))
}

使用括号,可以达到批量导入包的效果,当然,多行import引入包也是没问题的。

注意细节,匿名导入的包没有进行使用方法的权力,该例在调用Println方法时,重新再显式引入了一次fmt包

4.4 导入注意事项

在Go中,是严禁循环导入的。

不管是直接的还是间接的导入都是不允许的。

例如:

  • A导入了B,同时B也导入了A,那么这种就是直接循环导入
  • A导入了B,B导入了C,C导入了A,这种就是间接循环导入

在Go中存在循环导入的问题,将会无法通过编译

5. 导出

在Go中想暴露某个类,没有public和private这种对于方法或类的定义。

导出和访问控制都是通过命名来进行实现的。如果想要对外暴露一个函数或者一个变量,只需要将其名称首字母大写即可,例如该例子中的Test方法

package main
// 方法名首字母大写:可以被包外访问
func Test() string {
  return "this is test...."
}

如果不想被访问,设置为私有的。那么将方法名设置为小写的即可

package main
// 方法名首字母小写:不可以被包外访问
func test() string {
  return "this is test...."
}

对外暴露的函数和变量可以被包外的调用者导入和访问,如果是不对外暴露的话,那么仅包内的调用者可以访问,外部将无法导入和访问,该规则适用于整个Go语言,例如后续会学到的结构体及其字段,方法,自定义类型,接口等等。

6. 内部包

go中约定,一个包内名为internal 包为内部包,外部包将无法访问内部包中的任何内容,否则的话编译不通过,下面看一个例子。

/home/user/go/
    src/
        crash/
            bang/              (go code in package bang)
                b.go
        foo/                   (go code in package foo)
            f.go
            bar/               (go code in package bar)
                x.go
            internal/
                baz/           (go code in package baz)
                    z.go
            quux/              (go code in package main)
                y.go

由文件结构中可知,crash包无法访问baz包中的类型。

7. 标识符

标识符就是一个名称,用于包命名,函数命名,变量命名等等,命名规则如下:

  • 只能由字母,数字,下划线组成
  • 只能以字母和下划线开头
  • 严格区分大小写
  • 不能与任何已存在的标识符重复,即包内唯一的存在
  • 不能与Go任何内置的关键字冲突
break        default      func         interface    select
case         defer        go           map          struct
chan         else         goto         package      switch
const        fallthrough  if           range        type
continue     for          import       return       var

其实,大部分的关键字的规则都基本一直

除了几个陌生的关键字:fallthrough、select、struct、range、defer…

8. 😍前篇知识回顾

9. 💕👉 其他好文推荐

全文资料学习全部参考于:Golang中文学习文档

目录
相关文章
|
11天前
|
存储 关系型数据库 分布式数据库
PostgreSQL 18 发布,快来 PolarDB 尝鲜!
PostgreSQL 18 发布,PolarDB for PostgreSQL 全面兼容。新版本支持异步I/O、UUIDv7、虚拟生成列、逻辑复制增强及OAuth认证,显著提升性能与安全。PolarDB-PG 18 支持存算分离架构,融合海量弹性存储与极致计算性能,搭配丰富插件生态,为企业提供高效、稳定、灵活的云数据库解决方案,助力企业数字化转型如虎添翼!
|
10天前
|
存储 人工智能 搜索推荐
终身学习型智能体
当前人工智能前沿研究的一个重要方向:构建能够自主学习、调用工具、积累经验的小型智能体(Agent)。 我们可以称这种系统为“终身学习型智能体”或“自适应认知代理”。它的设计理念就是: 不靠庞大的内置知识取胜,而是依靠高效的推理能力 + 动态获取知识的能力 + 经验积累机制。
356 131
|
10天前
|
存储 人工智能 Java
AI 超级智能体全栈项目阶段二:Prompt 优化技巧与学术分析 AI 应用开发实现上下文联系多轮对话
本文讲解 Prompt 基本概念与 10 个优化技巧,结合学术分析 AI 应用的需求分析、设计方案,介绍 Spring AI 中 ChatClient 及 Advisors 的使用。
443 131
AI 超级智能体全栈项目阶段二:Prompt 优化技巧与学术分析 AI 应用开发实现上下文联系多轮对话
|
4天前
|
存储 安全 前端开发
如何将加密和解密函数应用到实际项目中?
如何将加密和解密函数应用到实际项目中?
206 138
|
10天前
|
人工智能 Java API
AI 超级智能体全栈项目阶段一:AI大模型概述、选型、项目初始化以及基于阿里云灵积模型 Qwen-Plus实现模型接入四种方式(SDK/HTTP/SpringAI/langchain4j)
本文介绍AI大模型的核心概念、分类及开发者学习路径,重点讲解如何选择与接入大模型。项目基于Spring Boot,使用阿里云灵积模型(Qwen-Plus),对比SDK、HTTP、Spring AI和LangChain4j四种接入方式,助力开发者高效构建AI应用。
405 122
AI 超级智能体全栈项目阶段一:AI大模型概述、选型、项目初始化以及基于阿里云灵积模型 Qwen-Plus实现模型接入四种方式(SDK/HTTP/SpringAI/langchain4j)
|
4天前
|
存储 JSON 安全
加密和解密函数的具体实现代码
加密和解密函数的具体实现代码
204 136
|
22天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1363 8
|
9天前
|
监控 JavaScript Java
基于大模型技术的反欺诈知识问答系统
随着互联网与金融科技发展,网络欺诈频发,构建高效反欺诈平台成为迫切需求。本文基于Java、Vue.js、Spring Boot与MySQL技术,设计实现集欺诈识别、宣传教育、用户互动于一体的反欺诈系统,提升公众防范意识,助力企业合规与用户权益保护。

热门文章

最新文章