(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 归属到mainimport "fmt" // 引入一个包 fmtfunc main() {// 打印fmt.Println("see,is\n","go!")
}

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

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

4.2 匿名导入

package mainimport _ "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.gofoo/                   (go code in package foo)f.gobar/               (go code in package bar)x.gointernal/baz/           (go code in package baz)z.goquux/              (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. 😍前篇知识回顾

  • Go的环境安装与开发工具配置

9. 💕👉 其他好文推荐

  • 还不了解Git分布式版本控制器?本文将带你全面了解并掌握
  • 带你认识Maven的依赖、继承和聚合都是什么!有什么用?
  • 2-3树思想与红黑树的实现与基本原理
  • !全网最全! ElasticSearch8.7 搭配 SpringDataElasticSearch5.1 的使用
  • 全面深入Java GC!!带你完全了解 GC垃圾回收机制!!
  • 全面了解Java的内存模型(JMM)!详细清晰!
  • 在JVM中,类是如何被加载的呢?本篇文章就带你认识类加载的一套流程!

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

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

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

相关文章

CSS教程(八)- 盒子模型

1、介绍 核心内容 盒子模型、浮动和定位,帮助我们实现页面布局 本质:页面布局过程 准备好相关的页面元素,网页元素基本都是盒子 Box 利用 CSS 设置盒子的样式,摆放到相应的位置 向盒子中填充相应内容 网页布局的核心本质&…

数据结构——二叉树和BST

树与二叉树 基本概念 树是一种非线性结构,其严格的数学定义是:如果一组数据中除了第一个节点(第一个节点称为根节点,没有直接前驱节点)之外,其余任意节点有且仅有一个直接前驱,有零个或多个直接…

常用机器人算法原理介绍

一、引言 随着科技的不断发展,机器人技术在各个领域得到了广泛应用。机器人算法是机器人实现各种功能的核心,它决定了机器人的行为和性能。本文将介绍几种常用的机器人算法原理,包括路径规划算法、定位算法和运动控制算法。 二、路径规划算法…

C语言 | Leetcode C语言题解之第542题01矩阵

题目: 题解: /*** Return an array of arrays of size *returnSize.* The sizes of the arrays are returned as *returnColumnSizes array.* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().*/ type…

一文了解珈和科技在农业遥感领域的服务内容和能力

2020年,农业农村部、中央网信办联合印发了《数字农业农村发展规划(2019-2025年)》,对数字农业农村建设作出了具体部署。其中,农业遥感作为推进数字农业农村的重要力量贯穿《规划》始终。 今年10月,农业农村…

隧道论文阅读2-采用无人融合扫描数据的基于深度学习的垂直型隧道三维数字损伤图

目前存在的问题: 需要开发新的无人测量系统测量垂直隧道图像数据量巨大,基于深度学习完成损伤评估跟踪获取图像位置的困难,对大型基础设施感兴趣区域(roi)的2d和3d地图建立进行了研究,对整个目标结构的损伤定位仍然具有挑战性。为…

HCIP-HarmonyOS Application Developer V1.0 笔记(五)

弹窗功能 prompt模块来调用系统弹窗API进行弹窗制作。 当前支持3种弹窗API,分别为: 文本弹窗,prompt.showToast;对话框,prompt.showDialog;操作菜单,prompt.showActionMenu。 要使用弹窗功能&…

《深入浅出Apache Spark》系列③:Spark SQL解析层优化策略与案例解析

导读:本系列是Spark系列分享的第三期。第一期分享了Spark Core的一些基本原理和一些基本概念,包括一些核心组件。Spark的所有组件都围绕Spark Core来运转,其中最活跃的一个上层组件是Spark SQL。第二期分享则专门介绍了Spark SQL的基本架构和…

Linux应用——线程池

1. 线程池要求 我们创建线程池的目的本质上是用空间换取时间,而我们选择于 C 的类内包装原生线程库的形式来创建,其具体实行逻辑如图 可以看到,整个线程池其实就是一个大型的 CP 模型,接下来我们来完成它 2. 整体模板 #pragma …

