日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Golang:三個(gè)常見的編程問題

每種語言都是唯一的。 這些常見的編程挑戰(zhàn)的解決方案在Java(我以前最喜歡的編程語言)中非常不同。 而且,如果我敢說這一點(diǎn),那么用Java更直觀地解決這些問題。

創(chuàng)新互聯(lián)公司是創(chuàng)新、創(chuàng)意、研發(fā)型一體的綜合型網(wǎng)站建設(shè)公司,自成立以來公司不斷探索創(chuàng)新,始終堅(jiān)持為客戶提供滿意周到的服務(wù),在本地打下了良好的口碑,在過去的十載時(shí)間我們累計(jì)服務(wù)了上千家以及全國政企客戶,如發(fā)電機(jī)回收等企業(yè)單位,完善的項(xiàng)目管理流程,嚴(yán)格把控項(xiàng)目進(jìn)度與質(zhì)量監(jiān)控加上過硬的技術(shù)實(shí)力獲得客戶的一致贊譽(yù)。

Golang有解決這些問題的獨(dú)特方法。 我下面列出的解決方案最初對我來說不是很直觀,但是現(xiàn)在已經(jīng)成為第二自然。 我不確定它們是否是"慣用的GO"-坦率地說,我不知道什么是慣用的GO。

也許會(huì)有更好的,不同的方式來解決這些問題-我很想聽聽您的想法。

因此,讓我們深入研究編程挑戰(zhàn)。

問題1:我需要維護(hù)一組"物品"。 但是,哦,不,Golang沒有" Set"數(shù)據(jù)結(jié)構(gòu)。

解決方案之一:Golang沒有"Set",但有"Map"。 映射的鍵集是一組唯一的項(xiàng)目。

