[toc]
- 方法的 receiver 是类型的实例指针变量(带星号 *)
如果方法体内有对结构体字段进行修改的操作,那么无论类型的实例是不是指针,调用此方法都会造成结构体字段发生实质性的改变。
- 方法的 receiver 是类型的实例变量(不带星号 *)
如果方法体内有对结构体字段进行修改的操作,那么无论类型的实例是不是指针,调用此方法都不会造成结构体字段发生实质性的改变。
浅拷贝(Shallow Clone):将 src 浅拷贝给 dst,对 dst 进行改变的话,src 也会跟着改变。
深拷贝(Deep Clone):将 src 深拷贝给 dst,对 dst 进行改变的话,src 不会跟着改变。
定义两个结构体:
type Address struct {
Province string
}
type Student struct {
Name string
Home *Address
}
浅拷贝的例子:
func TestShallowClone(t *testing.T) {
stu1 := &Student{
Name: "tom",
Home: &Address{
Province: "安徽",
},
}
stu2 := stu1
t.Logf("student1 {name: %s, home: %s}", stu1.Name, stu1.Home.Province) // output: student1 {name: tom, home: 安徽}
t.Logf("student2 {name: %s, home: %s}", stu2.Name, stu2.Home.Province) // output: student2 {name: tom, home: 安徽}
stu2.Name = "alice"
stu2.Home.Province = "河南"
t.Logf("student1 {name: %s, home: %s}", stu1.Name, stu1.Home.Province) // output: student1 {name: alice, home: 河南}
t.Logf("student2 {name: %s, home: %s}", stu2.Name, stu2.Home.Province) // output: student2 {name: alice, home: 河南}
}
深拷贝的例子:
func TestDeepClone(t *testing.T) {
stu1 := &Student{
Name: "tom",
Home: &Address{
Province: "安徽",
},
}
tmp := *stu1
tmpHome := *stu1.Home
tmp.Home = &tmpHome
stu2 := &tmp
t.Logf("student1 {name: %s, home: %s}", stu1.Name, stu1.Home.Province) // output: student1 {name: tom, home: 安徽}
t.Logf("student2 {name: %s, home: %s}", stu2.Name, stu2.Home.Province) // output: student2 {name: tom, home: 安徽}
stu2.Name = "alice"
stu2.Home.Province = "河南"
t.Logf("student1 {name: %s, home: %s}", stu1.Name, stu1.Home.Province) // output: student1 {name: tom, home: 安徽}
t.Logf("student2 {name: %s, home: %s}", stu2.Name, stu2.Home.Province) // output: student2 {name: alice, home: 河南}
}
关于 golang 拷贝的优质文章可参考:https://zhuanlan.zhihu.com/p/161210711。
ECDSA 的签名生成过程如下:
-
随机选择密钥
$sk \leftarrow Z_p^*$ ,利用基点$G$ 计算公钥$pk = k \cdot G$ ; -
选择一个随机数
$k \leftarrow Z_p^*$ ,计算点$K= k \cdot G$ ,取$K$ 的$x$ 坐标轴上的值$x_K$ ,让$r = x_K$ 。 -
计算消息
$m$ 的摘要值$h = H(m)$ ; -
计算签名
$s= k^{-1}(h + r \cdot sk)$ ; -
返回签名
$(r,s)$ 。
ECDSA 的签名验证过程如下:
-
计算消息
$m$ 的摘要值$h = H(m)$ ; -
计算签名的逆元
$s^{-1}$ ; -
计算点
$K' = (h \cdot s^{-1}) \cdot G + (r \cdot s^{-1}) \cdot pk$ ; -
对比
$r$ 与$K'$ 的$x$ 轴上的值$x_{K'}$ 是否相同。
在上述签名验证过程中,只要
对于上述问题,比特币采用的解决办法是:确保计算出来的