【Go语言从入门到精通系列-基础篇】Go语言包的管理以及基础语法与使用。

news2024/12/23 1:36:42

系列文章目录

【Go语言从入门到精通系列-基础篇】Go安装 + 语言特性,以及开启你人生中的第一个go程序
【Go语言从入门到精通系列-基础篇】Go语言包的管理以及基础语法与使用。


Go语言从入门到精通系列-基础篇

  • 系列文章目录
  • 前言
  • 第二章 Go语言包的管理以及基础语法与使用
    • 1.1 Go基础程序的理解
      • 1.1.1 包的声明
      • 1.1.2 Go语言包所具有的特性
      • 1.1.3 Go语言包的导入方式
      • 1.1.4 Go的多包导入与起别名
      • 1.1.5 main()函数讲解
    • 1.2 Go语言包管理(Go Mod)
      • 1.2.1 `GOPATH`和`GOROOT`
      • 1.2.2 vendor 与 govendor
      • 1.2.3 Go Mod
        • 1.2.3.1 go mod命令说明
        • 1.2.3.2 使用方法
    • 1.3 Go 语言基础语法规则使用
      • 1.3.1 基础语法
        • 1.3.1.1 Go语言标记
        • 1.3.1.2 行分隔符
        • 1.3.1.3 注释
        • 1.3.1.4 标识符
        • 1.3.1.5 字符串连接
        • 1.3.1.6 Go语言中的关键字
        • 1.3.1.7 Go语言的空格
  • 总结

前言


在这里插入图片描述

上一篇有学习到一个程序的输出,但是没有做详细的讲解,这一篇呢带大家共同学习Go 的基础语法,以及包管理的方式。


第二章 Go语言包的管理以及基础语法与使用

1.1 Go基础程序的理解

接上一章中我们一个程序可以看到,Go程序的结构非常简单,接下来我们对之前的代码进行简单的分析。

package main
import (
	"fmt"
)

func main()  {
	fmt.Printf("Hello World!")
}

1.1.1 包的声明

Go语言是以 “包” 作为程序项目的管理单位。如果想要正常运行源文件,则必须先声明它所属的包。也就是每一个源文件的开头必须都是一个 package声明,格式如下:

package ****

其中package是声明包名的关键字, ****表示包的名称。一般来讲Go的包与源文件所在文件夹有一一对应关系。

1.1.2 Go语言包所具有的特性

  • 包名可以与其目录名不同。
  • 一个目录下的同级文件属于同一个包。
  • main 包是Go语言的应用程序入口包。一个Go的程序只允许且必须有一个main 包(如果没有main包,则编译会报错无法生成可执行文件)。

1.1.3 Go语言包的导入方式

也就是说在我们声明包之后,如果需要调用其他的包的方法变量,则需要使用import语句。import语句用于导入程序中所依赖的包,导入时包名必须使用双引号,格式如下:

import "packageName"

而在第一章中我们使用 import "fmt" 导入了fmt包,这段代码会告诉编译器我们需要用到fmt包中的函数或变量等。

  • fmt: 它是Go语言为我们提供用于程序中的格式化输入与输出,方便我们的调试。

1.1.4 Go的多包导入与起别名

在我们实际的编写程序过程中肯定不止一个包,那么我们如何进行多包导入呢?可以使用import关键字同时导入多个包,当然需要配合我们的英文括号()将包的名称写入其中,并且每个包名独占一行,格式如下:

import (
	"fmt"
	"os"
)

也可以给导入的包名设置自定义别名,f 可以代替fmt使用,o 代替 os 使用。格式如下:

import (
	f "fmt"
	o "os"
)

当然Go导包时需要注意检查,在程序中未使用且被导入时,编译器会报报错,无法进行编译。那么我能否只导入不使用它呢?答案是可以的,我们只需要使用 _下划线来代替别名,编译器就允许我们只初始化这个包,而不使用包中的函数以及变量等。格式如下:

