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结尾的文件,是测试文件,不会在普通编译时包含。
相关推荐
dengjiayue9 分钟前
golang实现简单的reids服务2
开发语言·golang
冷环渊18 分钟前
React基础学习
前端·学习·react.js
凡人的AI工具箱2 小时前
40分钟学 Go 语言高并发教程目录
开发语言·后端·微服务·性能优化·golang
每天写点bug2 小时前
【golang】匿名内部协程,值传递与参数传递
开发语言·后端·golang
今天我又学废了2 小时前
学习记录,隐式对象,隐式类
学习
#HakunaMatata2 小时前
Java 中 List 接口的学习笔记
java·学习·list
小雄abc2 小时前
决定系数R2 浅谈三 : 决定系数R2与相关系数r的关系、决定系数R2是否等于相关系数r的平方
经验分享·笔记·深度学习·算法·机器学习·学习方法·论文笔记
Magnetic_h2 小时前
【iOS】OC高级编程 iOS多线程与内存管理阅读笔记——自动引用计数(三)
笔记·学习·ios·objective-c·cocoa
m0_674031433 小时前
go语言的成神之路-筑基篇-gin常用功能
java·golang·gin
egekm_sefg3 小时前
【Golang】——Gin 框架中的模板渲染详解
开发语言·golang·gin