【go从入门到精通】go包,内置类型和初始化顺序

        大家好,这是我给大家准备的新的一期专栏,专门讲golang,从入门到精通各种框架和中间件,工具类库,希望对go有兴趣的同学可以订阅此专栏。

go基础 。

Go文件名:

      所有的go源码都是以 ".go" 结尾,不过我们有时候为了支持多平台,多版本,或者在不同的平台,CPU下做不同的逻辑处理,我们对go的文件名的命名方式又有一些要求:

1、平台区分
文件名_平台。
例: file_windows.go, file_unix.go
可选为:windows, unix, posix, android, bsd, solaris, linux等

2、测试单元
文件名test.go或者 文件名平台_test.go。
例: path_test.go, path_windows_test.go

3、版本区分(猜测)
文件名_版本号等。
例:point_windows_1.4.go

4、CPU类型区分, 汇编用的多
文件名_(平台:可选)_CPU类型.
例:point_linux_amd64.go
可选:amd64, none, 386, arm, arm64, x86等。

Go语言命名和关键字 

1.Go的函数、变量、常量、自定义类型、包(package)的命名方式遵循以下规则:

    1)首字符可以是任意的Unicode字符或者下划线2)剩余字符可以是Unicode字符、下划线、数字3)字符长度不限

2.Go只有25个关键字

    break        default      func         interface    selectcase         defer        go           map          structchan         else         goto         package      switchconst        fallthrough  if           range        typecontinue     for          import       return       var

3.Go还有37个保留字

    Constants:    true  false  iota  nilTypes:    int  int8  int16  int32  int64  uint  uint8  uint16  uint32  uint64  uintptrfloat32  float64  complex128  complex64bool  byte  rune  string  errorFunctions:   make  len  cap  new  append  copy  close  deletecomplex  real  imagpanic  recover

Go语言声明:

go有四种主要声明方式:

    var(声明变量), const(声明常量), type(声明类型) ,func(声明函数)。

Go的程序是保存在多个.go文件中,文件的第一行就是 package(包名) 声明,用来说明该文件属于哪个包(package),package声明下来就是import声明,再下来是类型,变量,常量,函数的声明。

        go是使用包来组织源代码的,包是多个go源码的集合,是一种高级的代码复用方案。golang为我们提供了很多内置的包,如 fmt、os、io 等。

        任何源代码文件必须属于某个包,同时源码文件的第一行有效代码必须是package pacakgeName 语句,通过该语句声明自己所在的包。

         正如我们上一篇文章写的最简单的hello world程序输出一样:

package mainimport "fmt"
func main(){fmt.Println("hello world")
}

         我们在文件的最开始是通过package  main的方式来说明该文件属于main包,接下来我们需要知道包是什么,怎么使用它(其实学过java,或者python等语言的对包的概念和使用并不陌生)

包的基本概念

        Go 的包借助了目录树组织形式,一般包的名称就是其源文件所在的目录,虽然Go语言没有强制要求包名必须和其所在的目录名同名,但还是建议包名和所在目录同名,这样结构更清晰。

包可以定义在很深的目录中,包名的定义是不包括目录路径的,但是包在引用时一般使用全路径引用。比如在GOPATH/src/a/b/ 下定义一个包 c。在包 c 的源码中只需声明为package c,而不是声明为package a/b/c,但是在导入 c 包时,需要带上路径,例如import “a/b/c”。

包的习惯用法:

  • 包名一般是小写的,使用一个简短且有意义的名称。
  • 包名一般要和所在的目录同名,也可以不同,包名中不能包含- 等特殊符号。
  • 包一般使用域名作为目录名称,这样能保证包名的唯一性,比如 GitHub 项目的包一般会放到GOPATH/src/github.com/userName/projectName 目录下。
  • 包名为 main 的包为应用程序的入口包,编译不包含 main 包的源码文件时不会得到可执行文件。
  • 一个文件夹下的所有源码文件只能属于同一个包,同样属于同一个包的源码文件不能放在多个文件夹下。

包的导入

要在代码中引用其他包的内容,需要使用 import 导入使用的包。具体语法如下:

import "包的路径"

注意事项:

  • import 导入语句通常放在源码文件开头包声明语句的下面;
  • 导入的包名需要使用双引号包裹起来;
  • 包名是从GOPATH/src/ 后开始计算的,使用/ 进行路径分隔。

包的导入有两种写法,分别是单行导入和多行导入。

