沈阳做网站优化,erp信息管理系统,网站支付模块,wordpress 问卷插件往期回顾#xff1a;
Go语言开发小技巧易错点100例#xff08;一#xff09;Go语言开发小技巧易错点100例#xff08;二#xff09;Go语言开发小技巧易错点100例#xff08;三#xff09;Go语言开发小技巧易错点100例#xff08;四#xff09;Go…往期回顾
Go语言开发小技巧易错点100例一Go语言开发小技巧易错点100例二Go语言开发小技巧易错点100例三Go语言开发小技巧易错点100例四Go语言开发小技巧易错点100例五Go语言开发小技巧易错点100例六Go语言开发小技巧易错点100例七Go语言开发小技巧易错点100例八Go语言开发小技巧易错点100例九Go语言开发小技巧易错点100例十
本期看点技巧类用【技】表示易错点用【易】表示
Go函数式编程【技】不建议map使用指针类型作为Key【易】直接使用值为nil的slice和map【易】
正文开始
Go函数式编程
函数式编程是一种编程范式。函数式编程语言最重要的基础是λ演算λ演算的函数可以接受函数当作输入参数和输出返回值。与指令式编程相比函数式编程强调函数的计算比指令的执行重要。与过程化编程相比函数式编程里函数的计算可随时调用。
此外在函数式编程中函数是一等公民这意味着它们可以绑定到名称包括本地标识符作为参数传递并从其他函数返回就像任何其他数据类型一样。这允许以声明性和可组合的风格编写程序其中小功能以模块化方式组合。
我们来展示一下Go语言的函数式编程大家可以猜想一下这段代码的运行结果
func PlayFunc(str string, fn func() error) error {fmt.Println(str)defer func() {fmt.Println(defer 1 ...)}()defer func() {fmt.Println(defer 2 ...)}()return fn()
}func main() {err : PlayFunc(string ..., func() error {fmt.Println(func ...)return nil})fmt.Println(err)
}答案
string ...
func ...
defer 2 ...
defer 1 ...
nil不建议map使用指针类型作为Key
在Go语言中指针类型不能作为map的键key的主要原因是因为指针的值是动态的并且可能会发生变化。当使用指针作为map的键时如果两个指针指向同一个内存地址它们被认为是相等的但是如果指针所指向的值发生变化那么这两个指针就不再相等了。
举个例子
type Student struct {Id stringName string
}func TestMapPointKey(t *testing.T) {m : make(map[*Student]struct{})m[Student{Id: 1, Name: zs}] struct{}{}_, ok : m[Student{Id: 1, Name: zs}]fmt.Println(ok) // false
}为了解决这个问题Go语言规定map的键必须是不可变immutable的类型例如基本类型如整数、字符串等或者具有只读属性的复合类型如数组、结构体等。这些类型的值在创建后就不能被修改因此它们可以作为map的键使用。
比如这样
func TestMap(t *testing.T) {m : make(map[Student]struct{})m[Student{Id: 1, Name: zs}] struct{}{}_, ok : m[*Student{Id: 1, Name: zs}]fmt.Println(ok) // true
}基本数据类型下的指针类型也会存在这个问题
func TestMapInt(t *testing.T) {m : make(map[*int]struct{})p : 1m[p] struct{}{}p1 : 1_, ok : m[p1]fmt.Println(ok) // false m2 : make(map[int]struct{})p2 : 1m2[p2] struct{}{}p3 : 1_, ok m2[p3]fmt.Println(ok) // true
}总结起来Go语言中指针类型不能作为map的键是因为指针的值是动态的可能会发生变化而map的键需要是不可变的类型。
直接使用值为nil的slice和map
func TestEmptyMap(t *testing.T) {var m map[string]struct{}m[name] struct{}{}
}这段代码是一个Go语言的测试函数但是它有一个错误。声明了一个名为m的map该map的键是字符串类型而值是空结构体类型struct{}。由于m是一个空的map即它还没有任何键值对因此不能直接赋值。这将导致运行时错误。为了修复这个错误需要首先为map m分配一个值比如 m make(map[string]struct{})然后再尝试插入键值对。