go 语言指针,值引用和指针引用

本文探讨了Go语言中的指针与接口编程,通过示例展示了Go中结构体参数与指针参数的区别,强调了指针在修改值方面的关键作用。同时,对比了Java的引用对象,指出两者在参数传递上的相似性。文章还提及了Go语言在Makefile中设置代理的问题,以及不同语言对基础数据类型指针操作的差异。
摘要由CSDN通过智能技术生成

前言

最近做项目,开发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的环境跟用户环境是不一样的,所以不能使用用户设置的代理。

总结

实际上很多语音都有借鉴,有时候设计殊途同归,典型的就是算法,任何语言,算法结果是相同的。&取地址,*表示指针的值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值