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 的使⽤。Go
Modules 在 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

定义结构体

结构体定义需要使用 typestruct 语句。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}}

猜你喜欢

转载自blog.csdn.net/qq_48391148/article/details/126068790