• 04、GO模块与包、结构体


    1. Package

    ⼀般来说,⼀个⽂件夹可以作为 package,同⼀个 package 内部变量、类型、⽅法等定义可以相互看到。
    ⽐如我们新建⼀个⽂件 calc.go , main.go 平级,分别定义 add 和 main ⽅法。
    示例:calc.go
    1. 1 package main
    2. 2
    3. 3 func add(num1 int, num2 int) int {
    4. 4 return num1 + num2
    5. 5 }

    示例:main.go

    1. package main
    2. import "fmt"
    3. func main() {
    4. fmt.Println(add(3, 5)) // 输出 8
    5. }

    但是这时我们运行main.go会报错,因为add函数在main.go是没有定义的

    1. [root@localhost src]# go run main.go
    2. # command-line-arguments
    3. ./main.go:6:14: undefined: add
    因为 go run main.go 仅编译 main.go ⼀个⽂件,所以命令需要换成 go run main.go calc.go
    1. $ go run main.go calc.go
    2. 8

    或者换成 go run .

    1. $ go run .
    2. 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就是模块名,后⾯引⽤需要⽤。  
    1. $ go mod init example
    2. go: creating new go.mod: module example
    此时,在当前⽂件夹下⽣成了 go.mod ,这个⽂件记录当前模块的模块名以及所有依赖包的版本。
    我们在当前⽬录,添加⼀个⼦ package calc,代码⽬录如下:
    1. demo/
    2. |--calc/
    3. |--calc.go
    4. |--main.go
    calc.go 中写⼊
    1. package calc
    2. func Add(num1 int, num2 int) int {
    3. return num1 + num2
    4. }
    接着,我们在当前⽬录下新建⽂件 main.go ,添加如下代码:
    在 package main 中如何使⽤ package cal 中的 Add 函数呢? import 模块名/⼦⽬录名 即可
    1. package main
    2. import (
    3. "fmt"
    4. "example/calc"
    5. )
    6. func main() {
    7. fmt.Println("hello, 三创⼈")
    8. fmt.Println(calc.Add(10, 3))
    9. }

    3.结构体

    Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型

    结构体是由一系列具有相同类型或不同类型的数据构成的数据集合

    结构体表示一项记录,比如保存图书馆的书籍记录,每本书有以下属性

    结构体类似于其他语言中的 class,可以在结构体中定义多个字段,为结构体实现方法,实例化等。

    1. Title :标题
    2. Author : 作者
    3. Subject:学科
    4. ID:书籍ID

    定义结构体

    结构体定义需要使用 typestruct 语句。struct 语句定义一个新的数据类型,结构体中有一个或多个成员。type 语句设定了结构体的名称。结构体的格式如下:

    1. type struct_variable_type struct {
    2. member definition
    3. member definition
    4. ...
    5. member definition
    6. }

    示例:定义一个结构体Student,并为结构体添加name,age字段

    1. type Student struct {
    2. name string
    3. age int
    4. }

    为结构体添加方法

    示例:为Student结构体添加hello方法

    1. // stu是结构体student的实例
    2. func (stu *Student) hello (person string) string {
    3. return fmt.Sprintf("hello %s, i am %s", person, stu.name)
    4. }

    结构体练习:

    1. [root@localhost src_bak]# cat struct.go
    2. package main
    3. import "fmt"
    4. type Student struct{
    5. name string
    6. age int
    7. }
    8. // stu是结构体student的实例
    9. func (stu *Student) hello (person string) string {
    10. return fmt.Sprintf("hello %s, i am %s", person, stu.name)
    11. }
    12. type person struct{
    13. Name string
    14. Age int
    15. Contact struct{
    16. Phone, City string
    17. Code int
    18. }
    19. }
    20. func main() {
    21. fmt.Println("hello world")
    22. // 实例化1
    23. stu := &Student{
    24. name: "Teacher Wen",
    25. age: 18,
    26. }
    27. fmt.Println(stu.name, stu.age)
    28. fmt.Println(stu.hello("Teacher cali"))
    29. // 实例化2
    30. stu2 := new(Student)
    31. fmt.Println(stu2.name, stu2.age)
    32. stu2.name = "wangsh"
    33. stu2.age = 21
    34. fmt.Println(stu2.name, stu2.age)
    35. // person实例化1
    36. per := person{Name:"wangsh", Age:21}
    37. per.Contact.Phone = "10000"
    38. per.Contact.City = "changsha"
    39. per.Contact.Code = 20194190
    40. fmt.Println(per)
    41. }
    1. [root@localhost src_bak]# go run struct.go
    2. hello world
    3. Teacher Wen 18
    4. hello Teacher cali, i am Teacher Wen
    5. 0
    6. wangsh 21
    7. {wangsh 21 {10000 changsha 20194190}}

  • 相关阅读:
    xshell配置保存OSMS堡垒机登录信息
    代码随想录第五十七天
    Flink学习15:Flink自定义数据源
    23年宁波职教中心CTF竞赛-决赛
    Angular等了三年,那个她已经来了
    【linux】进程等待,进程替换
    Notepad++ 的安装及配置
    AI为方,产业为向:京东云数字人的技术攀爬
    Spring三级缓存解决循环依赖
    python中布隆过滤器用法详解
  • 原文地址:https://blog.csdn.net/qq_48391148/article/details/126068790