算法每日双题精讲——滑动窗口(长度最小的子数组,无重复字符的最长子串)

🌟快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区。 🌟 别再犹豫了!快来订阅我们的算法每日双题精讲专栏,一起踏上算法学习的精彩之旅吧!💪…

HiveSQL 中判断字段是否包含某个值的方法

HiveSQL 中判断字段是否包含某个值的方法 在 HiveSQL 中,有时我们需要判断一个字段是否包含某个特定的值。下面将介绍几种常用的方法来实现这个功能。 一、创建示例表并插入数据 首先,我们创建一个名为employee的表,并插入一些示例数据&am…

vue2 - el-table表格设置动态修改表头

效果 代码 <template><el-card><!-- 搜索栏 --><Search :query

MySQL 8.0的Public Key Retrival问题解决

一、导致“Public Key Retrieval is not allowed”原因 该错误是在 JDBC 与 MySQL 建立 Connection 对象时出现的&#xff1b;需要明确的是出现该问题的时候&#xff0c;MySQL 配置的密码认证插件为如下两种&#xff1a; sha256_passwordcaching_sha2_password 使用“mysql_…

sed超实用的文本处理工具

sed命令参数表 sed参数说明a在指定行的后面增加新航c替换指定行d删除行-e多次编辑&#xff0c;多次编辑后这样写回文件。sed -i -e /^[[:space:]]*#/d -e /^$/d nginx.confp打印行-r激活拓展正则-n取消默认输出-i静默编辑&#xff0c;屏幕上不显示编辑后的内容&#xff0c;放在…

GPU 环境搭建指南:如何在裸机、Docker、K8s 等环境中使用 GPU

本文主要分享在不同环境&#xff0c;例如裸机、Docker 和 Kubernetes 等环境中如何使用 GPU。 跳转阅读原文&#xff1a;GPU 环境搭建指南&#xff1a;如何在裸机、Docker、K8s 等环境中使用 GPU 1. 概述 仅以比较常见的 NVIDIA GPU 举例&#xff0c;系统为 Linux&#xff0c;…

Vue中父组件通过v-model向子组件传对象参数

描述&#xff1a; Vue中父组件通过v-model向子组件传递一个对象&#xff0c;在子组件实现一个能够对object key-value进行编辑的组件封装。 父组件文件 <form-child v-model"configMap"></form-child>import formChild from /components/formchild.vue i…

mysql数据同步到sql server

准备工作 下载安装sql server express 2019 现在安装SSMS(连接数据库GUI) 安装ssms for mysql 需要注意的是在上面的步骤中首先需要根据指导安装mysql ODBC 设置express sa用户密码登录 --change password for login user "sa"Security > Logins > sa (rig…

如何解决企业业务流程分散的痛点

企业面临的一个普遍问题是业务流程的分散。业务流程分散不仅使得工作效率大幅下降&#xff0c;还增加了出错的风险&#xff0c;影响了企业的整体运营效率。因此&#xff0c;解决这一问题成为了许多企业亟需面对的挑战。 业务流程分散的原因 业务流程分散的根本原因&#xff0…

融入模糊规则的宽度神经网络结构

融入模糊规则的宽度神经网络结构 论文概述创新点及贡献 算法流程讲解模糊规则生成映射节点生成输出预测结果 核心代码复现main.py文件FBLS.py文件 使用方法测试结果示例&#xff1a;使用公开数据集进行本地训练准备数据数据输入模型进行训练实验结果 环境配置资源获取 本文所涉…

SQL常见语法

select * from student; select&#xff1a;选取 from&#xff1a;来源 *&#xff1a;所有栏位 select 姓名&#xff0c;班级&#xff0c;成绩 from students; 选取特定栏位 select 姓名&#xff0c;班级&#xff0c;成绩 from students limit 5;--限制显示拦数 select 姓…