Golang结构体方法和接收者
结构体方法和接收者
在go语言中,没有类的概念,但是可以给类型(结构体,自定义类型)定义方法。所谓方法就是定义了接收者的函数。接收者的概念就类似于其它语言中的this或者self。
方法的定义格式如下
func (接收者变量 接收者类型) 方法名(参数列表) (返回参数) {
函数体
}
其中
- 接收者变量:接收者的参数变量在命名时,官方建议使用接受者类型名的第一个小写字母,而不是this、self之类的命名。例如,Person类型的接收者比变量应该命名为p,Connector类型的接收者变量应该命名为c
- 接收者类型:接收者类型和参数类似,可以是指针类型和非指针类型。
- 方法名,参数列表,返回参数:具体格式和函数定义相同
值类型:改变变量副本的时候,不会改变变量本身的值(数组,基本数据类型,结构体)
引用类型:改变变量副本的时候,会改变变量本身的值(切片,map等)
结构体是值类型演示
type Book struct {
name string
price float32
}
func main(){
var book1 Book
var book2 Book
book1.name="Linux"
book1.price=23.7
book2 = book1
book2.name = "哈哈哈"
fmt.Printf("name:%v,price:%v",book1.name,book1.price)
fmt.Println("\n")
fmt.Printf("name:%v,price:%v",book2.name,book2.price)
}
输出为:
name:Linux,price:23.7
name:哈哈哈,price:23.7
只改变了变量副本的值,变量本身没有改变
一、Goalng中包的介绍和定义
包(package)是多个Go源码的集合,是一种高级的代码复用方案,Go语言为我们提供了很多内置的包,如fmt,strings,os等
Golang中的包可以分为三种“
系统内置包:Golang语言给我们提供内置的包,引入后可以直接使用。
自定义包:开发者自己写的包
第三方包:自定义包的一种,需要下载安装到本地后才可以使用。
二、Golang下包管理工具 go mod
在Golang1.11 版本之前,如果我们要自定义包的话,必须把项目放在GOPATH目录,Go1.11 版本之后无需手动配置环境变量,使用go mod管理项目,也不需要把项目放在GOPATH目录下,你可以在磁盘的任何一个位置新建一个项目。Go1.13之后可以彻底不要GOPATH了。
我们先看下怎么使用自定义包
包(package)是多个Go文件的集合,一个包可以简单理解为一个存放多个.go文件的文件夹。该文件夹下的所有go文件都要在第一行添加如下代码:
package 文件夹名
包的名字不一定要和.go文件名字一致。但是,同一个包下的每一个.go文件的第一行必须是package 文件夹名
注意事项:
- 一个文件夹下包含的文件只能归属于一个package,同样,一个package的文件不能在多个文件夹下。
- 包名可以不和文件夹的名字保持一样,不能包含-符号
- 包名为main的包为应用程序的入口包,这种包编译后会得到一个可执行文件,而编译不包含main包的源代码则不会生成可执行文件。
自定义报名
在导入包的时候,还可以为导入的包设置别名。语法如下
import 别名 "包的路径"
单行引入时定义别名
import M "itying/module"
匿名导入包
如果我们只是希望引入包,而不使用包内部的数据时,可以使用匿名导入包。具体的格式如下:
import _ "包的路径"
演示:
比如,新建一个项目(我放在了E:\GolangStudy\itying下面)。
首先,进入该文件夹,执行
go mod init itying
可以看到在itying文件夹下生成了一个go.mod 文件
然后,新建main.go 入口文件。
在项目文件夹(itying)下面创建一个自定义包,比如名字为(module,即创建一个module的文件夹)
在module文件夹下创建go文件,例如,haha.go
在这个包里,可以定义方法,可以定义变量,也可以定义结构体
这里定义两个方法(首字母大写,意味着是公共方法,可以被其它包调用,小写是私有方法,无法被其它包调用),代码如下
package module //这个包的名字最好和所在的文件夹名字保持一致
import "fmt"
// 首字母大写,公有方法
func Aa(){
fmt.Println("我是module包中的Aa方法")
}
// 首字母大写,公有方法
func Bb(){
fmt.Println("我是module包中的Bb方法")
}
// 首字母小写,私有方法
func cc(){
fmt.Println("我是module包中的cc方法")
}
在main.go中引入该包
package main
import "itying/module" // 引入itying目录下的module这个包
func main(){
module.Aa() // 调用module这个包的Aa方法,可以调用
module.Bb() // 调用module这个包的Bb方法,可以调用
module.cc() // 私有方法,不可以调用
}
输出结果
E:\GolangStudy\itying>go run main.go
我是module包中的Aa方法
我是module包中的Bb方法
可以看到自定义的包已经可以使用了。
如果包名和文件夹名字不一致,应该这样引用
这里,文件夹名字是module,但是包名是sb
引用的时候,包名.方法名 即可
Golang中的init()初始化函数
init()函数介绍
在go语言执行程序时导入包语句会自动触发包内部的init()函数的调用,需要注意的是,init()函数没有参数也没有返回值。init()函数在程序运行时会自动被调用执行。不能在代码中主动调用它。
Golang中使用第三方包
我们可以在https://pkg.go.dev 查看常见的golang第三方包
1.找到我们需要下载的第三方包的地址
比如 https://github.com/shopspring/decimal
2. 安装这个包
第一种方法: go get 包名称 (全局)
第二种方法:go mod download (全局)
依赖包会自动下载到$GOPATH/pkg/mod下,多个项目可以共享缓存的mod,
注意:使用go mod download
的时候首先需要在你的项目里面引入第三方包
第三种方法
go mod vendor 将依赖复制到当前项目的vendor下 (本项目)
注意:使用go mod vendor
的时候首先需要在你的项目里面引入第三方包
示例
引入gjson包
首先在https://pkg.go.dev 网站找到这个包
照着步骤操作。
注意:要在代码里引用该包,并且使用一下,否则编辑器找不到该包的使用,会自动把import 的包删掉
然后执行 go mod vendor 就行了,该包就可以使用了。