网站首页 > 文章中心 > 其它

go语言mpg模式

作者:小编 更新时间:2023-08-22 19:08:12 浏览量:220人看过

GO语言(二十七):管理依赖项(下)-

当您对外部模块的存储库进行了 fork (例如修复模块代码中的问题或添加功能)时,您可以让 Go 工具将您的 fork 用于模块的源代码.这对于测试您自己的代码的更改很有用.

为此,您可以使用go.mod 文件中的replace指令将外部模块的原始模块路径替换为存储库中 fork 的路径.这指示 Go 工具在编译时使用替换路径(fork 的位置),例如,同时允许您保留import 原始模块路径中的语句不变.

在以下 go.mod 文件示例中,当前模块需要外部模块example.com/theirmodule.然后该replace指令将原始模块路径替换为example.com/myfork/theirmodule模块自己的存储库的分支.

设置require/replace对时,使用 Go 工具命令确保文件描述的需求保持一致.使用go list命令获取当前模块正在使用的版本.然后使用go mod edit命令将需要的模块替换为fork:

go语言mpg模式-图1

注意: 当您使用该replace指令时,Go 工具不会像添加依赖项中所述对外部模块进行身份验证.

您可以使用go get命令从其存储库中的特定提交为模块添加未发布的代码.

以下示例提供了一些说明.这些基于源位于 git 存储库中的模块.

当您的代码不再使用模块中的任何包时,您可以停止将该模块作为依赖项进行跟踪.

要停止跟踪所有未使用的模块,请运行go mod tidy 命令.此命令还可能添加在模块中构建包所需的缺失依赖项.

要删除特定依赖项,请使用go get,指定模块的模块路径并附加 @none,如下例所示:

go语言mpg模式-图2

go get命令还将降级或删除依赖于已删除模块的其他依赖项.

如果您(或您的团队)已经设置或选择了您想要使用的不同模块代理服务器,您可能想要这样做.例如,有些人设置了模块代理服务器,以便更好地控制依赖项的使用方式.

您可以将变量设置为其他模块代理服务器的 URL,用逗号或管道分隔 URL.

GOPRIVATE或环境变量可以设置为匹配模块前缀的全局模式列表,这些GONOPROXY前缀是私有的,不应从任何代理请求.例如:

go语言的reflect(反射)

①.、反射可以在运行时 动态获取变量的各种信息 ,比如变量的类型、类别;

①.、不知道接口调用哪个函数,根据传入参数在运行时确定调用的具体接口,这种需要对函数或方法反射.

例如以下这种桥接模式:

示例第一个参数funcPtr以接口的形式传入函数指针,函数参数args以可变参数的形式传入,bridge函数中可以用反射来动态执行funcPtr函数.

①.、reflect.TypeOf(变量名),获取变量的类型,返回reflect.Type类型.

①.、reflect.Value.Kind,获取变量的 类别(Kind) ,返回的是一个 常量 .在go语言文档中:

示例如下所示:

输出如下:

Kind的范畴要比Type大.比如有Student和Consumer两个结构体,他们的 Type 分别是 Student 和 Consumer ,但是它们的 Kind 都是 struct .

如果是x是float类型的话,也是要用reflect.Value(x).Float().但是如果是struct类型的话,由于type并不确定,所以没有相应的方法,只能 断言.

一学就会,手把手教你用Go语言调用智能合约

智能合约调用是实现一个 DApp 的关键,一个完整的 DApp 包括前端、后端、智能合约及区块 链系统,智能合约的调用是连接区块链与前后端的关键.

我们先来了解一下智能合约调用的基础原理.智能合约运行在以太坊节点的 EVM 中.所以呢要 想调用合约必须要访问某个节点.

以后端程序为例,后端服务若想连接节点有两种可能,一种是双 方在同一主机,此时后端连接节点可以采用 本地 IPC(Inter-Process Communication,进 程间通信)机制,也可以采用 RPC(Remote Procedure Call,远程过程调用)机制;另 一种情况是双方不在同一台主机,此时只能采用 RPC 机制进行通信.

接着,我们来了解一下智能合约运行的过程.

智能合约的运行过程是后端服务连接某节点,将 智能合约的调用(交易)发送给节点,节点在验证了交易的合法性后进行全网广播,被矿工打包到 区块中代表此交易得到确认,至此交易才算完成.

就像数据库一样,每个区块链平台都会提供主流 开发语言的 SDK(Software Development Kit,软件开发工具包),由于 Geth 本身就是用 Go 语言 编写的,所以呢若想使用 Go 语言连接节点、发交易,直接在工程内导入 go-ethereum(Geth 源码) 包就可以了,剩下的问题就是流程和 API 的事情了.

最后提醒一下大家,智能合约被调用的两个关键点是节点和 SDK.

此时此刻呢介绍如何使用 Go 语言,借助 go-ethereum 源码库来实现智能合约的调用.这是有固定 步骤的,我们先来说一下总体步骤,以下面的合约为例.

步骤 01:编译合约,获取合约 ABI(Application Binary Interface,应用二进制接口). 单击【ABI】按钮拷贝合约 ABI 信息,将其粘贴到文件 calldemo.abi 中(可使用 Go 语言IDE 创建该文件,文件名可自定义,后缀最好使用 abi).

最好能将 calldemo.abi 单独保存在一个目录下,输入"ls"命令只能看到 calldemo.abi 文件,参 考效果如下:

此时此刻呢设置 module 生效和 GOPROXY,命令如下:

go语言mpg模式-图3

在项目工程内,执行初始化,calldemo 可以自定义名称.

Golang 线程和协程的区别

线程:

多线程是为了解决CPU利用率的问题,线程则是为了减少上下文切换时的开销,进程和线程在Linux中没有本质区别,最大的不同就是进程有自己独立的内存空间,而线程是共享内存空间.

在进程切换时需要转换内存地址空间,而线程切换没有这个动作,所以线程切换比进程切换代价要小得多.

协程:

想要简单,又要性能高,协程就可以达到我们的目的,它是用户视角的一种抽象,操作系统并没有这个概念,主要思想是在用户态实现调度算法,用少量线程完成大量任务的调度.

Goroutine是GO语言实现的协程,其特点是在语言层面就支持,使用起来十分方便,它的核心是MPG调度模型:M即内核线程;P即处理器,用来执行Goroutine,它维护了本地可运行队列;G即Goroutine,代码和数据结构;S及调度器,维护M和P的信息.

以上就是土嘎嘎小编为大家整理的go语言mpg模式相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!

版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章