单行导入

import "package1"
import "package2"

多行导入

import ("package1""package2"
)

在使用习惯和代码的可读性上,我们都习惯于使用多行导入更方便于我们管理使用。 

包的导入路径

包的引用路径有两种写法,分别是全路径导入和相对路径导入

包的引用格式

包的引用有四种格式,下面以 fmt 包为例来分别演示一下这四种格式。

1) 标准引用格式

import "fmt"

此时可以用fmt.作为前缀来使用 fmt 包中的方法,这是常用的一种方式。

示例代码如下:

package main
import "fmt"
func main() {fmt.Println("Hello world")
}

2) 自定义别名引用格式

在导入包的时候,我们还可以为导入的包设置别名,如下所示:

import F "fmt"

 其中 F 就是 fmt 包的别名,使用时我们可以使用F.来代替标准引用格式的fmt.来作为前缀使用 fmt 包中的方法。

示例代码如下:

package main
import F "fmt"
func main() {F.Println("Hello world")
}

3) 省略引用格式

import . "fmt"

这种格式相当于把 fmt 包直接合并到当前程序中,在使用 fmt 包内的方法是可以不用加前缀fmt.,直接引用。

示例代码如下:

package main
import . "fmt"
func main() { Println("Hello world")
}

4) 匿名引用格式

在引用某个包时,如果只是希望执行包初始化的 init 函数,而不使用包内部的数据时,可以使用匿名引用格式,如下所示:

import _ "fmt"

匿名导入的包与其他方式导入的包一样都会被编译到可执行文件中。

使用标准格式引用包,但是代码中却没有使用包,编译器会报错。如果包中有 init 初始化函数,则通过import _ “包的路径” 这种方式引用包,仅执行包的初始化函数,即使包没有 init 初始化函数,也不会引发编译器报错。

示例代码如下:

package main
import (_ "github.com/astaxie/beego""fmt"
)
func main() {fmt.Println("Hello world")
}

注意:

  • 一个包可以有多个 init 函数,包加载时会执行全部的 init 函数,但并不能保证执行顺序,所以不建议在一个包中放入多个 init 函数,将需要初始化的逻辑放到一个 init 函数里面。
  • 包不能出现环形引用的情况,比如包 a 引用了包 b,包 b 引用了包 c,如果包 c 又引用了包 a,则编译不能通过。
  • 包的重复引用是允许的,比如包 a 引用了包 b 和包 c,包 b 和包 c 都引用了包 d。这种场景相当于重复引用了 d,这种情况是允许的,并且 Go 编译器保证包 d 的 init 函数只会执行一次。

 这块大家可以多练习练习尝试下,凡是和语言相关的知识在初步学习过程中要不断地练习和尝试,就会有不一样的角度的理解。

包的初始化顺序

在分享包的初始化顺序之前,有必要了解下init函数和main函数, 

init函数

go语言中init函数用于包(package)的初始化,该函数是go语言的一个重要特性。

有下面的特征:

    1 init函数是用于程序执行前做包的初始化的函数,比如初始化包里的变量等2 每个包可以拥有多个init函数3 包的每个源文件也可以拥有多个init函数4 同一个包中多个init函数的执行顺序go语言没有明确的定义(说明)5 不同包的init函数按照包导入的依赖关系决定该初始化函数的执行顺序6 init函数不能被其他函数调用,而是在main函数执行之前,自动被调用

main函数

   Go语言程序的默认入口函数(主函数):func main()
    函数体用{}一对括号包裹。

