Golang学习笔记_01——包

文章目录

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

包(package)

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

1. 定义

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

go 复制代码
package main

2. 导入

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

go 复制代码
import "fmt"

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

go 复制代码
import f "fmt"

3. 初始化

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

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

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

go 复制代码
package mypackage

import "fmt"

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

4. 可见性

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

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文件

go 复制代码
package main

import (
	"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文件

go 复制代码
package main

import (
	"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结尾的文件,是测试文件,不会在普通编译时包含。
相关推荐
UpUpUp……16 分钟前
HTML简单语法标签(后续实操:云备份项目)
笔记·html
小彭律师22 分钟前
门禁人脸识别系统详细技术文档
笔记·python
是孑然呀2 小时前
【小记】word批量生成准考证
笔记·学习·excel
ll7788114 小时前
C++学习之路,从0到精通的征途:继承
开发语言·数据结构·c++·学习·算法
LuckyLay5 小时前
React百日学习计划——Deepseek版
前端·学习·react.js
安和昂6 小时前
【iOS】SDWebImage源码学习
学习·ios
毫秒AI获客6 小时前
小红书多账号运营效率优化:技术方案与自动化实践
笔记
菜一头包6 小时前
c++ std库中的文件操作学习笔记
c++·笔记·学习
猴子请来的逗比4896 小时前
tomcat搭建内网论坛
学习·tomcat
belldeep6 小时前
如何阅读、学习 Git 核心源代码 ?
git·学习·源代码