import (
	f "fmt"
	_ "os"
)

1.1.5 main()函数讲解

刚才也说了一个程序只能存在且必须要有一个main()函数作为程序的入口函数,否则无法编译,并且main()函数只能声明在main 包中 package mainmain()函数是我们的自定义函数的一种,在Go中声明一个函数必须以 func开头,格式定义如下:

func 函数名 (参数列表) (返回值列表) {
	函数体
}
  • func: 所有函数都必须以它开头。
  • 函数名:字母 下划线``数字 组成,其中名称开头不能数字开始,且同一个包内函数名称不能重复。
  • 参数列表: 一个参数由参数变量名和参数类型组成,例如:(name string, age int)
  • 返回值列表: 可以是参数变量名与类型组成,也可以只是参数变量名称,而函数当有返回值时必须使用return语句进行参数返回。
  • 函数体: 函数体是使用{}大括号括起来的,括号内编写我们函数的功能语句,它完成了一个函数的具体功能(注意: 左边{括号必须与函数名保持在同一行,不然会报错)。

1.2 Go语言包管理(Go Mod)

1.2.1 GOPATHGOROOT

  • GOROOT: 目的是为了告诉Go当前安装位置,编译时从GOROOT查找SDK的 system libariry(系统程序库),在windows使用更改环境变量方式进行自定义位置,Linux中使用export GOROOT=指定位置。
  • GOPATH: 必须被设置,也可以自定义,目的是为了告诉Go在需要代码时去哪里查找。当然这里的代码包含本项目代码与引用外部项目的代码。
    • GOPATH下有三个目录,上一章有提到过,分别是 src bin pkg

    src目录: Go编译时查找代码的地方。
    bin目录:Golang编译可执行文件存放路径。
    pkg目录:编译生成的lib文件存储的地方。

使用GOPATH问题的问题:

  1. 代码开发必须在go path src目录下,不然,就有问题。
  2. 依赖手动管理,依赖 ‘列表/关系’ 无法持久化到本地,需要找出所有依赖一个个获取。
  3. 依赖包没有版本可言,只能依赖全局仓库, 无法局部化分隔包管理。

1.2.2 vendor 与 govendor

Go在1.5版本引入了vendor 主要就是为了解决依赖GPATH解决go import存在的问题, 而govendor是在vendor之后开发的,不做过多的讲解,想了解的可以自行百度,今天主要将go mod。

  • govendor主要解决了包依赖,一个配置文件就能管理。
  • 依赖包全都下载到项目vendor下,每个项目都把有一份,缺陷也及其明显了。

1.2.3 Go Mod

Go 版本在1.12之后能支持一个包的管理,不在依赖于GOPATH的设置,可以直接使用下载的包。
在我们使用go env时,输出的第一位置参数GO111MODULE它有三个值:off on auto (默认值)

  • GO111MODULE=off :Go命令行将不在支持module功能,寻找依赖的方式将沿用旧版本,及通过vendorGOPATH模式来查找。

  • GO111MODULE=on :Go命令行将使用modules,不会去GOPATH 目录下查寻。

  • GO111MODULE=auto:默认值,Go命令行将根据当前目录觉得是否启用module功能。

    • 当前目录在GOPATH/src之外且该目录包含go.mod文件。
    • 当前文件在包含go.mod文件的目录下。

当modules功能启用时,依赖包的存放位置变更为GOPATH/pkg,允许同一个package多个版本并存,且多个项目可以共享缓存的 module。

1.2.3.1 go mod命令说明

go mod help

在这里插入图片描述

命令详解
download下载依赖包
edit编译go.mod
graph打印模块依赖图
init在当前目录下初始化mod
tidy拉去缺少的依赖,移除不需要的模块
vendor将依赖复制到vendor下
verify验证依赖是否正确
why解释为什么需要依赖

1.2.3.2 使用方法

新建一个工程为 test,使用 go mod init test 就会在当前目录下产生一个go.mod文件,一旦go.mod文件被创建,它的内容就会被go toolchain 全面掌控。也就是将当存在各类命令执行时,比如 go get go build,go mod等执行时,它会去维护或修改go.mod文件,而在我们的go mod 中我们的常用命令就只有几个 init tidy edit


go mod提供了四个参数释义:

  • module 语句指定包的名字(路径)
  • require 语句指定的依赖项模块
  • replace 语句可以替换依赖项模块
  • exclude 语句可以忽略依赖项模块

开启modules 的前置条件是, GO111MODULE设置等于on, 命令如下:

go env -w GO111MODULE=on

也就是将当我们设置好后,使用go run hello_world.go运行代码时,如果缺少依赖包go mod会自动查找依赖下载,再次执行时会跳过检查并安装依赖的步骤。可以使用go list -m -u all来检查可以升级的package,使用 go get -u need-upgrade-package来升级后将新的依赖更新到go mod,也可以使用go get -u 升级所有依赖。

1.3 Go 语言基础语法规则使用

1.3.1 基础语法

1.3.1.1 Go语言标记

Go程序由 关键字 标识符 常量 字符串 符号等多种标记组成。例如我们第一个程序中的 fmt.Println(“Hello World!”) 是由6中标记组成:
在这里插入图片描述

1.3.1.2 行分隔符

在Go语言程序中,一般来讲一行就是一个语句,不用像Java,PHP等其他的语言那样需要在一行结尾使用;分号,因为这些工作都是由Go编译器自动完成,但是如果多个语句在同一行则必须使用分号将它们隔开,但是在实际的开发中不建议如此写法。例如:

fmt.Println("Hello World!")
fmt.Println("Hello Go!")

这则是两个语句,写在一行确实有些牵强了。

1.3.1.3 注释

在Go语言中,注释分为单行注释多行注释
(1)单行注释 是以双斜线//开头的。 可以在人格地方使用,格式如下:

// 输入语句
fmt.Println("Hello World!")

(2)多行注释 通常被称为块注释, 是以 “/*”开头,“*/”结尾。格式如下:

/*
这里是多行注释
这里是多行注释
*/
fmt.Println("Hello World!")

1.3.1.4 标识符

标识符通常用来对变量,类型等程序实体进行命名。一个标识符实际上就是一个或者多个字母,数字, 下划线组成的字符串序列。格式如下:

name user age user_id _tmp name01 c ...

以上呢是正确的命名方式,之前讲到过错误的方式, 例如:

1_name back-name switch

也就是不能以数字开头,不能带其他符号,不能以关键字命名。

1.3.1.5 字符串连接

Go 语言的字符可以通过 +加号的方式实现字符串连接,格式如下:

package main
import (
	"fmt"
)

func main()  {
	str1 := "Hello"
	str2 := " World!"
	fmt.Printf(str1 + str2)
}
// 结果: Hello World!

1.3.1.6 Go语言中的关键字

上面讲了不能使用关键字命名,那么Go语言中有25个关键字或保留字,见下表:

关键字释义
continue跳过
for循环
import导入依赖
return返回
var声明变量
const声明常量
fallthrough如果case带有fallthrough,程序会继续执行下一条case,不会再判断下一条case的值
if判断语句
ranage从slice、map等结构中取元素
type定义类型
chan定义一个channel
else用在条件语句中,表明当条件不成立时的分支
goto跳转语句
package声明包
switch分支语句结构的引导词
case分支语句结构的引导词
defer延迟执行,函数的收尾工作。在函数结束前执行
go并发
mapmap结构类型
struct定义结构体
break提前跳出一个块
default默认选项,用在switch和select语句种
func函数定义
interface定义接口
selectgo语言特有的channel选择结构

除了以上几种,最新版的Go语言中有30几种保留字标识符,他们可以分为以下三类:

  • 常量相关:true,false,iota,nil。
  • 类型相关:int,int8,int16,int32,int64,uint,uint8,uint16,uint32,uint64,uintptr,float,float32,float64,complex128,complex64,bool,byte,rune,string,error。
  • 函数相关:make,len,cap,new,append,copy,delete,complex,real,imag,panic,recover。

1.3.1.7 Go语言的空格

在Go语言中,变量声明必须使用空格隔开,如下:


var name string

在函数体中,适当的使用空格来让代码易读且更加直观 如:

name=surname+li

相比加入空格

name = surname + li

一般在开发过程中我们都会使用编辑器的格式化命令来快速进行格式化。

总结


如果没有躺赢的命那就站起来奔跑,我们兵分两路,顶峰相见。

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

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

相关文章

zabbix介绍 | 监控搭建和部署

zabbix介绍 | 监控搭建和部署一.Zabbix简介二.Zabbix监控原理三.Zabbix监控的最常见五个程序组件四,搭建zbx监控4.1准备二台虚拟机4.2 服务端客户端获取 zabbix 的下载源4.3 服务端安装修改 192.168.10.104.4 服务端安装 zabbix 所需的数据库(192.168.10…

点监督的实例分割

目录Pointly-Supervised Instance Segmentation摘要方法Annotation format and collection训练点标记模型实验结果Pointly-Supervised Instance Segmentation 摘要 点注释来进行实例分割的弱监督标签除了边界框还有一组随机点对PointRend实例分割模块的修改对于每个对象&…

2020年 团体程序设计天梯赛——题解集

Hello各位童学大家好!😊😊,茫茫题海你我相遇即是缘分呐,或许日复一日的刷题已经让你感到疲惫甚至厌倦了,但是我们真的真的已经达到了我们自身极限了吗?少一点自我感动,没有结果前别太…

Python爬虫基础之如何对爬取到的数据进行解析

目录1. 前言2. Xpath2.1 插件/库安装2.2 基础使用2.3 Xpath表达式2.4 案例演示2.4.1 某度网站案例3. JsonPath3.1 库安装3.2 基础使用3.2 JsonPath表达式3.3 案例演示4. BeautifulSoup4.1 库安装4.2 基础使用4.3 常见方法4.4 案例演示参考文献原文地址:https://www.…

OpenCV实例(二)手势识别

OpenCV实例(二)手势识别1.手势识别概述1.1.获取轮廓的凸包1.2.凸缺陷1.3.凸缺陷占凸包面积比2.手势识别过程2.1.识别流程3.石头、剪刀、布的识别作者:Xiou 1.手势识别概述 手势识别的范围很广泛,在不同场景下,有不同…

tp5实现导入excel表到数据库

hello,大家好,好长时间没有更新文章了。最近一直在忙着做项目。所以断更了。 那么好,各位老铁是否想要实现导入导出的功能 请关注我,解密如何实现导入导出, 那么今天先来讲一下用thinkphp5.0 如何实现Excel表格导入数据…

如何实现 Java SpringBoot 自动验证入参数据的有效性

Java SpringBoot 通过javax.validation.constraints下的注解,实现入参数据自动验证 如果碰到 NotEmpty 否则不生效,注意看下 RequestBody 前面是否加上了Valid Validation常用注解汇总 Constraint详细信息Null被注释的元素必须为 nullNotNull被注释的元…

CentOS7.6 磁盘挂载

CentOS7.6 磁盘挂载 目录CentOS7.6 磁盘挂载1.磁盘说明2.磁盘分区步骤1.磁盘说明 1、Linux硬盘分IDE硬盘和SCSI硬盘,目前基本上是SCSI硬盘 2、对于IDE硬盘,驱动器标识符为"hdx",""代表分区,前四个分区用数字…

selenium1—软件测试

文章目录1.什么是自动化测试2.如何实施自动化测试3.UI自动化测试的好处4.自动化框架5.为什么要选择selenium6.webdrive的原理7.selenium IDE1.什么是自动化测试 在预设的条件下(自动化脚本)运行系统,预设的条件包括正常的和异常的情况&#…

BGP反射器与联邦实验

基础配置 display ip interface brief Interface IP Address/Mask Physical Protocol GigabitEthernet0/0/0 12.0.0.2/24 up up GigabitEthernet0/0/1 172.16.1.1/29 up up GigabitEthernet0/0/2 172.16.1.9/29 up up LoopBack0 172.16.2.1/24 up up(s) NULL0 unassigned up u…

AI 工具 22个使用场景、500个通用提问技巧说明

✏️ 「提问技巧—重点摘要」 「写作」:AI写作提问技巧 「制作视频」:AI制作视频创意提问相关技巧 【制定商业策略】:AI为各行各业制定商业策略提问技巧 【写邮件】:AI写邮件提问技巧 【框架方法论写内容】:AI利用…

【云原生概念和技术】1.1 云原生的概述

如果想了解或者学习云原生的友友们,欢迎订阅哦~🤗,目前一周三更,努力码字中🧑‍💻…目前第一章是一些介绍和概念性的知识,可以先在脑海里有一个知识的轮廓,从第二章开始就…

Caffe

目录 1、简述 2、项目起源 3、架构设计 4、极智AI相关内容 1、简述 Caffe(全称Convolutional Architecture for Fast Feature Embedding)是一个兼具表达性、速度和思维模块化的深度学习框架,由伯克利人工智能研究小组和伯克…

小红书热词速看 | 古茗有何营销动作?

【导语】 据古茗官方数据,新系列推出当日即售空,单店最高出杯420杯,最快24小时内卖断货;上架3天,销量突破100万杯;10天,就售出了343万杯,其中2款牛油果奶昔用掉了40万斤牛油果&…

Hadoop完全分布式运行模式配置(开发重点)

目录 Hadoop是一个海量数据存储和计算的框架 Hadoop优点: 3.2 完全分布式运行模式(开发重点) 3.2.1 虚拟机准备 3.2.2 编写集群分发脚本xsync 3.2.3 SSH无密登录配置 3.2.4 集群配置 3.2.5 群起集群 3.2.6 配置历史服务器 3.2.7 配…

SpringBoot【运维实用篇】---- SpringBoot程序的打包与运行

SpringBoot【运维实用篇】---- SpringBoot程序的打包与运行程序打包程序运行SpringBoot程序打包失败处理命令行启动常见问题及解决方案刚开始做开发学习的小伙伴可能在有一个知识上面有错误的认知,我们天天写程序是在Idea下写的,运行也是在Idea下运行的。…

【从零开始学Skynet】基础篇(七):Mysql数据库常用API

在上一篇中我们完成了对Mysql数据库的准备工作之后,这一篇我们写一个程序测试一下。 1、Mysql API 在写程序之前,我们先学习一下Mysql数据库常用API的使用: API说明mysql.connet(args)连接数据库,参数args是一个Lua表&#xff0c…

责任链设计模式(Chain of Responsibility Pattern)[论点:概念、组成角色、图示、相关代码、框架中的运用、适用场景]

文章目录概念组成角色相关图示示例代码框架中的应用适用场景:概念 责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,其主要目的是将请求的发送者和接收者解耦。这种模式创建了一系列处理器对象,每个处…

Shell Script

目录Shell Script的概述Shell的主要版本Shell脚本的建立与执行Shell中的变量Shell中的特殊字符通配符双引号倒引号()顺序分隔符(;)管道符逻辑与(&&)和逻辑或(||)…

synchronized原理详解

众所周知,使用多线程可以极大地提升程序的性能,但如果多线程使用不合理,也会带来很多不可控的问题,例如线程安全问题。 什么是线程安全问题呢?如果多个线程同时访问某个方法时,这个方法无法得到我们预期的…