⼀般来说,⼀个⽂件夹可以作为 package,同⼀个 package 内部变量、类型、⽅法等定义可以相互看到。⽐如我们新建⼀个⽂件 calc.go , main.go 平级,分别定义 add 和 main ⽅法。
- 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
####################################################################################
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
- 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))
- }
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}}