当前位置: 首页 > 科技观察

Golang:三个常见的编程问题

时间:2023-03-15 22:01:57 科技观察

每一种语言都是独一无二的。这些常见编程挑战的解决方案在Java(我以前最喜欢的编程语言)中有很大不同。而且,如果我敢说,用Java解决这些问题要直观得多。Golang有一种独特的方式来解决这些问题。我在下面列出的解决方案最初对我来说不是很直观,但现在它已成为第二天性。我不确定它们是否是“地道的GO”——坦率地说,我不知道地道的GO是什么。也许有更好的、不同的方法来解决这些问题——我很想听听你的想法。因此,让我们深入探讨编程挑战。问题1:我需要维护一组“项目”。但是,哦不,Golang没有“集合”数据结构。解决方案之一:Golang没有“Set”,有“Map”。地图的键集是一组独特的项目。您可以执行以下操作(https://play.golang.com/p/tayo3H5mi56):packagemainimport“fmt”typeSetstruct{mmap[string]bool}funcNewSet()Set{m:=make(map[string]bool)returnSet{m:m}}func(s*Set)Contains(valstring)bool{_,ok:=s.m[val]returnok}func(s*Set)Add(valstring){s.m[val]=true}func(s*Set)Remove(valstring){delete(s.m,val)}funcmain(){s:=NewSet()s.Add("foo")fmt.Printf("shasfoo:%t.shasbar:%t\n",s.Contains("foo"),s.Contains("bar"))s.Remove("foo")fmt.Printf("shasfoo:%t.shasbar:%t\n",s.Contains("foo"),s.Contains("bar"))}使用map作为集合的底层数据结构的优势在于,您仍然可以从超快速的map键查找、底层哈希优化中获益,并且您最终会编写更少的代码。问题2:我需要比较两个值,但“==”并不总是有效。解决方案之一:让我们了解“==”在哪里起作用,在哪里不起作用。包含映射或切片类型的结构ABCstruct{aintbstringc[]int}错误:无效操作:a==b(structcontaining[]intcannotbecompared)structwithpointer。嗯,实际上指针是可比较的,但它们并不总能给你想要的结果。a,b:=1,1fmt.Println(&a==&b)//错误输入reflect.DeepEqual现在,这将按预期工作(在大多数情况下)://ABC-AsimpletypetypeABCstruct{aintbstringc[]int}vara=ABC{a:1,b:"10",c:[]int{1,2}}varb=ABC{a:1,b:"10",c:[]int{1,2}}反射.DeepEqual(a,b)Example#2a,b:=1,1fmt.Println(&a==&b)//Falsefmt.Println(reflect.DeepEqual(&a,&b))//TrueitwillbringyoumoreGoodresult-however,如果您的结构中有浮点数或时间字段,则需要忽略它们。您将需要编写自定义equals方法//ABC-AsimpletypetypeABCstruct{aintbstringttime.Time//Ignoretimewhilecomparingtostructs}vara=ABC{a:1,b:"10",t:time.Now()}varb=ABC{a:1,b:"10",t:time.Now()}fmt.Println(a==b,equals(a,b))funcequals(val1,val2ABC)bool{returnval1.a==val2.a&&val1。b==val2.b}除非您别无选择,否则您不想编写自定义等于函数-但您是否应该更喜欢reflect.DeepEqual而不是==运算符?本质上,如果==为真,则reflect.DeepEqual保证为真,否则不为真。所以默认情况下reflect.DeepEqual是可用的。除非你有性能限制:funcBenchmarkOperator(t*testing.B){fori:=0;i