当前位置: 首页 > news >正文

Golang学习笔记_01——包

文章目录

    • 包(package)
      • 1. 定义
      • 2. 导入
      • 3. 初始化
      • 4. 可见性
      • 4. 注意
        • 4.1 包声明
        • 4.2 main包
        • 4.3 包的导入
        • 4.4标识符的可见性
        • 4.5 包的初始化
        • 4.6 避免命名冲突
        • 4.7 包的路径和名称
        • 4.8 匿名导入
        • 4.9 使用Go Modules


包(package)

在Golang(通常简称为Go)中,包(Package)是一个非常重要的概念,它用于组织代码,提高代码的可维护性和可重用性。包的概念类似于其他编程语言中的模块或命名空间。

1. 定义

在Go中,每个文件都属于一个包。包的声明位于文件的最顶部,使用package关键字。

package main

2. 导入

要在Go文件中使用其他包中的代码,需要使用import关键字导入该包。

import "fmt"

导入包时,可以使用别名来避免命名冲突或简化代码

import f "fmt"

3. 初始化

当一个包被导入时,Go会执行该包中的init函数(如果有的话)。

init函数在包的每个文件中都可以定义,但只能有一个(Go会自动合并)。

init函数没有参数,也没有返回值,并且不能被其他函数调用。它主要用于包的初始化工作。

package mypackageimport "fmt"func init() {fmt.Println("mypackage is initialized")
}

4. 可见性

在Go中,通过首字母大小写来控制标识符(如变量、函数、类型等)的可见性。首字母大写的标识符是导出的,可以被其他包访问;首字母小写的标识符是未导出的,只能在包内部访问。

package package_demo// 导出的变量
var PublicVar = "I am public"// 未导出的变量
var privateVar = "I am private"// 导出的函数
func PublicFunc() {fmt.Println("Public function")
}// 未导出的函数
func privateFunc() {fmt.Println("Private function")
}

main.go文件

package mainimport ("Golang/package_demo"_ "Golang/package_demo""fmt"
)func main() {fmt.Println("Hello, 世界")// 测试包的可见性fmt.Println(package_demo.PublicFunc())fmt.Println(package_demo.PublicVar)
}

输出结果

package package_demo init
Hello, 世界
public function
public var

main.go文件

package mainimport ("Golang/package_demo"_ "Golang/package_demo""fmt"
)func main() {fmt.Println("Hello, 世界")// 测试包的可见性fmt.Println(package_demo.PublicFunc())fmt.Println(package_demo.PublicVar)fmt.Println(package_demo.privateVar)fmt.Println(package_demo.PrivateFunc())
}

输出结果

# command-line-arguments
./main.go:15:27: undefined: package_demo.privateVar
./main.go:16:27: undefined: package_demo.PrivateFunc

4. 注意

4.1 包声明
  • 每个Go源文件都必须在文件的第一行声明它所属的包,使用package 包名的语法。
  • 包的声明通常与所在的文件夹名称相同,但这不是强制性的,不过为了管理方便,建议保持一致。
4.2 main包
  • main包是特殊的,它是程序的入口点。如果一个包被声明为main,并且其中包含了main函数,那么这个包就可以被编译成一个可执行文件。
  • main函数必须放在main包下,否则程序无法编译执行。
4.3 包的导入
  • 要在代码中引用其他包的内容,需要使用import关键字。
  • 导入包的语法是import "包的路径",路径是从$GOPATH/src/或模块根目录开始计算的,使用/进行路径分隔。
  • 可以使用单行导入或多行导入的方式。
  • 如果包名较长,可以为导入的包设置别名,使用import 别名 "包的路径"的语法。
4.4标识符的可见性
  • 在Go语言中,如果一个标识符(如变量、常量、类型、函数等)的首字母大写,则它是对外可见的(public),可以被其他包访问。
  • 如果首字母小写,则它是包内可见的(private),只能在当前包内使用。
4.5 包的初始化
  • 在Go语言程序执行时,导入包语句会自动触发包内部init()函数的调用。
  • init()函数没有参数也没有返回值,它在程序运行时自动被调用执行,不能在代码中主动调用它。
  • 如果有多个包被导入,Go编译器会构建出一个树状的包引用关系,并根据引用顺序决定初始化顺序。
4.6 避免命名冲突
  • 在同一个包下,不能有相同的函数名或全局变量名,否则会导致重复定义的编译错误。
  • 如果不同的包中有相同名称的标识符,并且这些包都被导入到同一个文件中,那么需要通过包名来区分这些标识符。
4.7 包的路径和名称
  • 包的路径应该是唯一的,以避免命名冲突。
  • 包名可以包含小写字母和数字,但不能包含特殊字符(如-)或大写字母(虽然技术上可以,但通常不推荐)。
4.8 匿名导入
  • 如果只希望导入包而不使用包内部的数据,可以使用匿名导入的方式,即import _ "包的路径"
  • 匿名导入的包与其他方式导入的包一样都会被编译到可执行文件中,但不会在代码中使用该包提供的标识符。
4.9 使用Go Modules
  • 对于新项目,建议使用Go Modules来管理依赖关系。
  • 在项目的根目录下创建go.mod文件,并运行go mod init命令来初始化模块。
  • 使用Go Modules时,包的路径通常是相对于模块根的路径。
  • 包下的以_test.go结尾的文件,是测试文件,不会在普通编译时包含。
http://www.lryc.cn/news/502462.html

相关文章:

  • RPC设计--应用层缓冲区,TcpBuffer
  • 基于单片机智能控制的饮水机控制系统
  • 路径规划 | 改进的人工势场法APF算法进行路径规划(Matlab)
  • 【云原生知识】Kubernets实践-前端服务如何访问后端服务
  • 【ubuntu18.04】ubuntu18.04安装EasyCwmp操作说明
  • 使用Jackson库的ObjectMapper类将JSON字符串转换为Java的Map对象
  • ASP.NET Core实现鉴权授权的几个库
  • MySql:数据类型
  • Couchbase的OLAP支持情况
  • 企业级包管理器之搭建 npm 私有服务器 (6)
  • Elasticsearch的一些介绍
  • 音乐网站设计与实现
  • UE5 蓝图节点中文化
  • java抽奖系统登录下(四)
  • 解决阿里云轻量级服务器 Ubuntu 24.04.1 LTS 没网也 ping 不通 8.8.8.8 以及 route -n 没有输出任何转发信息
  • 跨域问题及其解决方案
  • 在CentOS中安装和卸载mysql
  • React简单入门 - [Next.js项目] - 页面跳转、AntD组件、二级目录等
  • Redis安装和Python练习(Windows11 + Python3.X + Pycharm社区版)
  • Sqoop脚本编写(Mysql---->>hdfs)
  • 帝可得项目redis连接不上
  • JS中this的值详细讲解以及面试指向练习
  • 显示浮动式窗口的方法
  • FireFox火狐浏览器企业策略禁止更新
  • C++类的运算符重载
  • 泷羽Sec学习笔记-zmap搭建炮台
  • 分析M0G突破后急剧下跌内因,x.game阐述不利面延续多久
  • 网络爬虫全解析
  • 《孤岛惊魂4》无法启动提示缺少“msvcp100.dll”快速修复方法!
  • GS-SLAM论文阅读--RGBDS-SLAM