非零基础自学Golang 第8章 包管理 8.2 包的声明 8.3 包的导入

news2024/12/27 5:25:30

非零基础自学Golang

文章目录

      • 非零基础自学Golang
      • 第8章 包管理
        • 8.2 包的声明
        • 8.3 包的导入
          • 8.3.1 导入声明
          • 8.3.2 远程导入
          • 8.3.3 别名导入
          • 8.3.4 匿名导入

第8章 包管理

8.2 包的声明

包是结构化代码的一种方式:每个程序都由包(通常简称为pkg)的概念组成,可以使用自身的包或者从其他包中导入内容。

我们先来了解一下Go语言源码的组织方式:

  • Go语言的源代码以代码包为基本的组织单位。
  • 在文件系统中,代码包是与文件目录一一对应的,文件目录的子目录也就是代码包的子包。
  • 在工作区中,一个代码包的导入路径实际上就是从src子目录到该包的实际存储位置的相对路径

每一个Go源文件的第一行都需要声明包的名称,声明一个包使用关键字package。

如声明一个main包:

package main

如同其他一些编程语言中的类库或命名空间的概念,每个Go文件都属于且仅属于一个包。

一个包可以由许多以“.go”为扩展名的源文件组成,因此文件名和包名一般来说都是不相同的。

代码包的名称一般会与源码文件所在的目录同名,如果不同名,在构建和安装的过程中会以代码包的名称为准。

在Go语言中,代码包中的源码文件名可以是任意的。但是,这些任意名称的源码文件都必须以包声明语句作为文件中的第一行,每个包都对应一个独立的名字空间。

包中成员以名称首字母大小写决定访问权限:

  • public:首字母大写,可被包外访问。
  • private:首字母小写,仅包内成员可以访问。

注意:同一个目录下不能定义不同的package。

【懂了】

8.3 包的导入

在Go语言程序中,每个包都有一个全局唯一的导入路径。

导入语句中类似““fmt””的字符串对应包的导入路径。

Go语言的规范并没有定义这些字符串的具体含义或包来自哪里,它们是由构建工具来解释的。一个导入路径代表一个目录中的一个或多个Go源文件。

8.3.1 导入声明

导入包需要使用关键字import,它会告诉编译器你想引用该位置的包中的代码,包的路径可以是相对路径,也可以是绝对路径。

// 声明方式一
import "fmt"
import "time"

// 声明方式二
import (
	"fmt"
 	"time"
)

如上所示的标准包会在Go语言的安装位置下的src目录中找到,而其他包都需要在GOPATH环境变量中的目录下寻找,GOPATH指定的这些目录就是开发者的个人工作空间。

如果在GOPATH中仍然没有找到所需的包,编译器在编译或运行时就会报错。

8.3.2 远程导入

我们经常使用的包都是标准库中的包,也就是本地包。Go语言不仅支持我们调用本地包,还支持调用远程服务器的包,例如托管在GitHub上的一个非常热门的Web框架gin,我们就可以通过远程导入的方式将其导入使用。

import "github.com/gin-gonic/gin"

在导入之前还需要使用go get命令下载远程包:

go get github.com/gin-gonic/gin

在这里插入图片描述

在这里插入图片描述

下载时可能会报错,go env -w GO111MODULE=on && go env -w GOPROXY=https://goproxy.cn,direct

先在 cmd 中执行下这个命令

在这里插入图片描述

这样就不会报错了

下面是 gin 官方提供的一个框架入门的例子:

package main

import "github.com/gin-gonic/gin"

func main() {

   r := gin.Default()
   r.GET("/ping", func(c *gin.Context) {
      c.JSON(200, gin.H{
         "message": "pong",
      })
   })

   r.Run() // listen and serve on 0.0.0.0:8080
}

运行结果

在这里插入图片描述

使用浏览器访问 接口 http://localhost:8080/ping

在这里插入图片描述

没问题,控制台会输出上面那种信息,表示有人请求了我们的http服务:

关于gin的这个Web框架,在后面还会重点学习

8.3.3 别名导入

在导入包时,可以指定包成员的访问方式,例如对包进行重命名,也就是使用别名的方式,避免导入两个相同包名的不同包而发生冲突。

定义包的别名只需要在导入的包名前指定别名即可。例如将fmt包取一个别名叫print:

import print "fmt"

[ 动手写 8.3.2 ]

package main

import (
   print "fmt"
   date "time"
)

func main() {
   print.Println("当前日期为: ", date.Now().Day())
}

运行结果

在这里插入图片描述

【笔者现在的时间是 2022 年12 月4 日】

动手写8.3.2定义了两个别名,fmt包的别名print和time包的别名date。需要注意的是,定义了别
名后,就不能再使用该包原本的名字来调用它,只能使用它的别名来调用。

8.3.4 匿名导入

在Go语言中,如果导入了一个包而不使用,在编译时会产生“unused import”的编译错误。

有时我们可能需要导入一个包,但不会引用到这个包的标识符,在这种情况下可以使用包的匿名导入的方式,就是使用下划线“_”来重命名该包。

import _“fmt”

使用匿名导入来引入一个包,而不使用包里的函数,主要是为了调用该包中的init函数。

例如当我们想分析一个Web应用程序的性能时,导入net/http/pprof包即可,该包的init函数主要做了路由匹配,具体如下:

func init() {
 	http.HandleFunc("/debug/pprof/", Index)
 	http.HandleFunc("/debug/pprof/cmdline", Cmdline)
 	http.HandleFunc("/debug/pprof/profile", Profile)
 	http.HandleFunc("/debug/pprof/symbol", Symbol)
 	http.HandleFunc("/debug/pprof/trace", Trace)
}

[ 动手写 8.3.3]

package main

import (
	"net/http"
	_ "net/http/pprof"
)

func ping(writer http.ResponseWriter, request *http.Request) {

	writer.Write([]byte("{\"message\":\"pong\"}"))

}

func main() {

	http.HandleFunc("/ping", ping)
	http.ListenAndServe(":8080", nil)
}

运行结果

在这里插入图片描述

等待请求中

动手写8.3.3实现了和动手写8.3.1一样的功能,但匿名导入了性能分析包pprof后就可以对该Web程序进行性能分析;之后浏览器访问http://localhost:8080/debug/pprof/就可以查看相关的性能参数,

在这里插入图片描述

还可以使用go tool pprof命令进行辅助分析。关于程序性能如何分析后面还会详细的说。

Go语言中的数据库操作也使用了相同的方法,让用户导入程序所必需的驱动,例如MySQL的驱动包github.com/go-sql-driver/mysql,使用“go get github.com/go-sql-driver/mysql”命令安装该包,

在这里插入图片描述

该包的init函数所做的事就是注册MySQL驱动。

func init() {
 	sql.Register("mysql", &MySQLDriver{})
}

当我们想要使用该驱动时就可以用匿名导入的方式导入驱动。

[ 动手写8.3.4 ]

package main

import (
   "database/sql"
   _ "github.com/go-sql-driver/mysql" //导入MySQL 驱动
)

func main() {

   dbname := "db 连接字符串"
   db, err := sql.Open("mysql", dbname) // OK

   // 数据库操作
   _, _ = db, err
}

运行结果

在这里插入图片描述

没出错 就是可以正常 启动。

动手写8.3.4导入了MySQL驱动,使得程序支持了操作MySQL的能力。

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

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

相关文章

35岁程序员:被大厂裁员后,我赚到手的却是这样:

这两年互联网行业一直不平静,都得都懂。认识一兄弟,技术不错,p7,干架构的,也在这场风波中“光荣毕业”了,前段时间找我出去小聚,聊起了这事儿: “比起惆怅,我更多的是感到…

04-Golang的一些基本变量

Golang的一些基本变量变量介绍概念变量使用注意事项变量的使用的基本步骤程序中 号的使用变量介绍 概念 变量相当于内存中一个数据存储空间的表示,你可以把变量看作是一个个房间的门牌号,通过门牌号我们可以找到房间,同样的道理&#xff0c…

Mycat(1):Mycat简介

1、什么是MyCat MyCat是目前最流行的分布式数据库中间插件,是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务器,前端用户可以把它看作是一个数据库代理,用MySQL客户端工具和命令行访问,而其后端可以用MySQL…

ODN 2395丨艾美捷CpG ODN系列参数介绍

艾美捷CpG ODN系列——ODN 2006:具有硫代磷酸酯骨架的CpG寡脱氧核苷酸(C型)。人和小鼠TLR9(Toll样受体9)的特异性配体。 艾美捷CpG ODN 丨ODN 2395化学性质: 序列:5-tcgtcgtttttcggcgcgcgccgcg…

基于java+springmvc+mybatis+vue+mysql的班级事务管理系统

项目介绍 学校教务管理信息化是提高办公效率的主要途径,随着我国高等教育的快速发展,学校办学规模的不断扩大,在校学生人数不断增多,办学层次出现多元化,由一地办学发展到多地多点办学,同时进一步推行学分…

一文弄懂Java中线程池原理

在工作中,我们经常使用线程池,但是你真的了解线程池的原理吗?同时,线程池工作原理和底层实现原理也是面试经常问的考题,所以,今天我们一起聊聊线程池的原理吧。 为什么要用线程池 使用线程池主要有以下三…

44 有效括号序列 45滑动窗口的最大值

44 有效括号序列 很容易想到用栈&#xff0c;但是一开始还是写得有问题 import java.util.*;public class Solution {/*** * param s string字符串 * return bool布尔型*/public boolean isValid (String s) {// write code hereStack<Character> st new Stack<>…