您可以執(zhí)行以下操作(https://play.golang.com/p/tayo3H5mi56):

 
 
 
  1. package main 
  2. import "fmt" 
  3. type Set struct {  
  4.   m map[string]bool 
  5. func NewSet() Set {  
  6.   m := make(map[string]bool)  
  7.   return Set{m: m} 
  8.  
  9. func (s *Set) Contains(val string) bool {  
  10.   _, ok := s.m[val]  
  11.   return ok 
  12.  
  13. func (s *Set) Add(val string) {  
  14.   s.m[val] = true 
  15.  
  16. func (s *Set) Remove(val string) {  
  17.   delete(s.m, val) 
  18.  
  19. func main() {  
  20.   s := NewSet()  
  21.   s.Add("foo")  
  22.   fmt.Printf("s has foo: %t. s has bar: %t\n", s.Contains("foo"), s.Contains("bar"))  
  23.   s.Remove("foo")  
  24.   fmt.Printf("s has foo: %t. s has bar: %t\n", s.Contains("foo"), s.Contains("bar"))  

將映射用作集合的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)的優(yōu)點(diǎn)是,您仍然受益于超快速的映射鍵查找,基礎(chǔ)哈希優(yōu)化,并且最終編寫的代碼更少。

問題2:我需要比較兩個(gè)值,但" =="并不總是有效。

解決方案之一:讓我們了解" =="在哪里起作用,在哪里不起作用。

包含地圖或切片的結(jié)構(gòu)

 
 
 
  1. type ABC struct { 
  2.    a int 
  3.    b string 
  4.    c []int 
  5. Error: 
  6. invalid operation: a == b (struct containing []int cannot be compared) 

帶指針的結(jié)構(gòu)。

好吧,實(shí)際上指針是可以比較的,但是它們并不總是能為您提供理想的結(jié)果。

 
 
 
  1. a, b := 1, 1 
  2. fmt.Println(&a == &b) // False 

輸入reflect.DeepEqual

現(xiàn)在,這將可以按需工作(大多數(shù)情況下):

 
 
 
  1. //ABC - A simple type 
  2. type ABC struct { 
  3.    a int 
  4.    b string 
  5.    c []int 
  6. var a = ABC{a: 1, b: "10", c: []int{1, 2}} 
  7. var b = ABC{a: 1, b: "10", c: []int{1, 2}} 
  8. reflect.DeepEqual(a, b) 
  9. Example #2 
  10. a, b := 1, 1 
  11. fmt.Println(&a == &b) // False 
  12. fmt.Println(reflect.DeepEqual(&a, &b)) // True 

它將為您帶來更好的結(jié)果-但是,如果您的結(jié)構(gòu)中有浮點(diǎn)數(shù)或時(shí)間字段,則需要忽略。 您將需要編寫自定義的equals方法

 
 
 
  1. //ABC - A simple type 
  2. type ABC struct { 
  3.    a int 
  4.    b string 
  5.    t time.Time // Ignore time while comparing to structs 
  6. var a = ABC{a: 1, b: "10", t: time.Now()} 
  7. var b = ABC{a: 1, b: "10", t: time.Now()} 
  8. fmt.Println(a == b, equals(a, b)) 
  9. func equals(val1, val2 ABC) bool { 
  10.     return val1.a == val2.a && val1.b == val2.b 

除非您別無選擇,否則您將不希望編寫自定義的equals函數(shù)-但是,與==運(yùn)算符相比,您應(yīng)該更喜歡reflect.DeepEqual嗎? 本質(zhì)上,如果==將為true,則保證reflect.DeepEqual為true,反之則不為true。 因此,默認(rèn)情況下可以使用reflect.DeepEqual。 除非您有性能限制,否則:

 
 
 
  1. func BenchmarkOperator(t *testing.B) { 
  2.    for i := 0; i < t.N; i++ { 
  3.       if a == b { 
  4.       } 
  5.    } 
  6. func BenchmarkReflectDeep(t *testing.B) { 
  7.    for i := 0; i < t.N; i++ { 
  8.       if reflect.DeepEqual(a, b) { 
  9.       } 
  10.    } 
  11. BenchmarkOperator-8         44614131            24.8 ns/op         0 B/op          0 allocs/op 
  12. BenchmarkReflectDeep-8        823174          1558 ns/op          96 B/op          2 allocs/op 

" =="比reflect.DeepEqual快。 更快。

問題#3:我需要使用結(jié)構(gòu)作為映射的鍵-但我的結(jié)構(gòu)包含要忽略的切片,指針或字段。

解決方案之一:Golang中的映射鍵評估使用==運(yùn)算符,而不使用reflect.DeepEqual。

解決此問題的一種方法是使用自定義密鑰創(chuàng)建邏輯。

 
 
 
  1. //Obvious solution that will not work 
  2. type A struct { 
  3.     i *int 
  4. i, j := 1, 1 
  5. a, b := A{i: &i}, A{i: &j} 
  6. m := map[A]bool{} 
  7. m[a] = true 
  8. _, ok := m[b] 
  9. fmt.Println(ok) // False key b doesn't exist in map m 
  10. //Custom keys- solution 
  11. func customKey(a A) int { 
  12.  return *a.i 
  13. i, j := 1, 1 
  14. a, b := A{i: &i}, A{i: &j} 
  15.  m := map[int]bool{} 
  16.  m[customKey(a)] = true 
  17.  _, ok := m[customKey(b)] 
  18.  fmt.Println(ok)// This will return true 

獎(jiǎng)勵(lì)問題:如何比較兩個(gè)地圖? [問題2和問題3的推論]

https://play.golang.com/p/0ac2HIyiJ9g

 
 
 
  1. key, val := "key", "val" 
  2. key1, val1 := "key", "val" 
  3. abc := map[*string]string{&key: val} 
  4. abc2 := map[*string]string{&key1: val1} 
  5. def := map[string]*string{key: &val} 
  6. def2 := map[string]*string{key1: &val1} 
  7. fmt.Println(reflect.DeepEqual(abc, abc2)) //false  
  8. fmt.Println(reflect.DeepEqual(def, def2)) //true 

首先要注意的是,您不能通過==運(yùn)算符比較地圖。 您可以通過reflect.DeepEqual比較兩個(gè)地圖。 按照reflect.DeepEqual規(guī)則,將映射鍵與==運(yùn)算符進(jìn)行比較,并將值與reflect.DeepEqual進(jìn)行遞歸比較。


當(dāng)前名稱:Golang:三個(gè)常見的編程問題
網(wǎng)站網(wǎng)址:http://www.5511xx.com/article/dhghedh.html