Golang三個(gè)常見(jiàn)的編程問(wèn)題是什么

這篇文章主要講解了“Golang三個(gè)常見(jiàn)的編程問(wèn)題是什么”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Golang三個(gè)常見(jiàn)的編程問(wèn)題是什么”吧!

目前創(chuàng)新互聯(lián)建站已為上千的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)站空間、成都網(wǎng)站托管、企業(yè)網(wǎng)站設(shè)計(jì)、長(zhǎng)泰網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。

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

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

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

package main import "fmt" type Set struct {    m map[string]bool } func NewSet() Set {    m := make(map[string]bool)    return Set{m: m} }  func (s *Set) Contains(val string) bool {    _, ok := s.m[val]    return ok }  func (s *Set) Add(val string) {    s.m[val] = true }  func (s *Set) Remove(val string) {    delete(s.m, val) }  func main() {    s := NewSet()    s.Add("foo")    fmt.Printf("s has foo: %t. s has bar: %t\n", s.Contains("foo"), s.Contains("bar"))    s.Remove("foo")    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)化,并且最終編寫的代碼更少。

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

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

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

type ABC struct {    a int    b string    c []int } Error: invalid operation: a == b (struct containing []int cannot be compared)

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

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

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

輸入reflect.DeepEqual

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

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

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

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

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

func BenchmarkOperator(t *testing.B) {    for i := 0; i < t.N; i++ {       if a == b {       }    } } func BenchmarkReflectDeep(t *testing.B) {    for i := 0; i < t.N; i++ {       if reflect.DeepEqual(a, b) {       }    } } BenchmarkOperator-8         44614131            24.8 ns/op         0 B/op          0 allocs/op BenchmarkReflectDeep-8        823174          1558 ns/op          96 B/op          2 allocs/op

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

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

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

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

//Obvious solution that will not work type A struct {     i *int } i, j := 1, 1 a, b := A{i: &i}, A{i: &j} m := map[A]bool{} m[a] = true _, ok := m[b] fmt.Println(ok) // False key b doesn't exist in map m //Custom keys- solution func customKey(a A) int {  return *a.i } i, j := 1, 1 a, b := A{i: &i}, A{i: &j}  m := map[int]bool{}  m[customKey(a)] = true  _, ok := m[customKey(b)]  fmt.Println(ok)// This will return true

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

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

key, val := "key", "val" key1, val1 := "key", "val" abc := map[*string]string{&key: val} abc2 := map[*string]string{&key1: val1} def := map[string]*string{key: &val} def2 := map[string]*string{key1: &val1} fmt.Println(reflect.DeepEqual(abc, abc2)) //false  fmt.Println(reflect.DeepEqual(def, def2)) //true

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

感謝各位的閱讀,以上就是“Golang三個(gè)常見(jiàn)的編程問(wèn)題是什么”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Golang三個(gè)常見(jiàn)的編程問(wèn)題是什么這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

名稱欄目:Golang三個(gè)常見(jiàn)的編程問(wèn)題是什么
轉(zhuǎn)載源于:http://www.muchs.cn/article28/ijsejp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、響應(yīng)式網(wǎng)站、網(wǎng)站設(shè)計(jì)公司、做網(wǎng)站網(wǎng)站設(shè)計(jì)、企業(yè)網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)