初识Go语言20-包与工程化【用go mod管理工程、包引入规则、init调用链、可见性】

news2024/12/23 9:06:09

文章目录

  • 包与工程化
    • 用go mod管理工程
    • 包引入规则
    • init调用链
    • 可见性


包与工程化

用go mod管理工程

  初始化项目:

go mod init $module_name

$module_name和目录名可以不一样。上述命令会生成go.mod文件,该文件内容形如:

module go-course

go 1.17

require (
    github.com/ethereum/go-ethereum v1.10.8
    github.com/gin-gonic/gin v1.7.4
)

  Go依次从当前项目、GOROOT、GOPATH下寻找依赖包。

  1. 从当前go文件所在的目录逐级向上查找go.mod文件(假设go.mod位于目录mode_path下),里面定义了module_name,则引入包的路径为"module_name/包相对于mode_path的路径"。
  2. go标准库提供的包在GOROOT/src下。
  3. 第三方依赖包在GOPATH/pkg/mod下。

  从go1.7开始,go get只负责下载第三方依赖包,并把它加到go.mod文件里,由go install负责安装二进制文件。

  • go get github.com/mailru/easyjson会在GOPATH/pkg/mod目录下生成github.com/mailru/easyjson目录。
  • go install github.com/mailru/easyjson/easyjson会在GOPATH/bin下生成easyjson二进制可执行文件。

  go mod tidy通过扫描当前项目中的所有代码来添加未被记录的依赖至go.mod文件或从go.mod文件中删除不再被使用的依赖。

包引入规则

包的声明

  • go文件的第一行声明 package xxx。
  • 在包声明的上面可写关于包的注释,包注释也可以专门写在doc.go里。
  • 包名跟目录名可以不同。
  • 同一个目录下,所有go文件的包名必须一致。

包的引用

  • 可以直接使用同目录下其他go文件里的变量、函数、结构体。
  • 跨目录使用则需要变量前加入包名,并且引入包所在的目录。
imoprt "go-course/package"      //go-course是model名,package是目录名
mypackage.Add()     //mypackage是包名,它对应的目录是package
  • 在import块里可以引用父目录,也可以引用子目录。
  • 引用关系不能构成一个环。
  • 在import的目录前面可以给包起一个别名。
imoprt asd "go-course/package"
asd.Add()

init调用链

  main函数是go程序的唯一入口,所以main函数只能存在一个。main函数必须位于main包中。在main函数执行之前会先执行init()函数。在一个目录,甚至一个go文件里,init()可以重复定义。引入其他包时,相应包里的init()函数也会在main()函数之前被调用。

在这里插入图片描述

import _ "net/http/pprof"

  在目录前加一个_,代码里却没有显式地使用这个包里的函数或变量,实际上是想执行这个包里的init()函数。

可见性

  • 以小写字母开头命名的函数、变量、结构体只能在本包内访问。
  • 以大写字母开头命名的函数、变量、结构体在其他包中也可以访问。
  • 如果结构体名字以大写字母开头,而其成员变量、成员方法以小写字母开头,则这样的成员只能在本包内访问。

  Go中命名为internal的package,可以被平级目录和上一级目录所访问,更上层的目录不能访问。如下图c目录(internal的上一级目录)及其子孙目录之间可以任意import,但a目录和b目录不能import internal及其下属的所有目录。

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

HarmonyOS服务卡片开发-文件组织与配置学习

HarmonyOS服务卡片开发-文件组织与配置学习 1.文件组织 目录结构 JS服务卡片(entry/src/main/js/Component)的典型开发目录结构如下: 目录结构中文件分类如下: .hml结尾的HML模板文件,这个文件用来描述卡片页面的模板布局结构。 .css结…

云计算(Cloud Computing)

一、从技术概念理解云计算 早期的云计算就是虚拟化主机上的分布式计算,现阶段的云计算,已经不单单是一种分布式计算,而是分布式计算、效用计算、负载均衡、并行计算、网络存储、热备份冗杂和虚拟化等计算机技术混合演进并跃升的结果。云计算…

飞书接入ChatGPT,打造属于自己的智能问答助手

文章目录 前言环境列表视频教程1.飞书设置2.克隆feishu-chatgpt项目3.配置config.yaml文件4.运行feishu-chatgpt项目5.安装cpolar内网穿透6.固定公网地址7.机器人权限配置8.创建版本9.创建测试企业10. 机器人测试 转载自远控源码文章:飞书接入ChatGPT - 将ChatGPT集…

太酷了,库昊

昨天晚上凌晨3点30,勇士和国王的第7场比赛开打。 在上一局在勇士主场干翻勇士后,国王队的信心倍增,他们用自己的节奏一次次击溃勇士,特别是今天的前两节,国王能能够回应勇士的进球,防守也更有侵略性。今天不…

Spring第九阶段:Spring的注解功能

