golang 中说明*T包含了T的方法,反之不成立;
例子如下:由于只有*abc实现了wanjm的change方法,所以只有*abc是wanjm的实现,而abc却不是。所以当19行试图传入参数a时,程序报错;应该写为test(&a,12);
-
package main
-
type abc struct{
-
i int
-
}
-
type wanjm interface{
-
change(int);
-
}
-
-
func (this * abc) change(i int){
-
this.i=i;
-
}
-
-
func test(a wanjm,value int){
-
a.change(value);
-
}
-
-
func main(){
-
var a=abc{10}
-
test(a,12);
-
print(a.i);
-
}
说明:
1. wanjm是一个interface,每一个实现change方法的都是wanjm对象;
2. test的第一个参数是wanjm,所以传入参数时,只要该对象实现了change,都可以传入;
3. *abc定义了change方法, 而abc没有实现. 所以19行只能传入&a; 否则编译出错;
-
package main
-
-
type abc struct {
-
i int
-
}
-
type wanjm interface {
-
change(int)
-
}
-
-
func (this abc) change(i int) {
-
this.i = i
-
}
-
-
func test(a wanjm, value int) {
-
a.change(value)
-
}
-
-
func main() {
-
var a = abc{10}
-
test(a, 12)
-
print(a.i)
-
test(&a, 12)
-
print(a.i)
-
}
1.当我们让abc实现change方法时, 20行,22行都可以调用了. *T自动包含了T的方法,但是输出都是10;因为这是参数传递,无法改变外面的变量;
2. func (this *abc) change(i int) {this.i = i} 我们添加这段代码, 试图给*abc也实现change方法,编译会报错. change方法被重复定义. 因为*abc自动包含abc方法,再明确定义一个,那就是两个了;
那要多到上面遇到的问题 让change能整整改变i的值, 该怎么办呢?代码如下:
-
package main
-
-
type abc struct {
-
i int
-
}
-
type wanjm interface {
-
change(int)
-
}
-
-
func (this abc) change(i int) {
-
this.i = i
-
}
-
-
type nabc abc
-
-
func (this *nabc) change(i int) {
-
this.i = i
-
}
-
-
func test(a wanjm, value int) {
-
a.change(value)
-
}
-
-
func main() {
-
var a = abc{10}
-
var b = nabc(a)
-
test(a, 12)
-
print(a.i, "\n") //10
-
test(&b, 13)
-
print(b.i, "\n") //12
-
print(a.i, "\n") //10
-
-
c := (*nabc)(unsafe.Pointer(&a))//通过该函数实现类型转换;
-
d:=*c; //内存复制;
-
test(c, 14)
-
print(a.i, "\n") //14
-
print(d.i,"\n") //10;
-
}
1. 14行,重新定义了nabc类型;
2. 16行, *nabc重新定义change方法;
3. 26行:将a强行转化为nabc类型;
4. 可以执行了.
5. 从输出结果看b.i得到更新. 但是a.i没有得到更新;
6. 所以26行的强行转化实际是新生成了一个变量; a,b不是同一个内容, 这个很关键;
7. 33行可以达到调用*nabc置换内部值的效果,但是不知道有哪些不安全因素;
阅读(1115) | 评论(0) | 转发(0) |