详解 InnoDB ReplicaSet

详解 InnoDB ReplicaSetInnoDB ReplicaSet 是什么&#xff1f;InnoDB ReplicaSet 的优缺点InnoDB ReplicaSet 的限制部署 InnoDB ReplicaSet1. 准备两个 MySQL 实例添加新实例的配置选项到 /etc/my.cnf分别在两台主机上进行预配置2. 使用 MySQL Shell 连接到一个实例来配置两个…

海康安防平台对接

1.前置准备工作 1.1下载h5播放器 https://open.hikvision.com/download/5c67f1e2f05948198c909700?type10安装包解压 1.2配置nginx反向代理 将解压的h5放到nginx目录下 配置nginx配置文件,修改如下两个配置 server {listen 9051;server_name localhost;#charset …

Python密码锁屏窗体界面

程序示例精选 Python密码锁屏窗体界面 如需安装运行环境或远程调试&#xff0c;见文章底部微信名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《Python密码锁屏窗体界面》编写代码&#xff0c; 原理上没有采用Windows自带锁屏模块&#xff0c;是通过软…

通过左旋和右旋来实现搜索二叉树的自平衡

首先左旋和右旋的概念都是在平衡二叉树的基础上提出的。并对AVL树 SB树 红黑树在原理层面进行了简单的介绍&#xff0c;无coding。 什么是左旋&#xff1f; 假设存在下述平衡二叉树&#xff08;某个结点的左子节点都小于该结点&#xff0c;右子结点右大于大结点&#xff09;&…

初识单链表/单链表头指针的创建

链表的概念及结构 概念&#xff1a;链表是一种物理存储结构上非连续、非顺序的存储结构。链表不像数组中的元素那样&#xff0c;每个数据的的地址是连续的。数组的物理存储结构&#xff1a;数组中上一个数据的地址和下一个数据的地址是连续的&#xff0c;正好差一个整型大小 链…

做副业找不到好项目?公众号依旧是最优选择

大家好&#xff0c;我是蝶衣王的小编&#xff0c;今天分享一下公众号还是否值得做呢 说到做自媒体账号赚钱&#xff0c;有些人可能会说是2022年谁看公众号&#xff0c;阅读量都不如以前了&#xff0c;大家都跑去刷短视频。其实不错&#xff0c;但是对于不想露脸的人来说&#…

深圳大学数学文化赏析MOOC第二次作业答案(满分)

一、单选题 (共 40.00 分) 1. 以下各数集中&#xff0c;不可数的一个是&#xff08; &#xff09; A. 自然数集 B. 整数集 C. 有理数集 D. 无理数集 满分&#xff1a;2.00 分 得分&#xff1a;2.00 分 你的答案&#xff1a; D 正确答案&#xff1a; D 教师评…

java计算机毕业设计ssm重点实验室系统

项目介绍 本重点实验室系统是针对目前仓库的实际需求,从实际工作出发,对过去的重点实验室系统存在的问题进行分析,完善用户的使用体会。采用计算机系统来管理信息,取代人工管理模式,查询便利,信息准确率高,节省了开支,提高了工作的效率。 本系统结合计算机系统的结构、概念、…

机器学习100天:目录

《机器学习100天》&#xff01;理论python&#xff01;实战真正的从零开始机器学习&#xff0c;循序渐进&#xff0c;适合初学者快速入门和进阶&#xff01; 思维导图&#xff1a; 第0章&#xff1a;准备工作 001 开发环境搭建 第1章&#xff1a;数据预处理 002 导入数据集 …

超级简单的vue课程设计电商购物系统,没有数据库文件,通过模拟数据操作

详细地址&#xff1a;《《《下载地址》》》 基于vue前端项目开发的电商购物系统&#xff0c;主要包括商品的列表、商品的详细页、加入购车、注册、用户登录用户等基本的功能。适合于课程设计&#xff0c;该项目的开发没有用到MYSQL数据库&#xff0c;通过模拟数据进行读取&…

转行如何自学Python并且找到工作,分享自己心得

我是25岁转行学python的。说实在&#xff0c;转行就是奔着挣钱去的。希望我的经历可以给想转行的朋友带来一点启发和借鉴。 先简单介绍下个人背景&#xff0c;三流大学毕业&#xff0c;电子商务专业&#xff0c;学习能力一般&#xff0c;没啥特别技能&#xff0c;反正就很普通…

Charles mock数据:

前提&#xff1a;确保手机已和PC上的Charles代理链接成功。 我们在平时的业务开发中&#xff0c;经常有端上已开发完成&#xff0c;但后端接口还没有Ready的情况&#xff1b;或者需要接口频繁变更数据来测试各种case的情况。这样如果过度依赖接口&#xff0c;肯定会极大降低我…

[附源码]Node.js计算机毕业设计糕点销售网站Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…