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 就行了,该包就可以使用了。

posted @ 2022-11-12 16:24  羊脂玉净瓶  阅读(434)  评论(0编辑  收藏  举报