func main(){//函数体}

init函数和main函数的异同

    相同点:两个函数在定义时不能有任何的参数和返回值,且Go程序自动调用。不同点:init可以应用于任意包中,且可以重复定义多个。main函数只能用于main包中,且只能定义一个。

两个函数的执行顺序:

对同一个go文件的init()调用顺序是从上到下的。

对同一个package中不同文件是按文件名字符串比较“从小到大”顺序调用各文件中的init()函数。

对于不同的package,如果不相互依赖的话,按照main包中”先import的后调用”的顺序调用其包中的init(),如果package存在依赖,则先调用最早被依赖的package中的init(),最后调用main函数。

为了进一步看下init函数和main函数的初始化顺序,我们可以看下这段代码:

package mainimport ("fmt"
)
const (CFG_VISIT       = "visit.json"
)var (gameStatus = 0
)func init(){fmt.Println("go init")
}func main(){fmt.Println("hello world")
}

对于import 包,const 初始化, var初始化,init函数,main函数的调用顺序是什么样的?

实际上,整个程序的执行流程可以用下面的图来表示:


总结下来,go语言包的初始化有如下特点:

  • 包初始化程序从 main 函数引用的包开始,逐级查找包的引用,直到找到没有引用其他包的包,最终生成一个包引用的有向无环图。
  • golang编译器会将有向无环图转换为一棵树,然后从树的叶子节点开始逐层向上对包进行初始化。
  • 单个包的初始化过程如上图所示,先初始化常量,然后是全局变量,最后执行包的 init 函数。

内置类型

值类型:

    boolint(32 or 64), int8, int16, int32, int64uint(32 or 64), uint8(byte), uint16, uint32, uint64float32, float64stringcomplex64, complex128array    -- 固定长度的数组

引用类型:(指针类型)

    slice   -- 序列数组(最常用)map     -- 映射chan    -- 管道

内置函数

Go 语言拥有一些不需要进行导入操作就可以使用的内置函数。它们有时可以针对不同的类型进行操作,例如:len、cap 和 append,或必须用于系统级的操作,例如:panic。因此,它们需要直接获得编译器的支持。

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

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

相关文章

Mamba 环境安装:causal-conv1d和mamba-ssm报错解决办法

问题描述: 在执行命令 pip install causal_conv1d 和 mamba_ssm 出错: 解决方案: 1、使用网友配置好的Docker环境,参考:解决causal_conv1d和mamba_ssm无法安装 -> 直接使用Mamba基础环境docker镜像 DockH…

java实现图片转pdf,并通过流的方式进行下载(前后端分离)

首先需要导入相关依赖,由于具体依赖本人也不是记得很清楚了,所以简短的说一下。 iText:PDF 操作库,用于创建和操作 PDF 文件。可通过 Maven 或 Gradle 引入 iText 依赖。 MultipartFile:Spring 框架中处理文件上传的类…

一台工控机的能量

使用Docker搭建EPICS的IOC记录 Zstack EPICS Archiver在小课题组的使用经验 以前电子枪调试,用一台工控机跑起束测后台,这次新光源用的电子枪加工回来又是测试,又是用一台工控机做起重复的事,不过生命在于折腾,重复的…

stm32——hal库学习笔记(IIC)

一、IIC总线协议介绍(掌握) 二、AT24C02介绍(了解) 三、AT24C02读写时序(掌握) 四、AT24C02驱动步骤(掌握) 五、编程实战(掌握) myiic.c #include "./B…

汽车虚拟仿真技术的实现、应用和未来

汽车虚拟仿真技术是一种利用计算机模拟汽车运行的技术,以实现对汽车行为的分析、评估和改进。汽车虚拟仿真技术是汽车工业中重要的开发设计和测试工具,可以大大缩短产品研发周期、降低研发成本和提高产品质量。本文将从汽车虚拟仿真技术的实现过程、应用…

Ubuntu18.04 系统上配置并运行SuperGluePretrainedNetwork(仅使用CPU)

SuperGlue是Magic Leap在CVPR 2020上展示的研究项目,它是一个图神经网络(Graph Neural Network)和最优匹配层(Optimal Matching layer)的结合,训练用于对两组稀疏图像特征进行匹配。这个项目提供了PyTorch代…

前端的文字的字体应该如何设置

要设置文字的字体,在CSS中使用font-family属性。这个属性可以接受一个或多个字体名称作为其值,浏览器会按照列表中的顺序尝试使用这些字体渲染文本。如果第一个字体不可用,浏览器会尝试使用列表中的下一个字体,依此类推。 字体设…

iOS消息发送流程

Objc的方法调用基于消息发送机制。即Objc中的方法调用,在底层实际都是通过调用objc_msgSend方法向对象消息发送消息来实现的。在iOS中, 实例对象的方法主要存储在类的方法列表中,类方法则是主要存储在原类中。 向对象发送消息,核心…

推荐一个屏幕上鼠标高亮显示的小工具

在视频录制等特定场景下,很多人希望在点击鼠标时能够在屏幕上及时进行显示,便于别人发现,提高别人的注意力。 因此,很多录屏软件中都内含显示鼠标点击功能。那如果不支持该怎么办呢?其实,也是可以通过其他工…

Python 实现Excel自动化办公(上)

在Python 中你要针对某个对象进行操作,是需要安装与其对应的第三方库的,这里对于Excel 也不例外,它也有对应的第三方库,即xlrd 库。 什么是xlrd库 Python 操作Excel 主要用到xlrd和xlwt这两个库,即xlrd是读Excel &am…

算法刷题day20:二分系列

目录 引言概念一、借教室二、分巧克力三、管道四、技能升级五、冶炼金属六、数的范围七、最佳牛围栏 引言 这几天一直在做二分的题,都是上了难度的题目,本来以为自己的二分水平已经非常熟悉了,没想到还是糊涂了一两天才重新想清楚&#xff0…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的口罩识别系统(Python+PySide6界面+训练代码)

摘要:开发口罩识别系统对于提升公共卫生安全和疫情防控具有重要意义。本篇博客详细介绍了如何利用深度学习构建一个口罩识别系统,并提供了完整的实现代码。该系统基于强大的YOLOv8算法,并结合了YOLOv7、YOLOv6、YOLOv5的对比,给出…

如何更好的引导大语言模型进行编程的高效开发流程?

这张图片展示了一种如何更好地引导大语言模型进行编程的方法。 首先,最简单也是最有效的方法是让大语言模型重复运行多次,每次增加一些额外的信息,直到获得想要的结果。这种方法虽然简单,但可能需要多次尝试才能得到满意的结果。…

2024绿色能源、城市规划与环境国际会议(ICGESCE 2024)

2024绿色能源、城市规划与环境国际会议(ICGESCE 2024) 一、【会议简介】 随着全球气候变化和环境问题日益严重,绿色能源和可持续发展已成为全球关注的焦点。本次会议旨在汇聚全球在绿色能源、城市规划与环境领域的专家、学者和实践者,共同探讨和分享关于…

Vue.js大师: 构建动态Web应用的全面指南

VUE ECMAScript介绍什么是ECMAScriptECMAScript 和 JavaScript 的关系ECMAScript 6 简介 ES6新特性let基本使用const不定参数箭头函数对象简写模块化导出导入a.jsb.jsmain.js Vue简介MVVM 模式的实现者——双向数据绑定模式 Vue环境搭建在页面引入vue的js文件即可。创建div元素…

1、jQuery介绍、css()、选择器、事件、动画

一、jQuery介绍&#xff1f; 1、什么是jQuery&#xff1f; 是一个JavaScript函数库 2、jQuery特点 写的少&#xff0c;做的多 3、jQuery的安装 直接下载引入 <script src"jquery-1.10.2.min.js"></script>通过cdn引入 <script src"https…

python自动化之项目架构搭建与思路讲解(第二天)

1.自动化测试的概念 自动化测试是指使用自动化工具和脚本来执行测试任务,以验证软件或系统的正确性和稳定性。它可以提高测试的效率和准确性,并节约时间和成本。 2.自动化脚本编写的思路 xmind文档如有需要,可在资源里自行下载 3.项目代码工程创建 lib :基本代码库包 …

瑞_Redis_Redis命令

文章目录 1 Redis命令Redis数据结构Redis 的 key 的层级结构1.0 Redis通用命令1.0.1 KEYS1.0.2 DEL1.0.3 EXISTS1.0.4 EXPIRE1.0.5 TTL 1.1 String类型1.1.0 String类型的常见命令1.1.1 SET 和 GET1.1.2 MSET 和 MGET1.1.3 INCR和INCRBY和DECY1.1.4 SETNX1.1.5 SETEX 1.2 Hash类…

Android 12.0 framework关于systemUI定制之导航栏透明背景的功能实现

1.概述 在12.0的系统rom产品定制化开发中,在对于系统原生SystemUI的导航栏背景在沉浸式导航栏的 情况下默认是会随着背景颜色的变化而改变的,在一些特定背景下导航栏的背景也是会改变的,所以由于产品开发需要 要求需要设置导航栏背景为透明的,所以就需要在Activity创建的时…

《秦时明月》IP新高度:与陕西历史博物馆共同书写文化传承新篇章!

在IP产业风起云涌的今天&#xff0c;如何以创意和匠心为传统文化注入新的活力&#xff0c;成为了摆在每一位文化工作者面前的重要课题。近日&#xff0c;《秦时明月》作为一部深受观众喜爱的国产动画IP&#xff0c;在迎来其十七周年之际&#xff0c;联手陕西历史博物馆&#xf…