注解功能 1、注解配置Dao、Service、Controller组件 通过注解分别创建Dao、Service、Controller Spring配置bean的常用注解有 Controller 配置web层的组件 Service 配置Service组件 Repository 配置Dao组件 Component 配置JavaBean( 除Service , Dao , Controller组件之外的…

台积电和三星都变脸了,美国图谋失败,外媒:拜登心都碎了

美国的图谋甚大,然而美国的图谋却又如此迅速的浮现,看穿美国图谋的台积电和三星两家芯片企业如今不干了,这将破坏美国的计划,让美国无可奈何。 一、美国精心编织的大网 从数年前开始,美国就要求台积电和三星上交机密数…

想学编程但没有好的资料 来这 Python 爬取信息并写入数据,最详细教程

提示一下:我这个中一些用import引用的软件包,你们小白记得要下载哟 不然的话会报错的哟! 下载软件包很简单的! 话不多说,直接开始… from selenium.webdriver.common.by import By from selenium import webdriver import re, …

5月2日第壹简报,星期二,农历三月十三

5月2日第壹简报,星期二,农历三月十三坚持阅读,静待花开1. “港车北上”政策公布:6月1日起接受申请,7月1日起可驶入广东,将惠及45万香港车主。2. 全球女性第一人!董红娟登顶全部14座8000米级高峰…

nvm 安装 node,配置 yarn,cnpm

nvm 安装 node,配置 yarn, cnpm nvmnodeyarncnpm nvm 是什么?nodejs 的版本管理工具,为了解决 node.js 各种版本存在不兼容现象可以通过它安装和切换不同版本的 node.js重要:完全卸载本地 node下载链接 卸载完成之后,…

初识C++之智能指针

目录 一、智能指针的概念 二、RAII 三、 智能指针的拷贝构造 1. 智能指针的拷贝构造问题 2. C库中的智能指针 2.1 auto_ptr 2.2 unique_ptr 2.3 shared_pt 2.4 weak_ptr 四、shared_ptr的循环引用问题 五、 定制删除器 一、智能指针的概念 在了解智能指针的概念前&…

Java连接与操作Perforce

对于源码控管的基本使用来说, 使用Perforce的客户端工具就可以了, 但是某些应用场景下可能需要使用代码来与Perforce服务器进行交互, 比如: 自动部署流程中的自动取代码(该场景一般也可以使用P4命令行工具实现&#x…

Windows共享内存与死锁

实验一 一、实验内容或题目: 利用共享内存完成一个生产者进程和一个消费者进程的同步。 二、实验目的与要求: 1、编写程序,使生产者进程和消费者进程通过共享内存和mutex来完成工作同步。 2、了解通过操作系统接口调用,实现通…

Linux字符设备驱动

前言 代码结构简单,旨在用最简单的原理理解最主要的框架逻辑,细节需要自行延伸。 -----------------学习的基础底层逻辑 基础步骤 开发linux内核驱动需要以下4个步骤: 编写驱动代码编写makefile编译和加载驱动编写应用程序测试驱动 由于硬…

Android9.0 系统Framework发送通知流程分析

1.前言 在android 9.0的系统rom定制化开发中,在systemui中一个重要的内容就是系统通知的展示,在状态栏展示系统发送通知的图标,而在 系统下拉通知栏中展示接收到的系统发送过来的通知,所以说对系统framework中发送通知的流程分析很重要,接下来就来分析下系统 通知从frame…

开发攻城狮必备的Linux虚拟机搭建指南|原创

hi,我是阿笠! 这篇文章主要面对的是不常搭建Linux操作系统环境的开发同学,文中介绍了基本操作步骤并且提供了相关云盘资源,都是为了节约时间! 因为从我自身来讲,作为一名后端开发,经常需要练习一…

c#笔记-内置类型

内置类型 内置类型是一些有关键字表示的类型。关键字具有非常高的优先级,可以让你在没有别的配置的情况下, 只要用的是c#就可以使用。这也意味着这些类型是非常重要,或是基本的东西。 整数:byte, sbyte, short, ushort, int, ui…

【Python入门】搭建开发环境-安装Pycharm开发工具

前言 📕作者简介:热爱跑步的恒川,致力于C/C、Java、Python等多编程语言,热爱跑步,喜爱音乐的一位博主。 📗本文收录于Python零基础入门系列,本专栏主要内容为Python基础语法、判断、循环语句、函…

【数据结构】线性表之单链表(讲解实现——带动图理解)

文章目录 单链表单链表主体结构单链表操作函数介绍单链表操作函数实现单链表的初始化:打印函数单链表插入函数:头插尾插指定结点后插入和查找函数单链表结点之前插入数据 单链表删除函数头删尾删指定结点后删除指定结点删除 销毁单链表 文件分类test.cLi…

【STM32】基础知识 第十课 CubeMx

【STM32】基础知识 第十课 CubeMx STM32 CubeMX 简介安装 JAVACubeMX 安装新建 STM32 CubeMX 工程步骤新建工程时钟模块配置GPIO 配置生成源码 main.c STM32 CubeMX 简介 CubeMX (全称 STM32CubeMX) 是 ST 公司推出的一款用于 STM32 微控制器配置的图形化工具. 它能帮助开发者…

「Bug」解决办法:Could not switchto this profil,无法使用节点的解决方法,彻底解决

♥️作者:白日参商 🤵‍♂️个人主页:白日参商主页 ♥️坚持分析平时学习到的项目以及学习到的软件开发知识,和大家一起努力呀!!! 🎈🎈加油! 加油&#xff01…