04、GO模块与包、结构体
1. Package
⼀般来说,⼀个⽂件夹可以作为 package,同⼀个 package 内部变量、类型、⽅法等定义可以相互看到。⽐如我们新建⼀个⽂件 calc.go , main.go 平级,分别定义 add 和 main ⽅法。
示例:calc.go
1 package main
2
3 func add(num1 int, num2 int) int {
4 return num1 + num2
5 }
示例:main.go
package main
import "fmt"
func main() {
fmt.Println(add(3, 5)) // 输出 8
}
但是这时我们运行main.go会报错,因为add函数在main.go是没有定义的
[root@localhost src]# go run main.go
# command-line-arguments
./main.go:6:14: undefined: add
因为 go run main.go 仅编译 main.go ⼀个⽂件,所以命令需要换成 go run main.go calc.go
$ go run main.go calc.go
8
或者换成 go run .
$ go run .
8
####################################################################################
2. Modules
Go Modules 是 Go 1.11 版本之后引⼊的,Go 1.11 之前使⽤ $GOPATH 机制。Go Modules 可以算作是较为完善的包管理⼯具。同时⽀持代理,国内也能享受⾼速的第三⽅包镜像服务。接下来简单介绍 go mod 的使⽤。GoModules 在 1.13 版本仍是可选使⽤的,环境变量 GO111MODULE 的值默认为 AUTO,强制使⽤ Go Modules 进⾏依赖管理,可以将 GO111MODULE 设置为 ON。
示例:在⼀个空⽂件夹下,初始化⼀个 Module这⾥的example就是模块名,后⾯引⽤需要⽤。
$ go mod init example go: creating new go.mod: module example
此时,在当前⽂件夹下⽣成了 go.mod ,这个⽂件记录当前模块的模块名以及所有依赖包的版本。我们在当前⽬录,添加⼀个⼦ package calc,代码⽬录如下:
demo/
|--calc/
|--calc.go
|--main.go
在
calc.go
中写⼊
package calc
func Add(num1 int, num2 int) int {
return num1 + num2
}
接着,我们在当前⽬录下新建⽂件 main.go ,添加如下代码:在 package main 中如何使⽤ package cal 中的 Add 函数呢? import 模块名/⼦⽬录名 即可
package main
import (
"fmt"
"example/calc"
)
func main() {
fmt.Println("hello, 三创⼈")
fmt.Println(calc.Add(10, 3))
}
3.结构体
Go 语言中数组可以存储同一类型的数据,但
在结构体中我们可以为不同项定义不同的数据类型
。结构体是
由一系列具有相同类型或不同类型的数据构成的数据集合
。
结构体表示一项记录,比如保存图书馆的书籍记录,每本书有以下属性
结构体类似于其他语言中的 class,可以在结构体中定义多个字段,为结构体实现方法,实例化等。
Title :标题
Author : 作者
Subject:学科
ID:书籍ID
定义结构体
结构体定义需要使用
type
和struct
语句。struct 语句定义一个新的数据类型,结构体中有一个或多个成员。type 语句设定了结构体的名称。结构体的格式如下:
type struct_variable_type struct {
member definition
member definition
...
member definition
}
示例:定义一个结构体Student,并为结构体添加name,age字段
type Student struct {
name string
age int
}
为结构体添加方法
示例:为Student结构体添加hello方法
// stu是结构体student的实例
func (stu *Student) hello (person string) string {
return fmt.Sprintf("hello %s, i am %s", person, stu.name)
}
结构体练习:
[root@localhost src_bak]# cat struct.go
package main
import "fmt"
type Student struct{
name string
age int
}
// stu是结构体student的实例
func (stu *Student) hello (person string) string {
return fmt.Sprintf("hello %s, i am %s", person, stu.name)
}
type person struct{
Name string
Age int
Contact struct{
Phone, City string
Code int
}
}
func main() {
fmt.Println("hello world")
// 实例化1
stu := &Student{
name: "Teacher Wen",
age: 18,
}
fmt.Println(stu.name, stu.age)
fmt.Println(stu.hello("Teacher cali"))
// 实例化2
stu2 := new(Student)
fmt.Println(stu2.name, stu2.age)
stu2.name = "wangsh"
stu2.age = 21
fmt.Println(stu2.name, stu2.age)
// person实例化1
per := person{Name:"wangsh", Age:21}
per.Contact.Phone = "10000"
per.Contact.City = "changsha"
per.Contact.Code = 20194190
fmt.Println(per)
}
[root@localhost src_bak]# go run struct.go
hello world
Teacher Wen 18
hello Teacher cali, i am Teacher Wen
0
wangsh 21
{wangsh 21 {10000 changsha 20194190}}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通