Go 的函数名和函数变量有什么区别呢

2018-08-01 21:40:36 +08:00
 Aphsss

源自自己写的单元测试

var GetApplicationPortVar = func() (int){
	return 3000
}

func TestGetApplicationPortVar(t *testing.T) {

	savedFun := GetApplicationPortVar
	GetApplicationPortVar := func() int {
		return 4000
	}
	defer func() {GetApplicationPortVar = savedFun}()

	if GetApplicationPortVar() != 4000 {
		t.Error("GetApplicationPortVar() Want 4000, But", GetApplicationPortVar())
	}
}

问题一 这个GetApplicationPortVar应该是指向函数的指针呢 还是是这个函数呢

再看第二个

func GetApplicationPortFun() (int){
	return 3000
}

func TestGetApplicationPortFun(t *testing.T) {

	savedFun := GetApplicationPortFun
	GetApplicationPortFun := func() int {
		return 4000
	}
	defer func() {GetApplicationPortFun = savedFun}()

	if GetApplicationPortFun() != 4000 {
		t.Error("GetApplicationPortFun() Want 4000, But", GetApplicationPortFun())
	}
}

这里的 GetApplicationPortFun 是一个函数名,原来我写的是

	GetApplicationPortFun = func() int {
		return 4000
	}

但是这样编译会报错,所以

问题二 这里的 GetApplicationPortFun 具体是什么呢, 和 GetApplicationPortVar 有什么区别呢

问题三 第二个单元测试有问题吗

问题四 在定义函数的时候,使用GetApplicationPortFunGetApplicationPortVar两种方式那种比较好呢,为什么呢

谢谢

1305 次点击
所在节点    Go 编程语言
1 条回复
wwwjfy
2018-08-01 22:11:46 +08:00
1. 没有函数指针这个概念。不说测试的话,两个一个意思
2. 可以认为 var 定义的话,这个名字指向的函数可以被覆盖。可以认为是 var 和 const 的区别
3. 同上。const 就不能覆盖了
4. 不管测试的话一样,要测试只能用 var

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/476079

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX