区块链实战
字节
字段
说明
4
版本
区块版本号,表示本区块遵守的验证规则
32
父区块头哈希值
前一区块的Merkle树根的哈希值,同样采取SHA256计算
32
Merkle根
该区块中交易的Merkle树根的哈希值,同样采用SHA256计算
4
时间戳
该区块产生的近似时间,精确到秒的UNIX时间戳,必须严格大于前11各区块的时间的中值,同时全节点也会拒接那些超过自己两个小时的时间戳的区块...
日期:2022-11-25 03:47:01
阅读:890
geth
以太坊智能合约开发中最常用的命令行工具。 Geth是由以太坊基金会提供的官方客户端软件,用Go编程语言编写的。Geth提供了一个交互式命令控制台,通过命令控制台中包含了以太坊的各种功能(API)。全名go-ethereum。
1. geth 简介
1.1 下载地址:
官网(很慢):https://geth.ethereum.org/downloads/
国内镜像:https://ethfans.org/wikis/Ethereum-Geth-Mirror
1.2 安装:
下载下来之后,会在安装目录生成geth.exe
将这个文件放在gopath的bin目录中,
放在这里就行...
日期:2022-11-25 03:47:00
阅读:867
1. 获取abi文件
合约的接口
在remix工具中编译合约后,会有一个abi,复制
然后新建一个xx.abi文件,把赋值的粘贴到里面
注意:代码变了,重新编译后abi也会变,所以一定要用最新的abi
也可以通过solc生成abi:
solc --bin test.sol -o test.abi
2. 安装abigen工具
用来生成go文件,
下载文件:github地址
找到这个main.go文件,进行go build,生成abigen.exe文件。
然后放在bin目录下的这里
然后就可以在这里验证了
使用abigen工具生成go文件...
日期:2022-11-25 03:47:00
阅读:871
首先可以先看看这篇文章,对锁有些了解
GO语言并发编程之互斥锁、读写锁详解
Mutex-互斥锁
Mutex 的实现主要借助了 CAS 指令 + 自旋 + 信号量
数据结构:
type Mutex struct {
state int32
sema uint32
}
上述两个加起来只占 8 字节空间的结构体表示了 Go语言中的互斥锁
状态:
在默认情况下,互斥锁的所有状态位都是 0,int32 中的不同位分别表示了不同的状态:
1位表示是否被锁定
1位表示是否有协程已经被唤醒
1位表示是否处于饥饿状态
剩下29位表示阻塞的协程数
正常模式和饥饿模式
正常模式:所有gorou...
日期:2022-11-25 03:46:59
阅读:895
一、标准库log介绍
Go语言内置的log包实现了简单的日志服务。
1、使用Logger
log包定义了Logger类型,该类型提供了一些格式化输出的方法。
log包也提供了一个预定义的“标准”logger,可以通过调用函数Print系列(Print|Printf|Println)、Fatal系列(Fatal|Fatalf|Fatalln)、和Panic系列(Panic|Panicf|Panicln)来使用,比自行创建一个logger对象更容易使用。
logger会打印每条日志信息的日期、时间,默认输出到系统的标准错误。
Fatal系列函数会在写入日志信息后调用os.Exit(1)。
Panic系...
日期:2022-11-25 03:46:59
阅读:878
背景
通常我们处理文件都是用python+pandas,确实很香。但是今天突然有人找我用go写一个合并两个csv文件的,需要将两个csv按id进行合并,大致如下图
思路很简单,先读入两个csv文件,然后遍历比较id,如果相同就把另一个文件的内容加到第一个中。然后创建merge.csv,将上一步得到的数据写入csv即可。
代码部分
package main
import (
"encoding/csv"
"log"
"os"
"fmt"
)
func join(fileName1 string, fileName2 string) (row [][]string) {
f...
日期:2022-11-25 03:46:58
阅读:862
前言
日常开发中我们大概率会遇到超时控制的场景,比如一个批量耗时任务、网络请求等;一个良好的超时控制可以有效的避免一些问题(比如 goroutine 泄露、资源不释放等)。
Timer
在 go 中实现超时控制的方法非常简单,首先第一种方案是 Time.After(d Duration):
func main() {
fmt.Println(time.Now())
x := <-time.After(3 * time.Second)
fmt.Println(x)
}
output:
2021-10-27 23:06:04.304596 +0800 CST m=+0.000085653...
日期:2022-11-25 03:46:58
阅读:866
GO 语言的 for…range 能做什么呢? for…range 如何使用 ? for…range 的返回值有哪些情况,可以对于任何数据结构使用吗? for…range 的返回值如果不需要,可以如何处理? for…range 的数据是如何传递的? 刚学习 golang 的 xdm 会不会有上面的疑问?其实很简单,我们就一个一个的来分享和实操一遍
GO 语言的 for…range 能做什么呢?
golang 的 for…range 是 go 自身的语法,可以用来遍历数据结构,有如下数据结构可以遍历
切片 slice
数...
日期:2022-11-25 03:46:57
阅读:866
1. 什么是闭包?
一个函数内引用了外部的局部变量,这种现象,就称之为闭包。
例如下面的这段代码中,adder 函数返回了一个匿名函数,而该匿名函数中引用了 adder 函数中的局部变量 sum ,那这个函数就是一个闭包。
package main
import "fmt"
func adder() func(int) int {
sum := 0
return func(x int) int {
sum += x
return sum
}
}
而这个闭包中引用的外部局部变量并不会随着 adder 函数的返回而被...
日期:2022-11-25 03:46:57
阅读:888
学习 Go 语言的开发者越来越多了,很多小伙伴在使用时,就会遇到种种不理解的问题。
其中一点就是包的循环引用的报错:
package command-line-arguments
imports github.com/eddycjy/awesome-project/a
imports github.com/eddycjy/awesome-project/b
imports github.com/eddycjy/awesome-project/a: import cycle not allowed
一下子就很懵逼了,为什么 Go 不支持包之间的循环引用呢,这就很不解了,难道还影响性能了?
如下图:...
日期:2022-11-25 03:46:56
阅读:876
redigo 对 发布订阅的使用
redigo 对redis 的发布订阅机制放在pubsub.go 中 订阅主题后 通过Receive() 函数接受发布订阅主题的消息
// Receive returns a pushed message as a Subscription, Message, Pong or error.
// The return value is intended to be used directly in a type switch as
// illustrated in the PubSubConn example.
func (c PubSubConn) Receive() interf...
日期:2022-11-25 03:46:56
阅读:862
Go 是一门带 GC 的语言,因此,大家很容易认为它不会有内存泄露问题。 大部分时候确实不会,但如果有些时候使用不注意,也会导致泄露。
本文案例来自谷歌云的代码,探讨如何找到并修复 Go 中的内存泄露。(确切来说是因为资源泄露导致的内存泄露,除了本文介绍的,还有一些其他泄露的情况)
这篇文章回顾了我如何发现内存泄漏、如何修复它,以及我如何修复 Google 示例 Go 代码中的类似问题,以及我们如何改进我们的库以防止将来发生这种情况。
Google Cloud Go 客户端库 [1] 通常在后台使用 gRPC 来连接 Google Cloud API。创建 API 客户端时,库会初始化与 API 的连接,然后保持该连接处于打开...
日期:2022-11-25 03:46:55
阅读:906
1、互斥锁Mutex
1.1 Mutex介绍
Go 语言的同步工具主要由 sync 包提供,互斥锁 (Mutex) 与读写锁 (RWMutex) 就是sync 包中的方法。
互斥锁可以用来保护一个临界区,保证同一时刻只有一个 goroutine 处于该临界区内。主要包括锁定(Lock方法)和解锁(Unlock方法)两个操作,首先对进入临界区的goroutine进行锁定,离开时进行解锁。
使用互斥锁 (Mutex)时要注意以下几点:
不要重复锁定互斥锁,否则会阻塞,也可能会导致死锁(deadlock);
要对互斥锁进行解锁,这也是为了避免重复锁定;
不要对未锁定或者已解锁的互斥锁解锁;
不要在多个函数之...
日期:2022-11-25 03:46:55
阅读:883
xdm,我们都知道 golang 是天生的高并发,高效的编译型语言
可我们也都可知道,工具再好,用法不对,全都白费,我们来举 2 个常用路径来感受一下
struct 和 map 用谁呢?
计算量很小的时候,可能看不出使用 临时 struct 和 map 的耗时差距,但是数量起来了,差距就明显了,且会随着数量越大,差距越发明显
当我们遇到键和值都可以是固定的时候,我们选择 struct 比 选择 map 的方式 高效多了
我们模拟循环计算 1 亿 次,看看使用各自的数据结构会耗时多少
循环前计算一下当前时间
循环后计算一下当前时间
最后计算两个时间的差值,此处我们使用 毫秒为单位
func ma...
日期:2022-11-25 03:46:54
阅读:882
1、命令行工具概述
日常命令行操作,相对应的众多命令行工具是提高生产力的必备工具,鼠标能够让用户更容易上手,降低用户学习成本。 而对于开发者,键盘操作模式能显著提升生产力,还有在一些专业工具中, 大量使用快捷键代替繁琐的鼠标操作,能够使开发人员更加专注于工作,提高效率,因为键盘操作模式更容易产生肌肉记忆
举个栗子:我司业务研发,前些年在我们的强力推动下(被迫)转向使用了 git 作为版本控制,开始使用的是图形化“小乌龟”工具。后续出现几次问题解决起来较麻烦后,推荐其使用原生的 git 命令行。如今,使用 git 命令行操作版本控制可谓 “一顿操作猛如虎......”
命令行(键盘)操作在很大程度上可以提高工作效率,与之相...
日期:2022-11-25 03:46:54
阅读:786
前言:
我已经在生产中使用 Go 一段时间了,因为它的构建规模较小,并且由 goroutines 提供的并发性能以及直接在机器上运行构建的能力,所以我非常喜欢它的快速和可靠。
由于标准包的速度非常快,您可以在不使用任何第三方库或框架的情况下构建生产就绪的微服务。这并不是说 Go 中没有提供更多灵活性或速度的框架,只是它们不那么受欢迎。
官方通常告诉你坚持使用标准库。具有讽刺意味的是, golang 框架 的顶级 Google 搜索结果一般都是关于为什么不应该使用标准库。
我对标准库的替代品进行了一些研究和基准测试,以了解它们的表现。我将它们分为我认为是关键的微服务组件。
所有基准测试都在下面列出的配置上运行。虽然正常的基准...
日期:2022-11-25 03:46:54
阅读:895
图的实现
所谓图就是节点及其连接关系的集合。所以可以通过一个一维数组表示节点,外加一个二维数组表示节点之间的关系。
//图的矩阵实现
typedef struct MGRAPH{
nodes int[]; //节点
edges int[][]; //边
}mGraph;
然而对于一些实际问题,其邻接矩阵中可能存在大量的0值,此时可以通过邻接链表来表示稀疏图,其数据结构如图所示
其左侧为图的示意图,右侧为图的邻接链表。红字表示节点序号,链表中为与这个节点相连的节点,如1节点与2、5节点相连。由于在go中,可以很方便地使用数组来代替链表,所以其链表结构可以写为
pac...
日期:2022-11-25 03:46:53
阅读:889
Go 语言中的 encoding/json 库提供了复杂的将 Go 中各种类型与JSON格式之间转换的功能, 我们主要使用以下几个功能:
将一个切片、结构体或字典序列化成 JSON 格式的字符串【字节流】。
将一个 JSON 格式的字符串【字节流】反序列化成一个切片、结构体或字典。
序列化
序列化使用 json 库中的Marshal函数:
func Marshal(v interface{}) ([]byte, error)
1. 结构体序列化
比如使用以下的结构体表示一部电影:
type Movie struct {
Title string
Year int `json:...
日期:2022-11-25 03:46:53
阅读:763