前言
最近做项目,开发go的sdk,其中就涉及接口编程,类似typescript,指针,指针类型。就像C语音一样,指针就涉及指针引用。
在go语言中
*类型 在类型上表示当前类型是指针类型,在变量上表示指针的值
&变量 表示是当前变量的指针
demo
使用结构体模拟:
package main
import "fmt"
type Man struct {
name string
age int
}
func sayHello(m Man) string {
m.name = "not tom"
return "hello," + m.name
}
func sayHi(m *Man) string {
m.name = "jim"
return "hi, " + m.name
}
func main() {
man := Man{
name: "tom",
age: 26,
}
fmt.Println(sayHello(man))
fmt.Println(man.name)
fmt.Println("---------------------")
fmt.Println(sayHi(&man))
fmt.Println(man.name)
}
模拟demo,一个使用结构体参数,一个使用指针参数,结果如下
可以看到使用结构体传递,在函数里面修改的值并不会传递到函数之外,而通过指针类型传递的结构体却可以修改结构体的值。可以说明实际上函数的参数实际上是栈引用的结构体副本,只有修改指针,即内存地址存储的数据结构体的值才会真正修改数据。
如果使用基本数据类型,结果一样,反射的时候就是使用指针设置值,才能修改成功,也是相同的道理。
对比Java语音
(138条消息) Java 变量参数传入方法,修改后是否影响外面的值_fenglllle的博客-CSDN博客
笔者在2018年写了Java语音方法对参数值的修改是否影响外面的值,实际上也是一样的,殊途同归,但是Java语言不能直接操作基础数据类型的指针,只能操作引用对象的指针,从某种程度看,引用对象即是指针,实际上Java也是这样做的,方法执行时,栈的变量指向堆的对象内存地址。
go语言可以直接操作基本数据类型的指针也是很灵活的,这点是Java不具备的,Java需要封装对象才行,可能也是面向对象设计决定的,go是面向接口,鸭子类型😅。即相同的行为就认为是一类。
Makefile文件技巧
实际上这个与go语言的编译环境有关,笔者在使用mosn(开源的sidecar)编译时发现一些依赖包无论如何都去官方仓库去下载,国内环境墙(大家都明白),问题是go env明明设置了代理
解决方法是在Makefile中配置代理即可,😄,Makefile的环境跟用户环境是不一样的,所以不能使用用户设置的代理。
总结
实际上很多语音都有借鉴,有时候设计殊途同归,典型的就是算法,任何语言,算法结果是相同的。&取地址,*表示指针的值