рдЬрд╛ рдореЗрдВ рд╣реИрд╢ рдЯреЗрдмрд▓ред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╡рд┐рд╡рд░рдг

рдЫрд╡рд┐


рд╣рдо рдЬреЗрдирд░рд┐рдХ рдХреЗ рдмрд┐рдирд╛ рднрд╛рд╖рд╛ рдореЗрдВ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВрдЧреЗ, рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рд╣реИрд╢ рддрд╛рд▓рд┐рдХрд╛ рдХреНрдпрд╛ рд╣реИ, рдЗрд╕реЗ рдЧреЛ рдореЗрдВ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдкреЗрд╢реЗрд╡рд░реЛрдВ рдФрд░ рд╡рд┐рдкрдХреНрд╖ рдХреНрдпрд╛ рд╣реИрдВ, рдФрд░ рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЖрдкрдХреЛ рдХреНрдпрд╛ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХрдЯ рдХреЗ рддрд╣рдд рд╡рд┐рд╡рд░рдгред



рдЪреЗрддрд╛рд╡рдиреА! рдпрджрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЧреЛ рдореЗрдВ рд╣реИрд╢ рдЯреЗрдмрд▓ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ, рддреЛ рдореИрдВ рдЖрдкрдХреЛ рдореВрд▓ рдмрд╛рддреЗрдВ рдЫреЛрдбрд╝ рдХрд░ рдпрд╣рд╛рдВ рдЬрд╛рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ, рдЕрдиреНрдпрдерд╛ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдХреНрд╖рдг рд╕реЗ рдердХрдиреЗ рдХрд╛ рдЬреЛрдЦрд┐рдо рд╣реИред

рд╣реИрд╢ рдЯреЗрдмрд▓ рдХреНрдпрд╛ рд╣реИ


рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдПрдХ рд╣реИрд╢ рддрд╛рд▓рд┐рдХрд╛ рдХреНрдпрд╛ рд╣реИред рдпрд╣ рдПрдХ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдХреБрдВрдЬреА-рдореВрд▓реНрдп рдЬреЛрдбрд╝реЗ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдФрд░, рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд░рдЦрдиреЗ:

  • рдорд╛рдирдЪрд┐рддреНрд░рдг: map(key) тЖТ value
  • рдЖрд╡реЗрд╖рдг: insert(map, key, value)
  • delete(map, key) : delete(map, key)
  • рдЦреЛрдЬ: lookup(key) тЖТ value

рдЬрд╛ рднрд╛рд╖рд╛ рдореЗрдВ рд╣реИрд╢ рдЯреЗрдмрд▓


рдЧреЛ рднрд╛рд╖рд╛ рдореЗрдВ рдПрдХ рд╣реИрд╢ рдЯреЗрдмрд▓ рдХреЛ рдореИрдк рдХреАрд╡рд░реНрдб рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдмрд╛рдж рдореЗрдВ рдЗрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ):

  m := make(map[key_type]value_type) m := new(map[key_type]value_type) var m map[key_type]value_type m := map[key_type]value_type{key1: val1, key2: val2} 

рдореБрдЦреНрдп рд╕рдВрдЪрд╛рд▓рди рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ:

  • рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░реЗрдВ:

     m[key] = value 

  • рд╣рдЯрд╛рдиреЗ:

     delete(m, key) 

  • рдЦреЛрдЬ:

     value = m[key] 

    рдпрд╛

     value, ok = m[key] 

рдЬрд╛рдиреЗ рдореЗрдВ рдПрдХ рдореЗрдЬ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдЬрд╛рдУ


рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпрдХреНрд░рдо рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

 package main import "fmt" func main() { m := map[int]bool{} for i := 0; i < 5; i++ { m[i] = ((i % 2) == 0) } for k, v := range m { fmt.Printf("key: %d, value: %t\n", k, v) } } 

рд▓реЙрдиреНрдЪ 1:

 key: 3, value: false key: 4, value: true key: 0, value: true key: 1, value: false key: 2, value: true 

рд░рди 2:

 key: 4, value: true key: 0, value: true key: 1, value: false key: 2, value: true key: 3, value: false 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдЙрдЯрдкреБрдЯ рд░рди рд╕реЗ рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИред рдФрд░ рд╕рднреА рдХреНрдпреЛрдВрдХрд┐ Go рдореЗрдВ рдореИрдк рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рд╣реИ, рдЕрд░реНрдерд╛рдд рдСрд░реНрдбрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЖрд╕-рдкрд╛рд╕ рдЬрд╛рдиреЗ рдкрд░ рдСрд░реНрдбрд░ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдХрд╛рд░рдг рднрд╛рд╖рд╛ рд░рдирдЯрд╛рдЗрдо рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 // mapiterinit initializes the hiter struct used for ranging over maps. func mapiterinit(t *maptype, h *hmap, it *hiter) {... // decide where to start r := uintptr(fastrand()) ... it.startBucket = r & bucketMask(hB)...} 

рдЦреЛрдЬ рд╕реНрдерд╛рди рдХреЛ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд░реВрдк рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ , рдЗрд╕реЗ рдпрд╛рдж рд░рдЦреЗрдВ! рдЕрдлрд╡рд╛рд╣ рдпрд╣ рд╣реИ рдХрд┐ рд░рдирдЯрд╛рдЗрдо рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЖрджреЗрд╢ рдкрд░ рднрд░реЛрд╕рд╛ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдЬрд╛рдУ рддрд╛рд▓рд┐рдХрд╛ рдЦреЛрдЬ


рдЪрд▓реЛ рдлрд┐рд░ рд╕реЗ рдХреЛрдб рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рджреЗрдЦреЗрдВред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо рдЬреЛрдбрд╝реЗ "рд╕рдВрдЦреНрдпрд╛" рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ - "рд╕рдВрдЦреНрдпрд╛ 10 рдмрд╛рд░":

 package main import ( "fmt" ) func main() { m := map[int]int{0: 0, 1: 10} fmt.Println(m, m[0], m[1], m[2]) } 

рд╣рдо рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВ:

 map[0:0 1:10] 0 10 0 

рдФрд░ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЬрдм рд╣рдордиреЗ рджреЛ рдХрд╛ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА (рдЬрд┐рд╕реЗ рд╣рдо рд░рдЦрдирд╛ рднреВрд▓ рдЧрдП) рддреЛ рд╣рдореЗрдВ 0. рдорд┐рд▓рд╛ред рд╣рдо рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдкрд╛рддреЗ рд╣реИрдВ: тАЬрдорд╛рдирдЪрд┐рддреНрд░ рдореЗрдВ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рдПрдХ рдорд╛рдирдЪрд┐рддреНрд░ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рд╢реВрдиреНрдп рдорд╛рди рд▓реМрдЯрд╛рдПрдЧрд╛ред рдирдХреНрд╢реЗ рдореЗрдВ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХрд╛ рдкреНрд░рдХрд╛рд░ред тАЭ, рд▓реЗрдХрд┐рди рд░реВрд╕реА рдореЗрдВ рдЕрдиреБрд╡рд╛рджрд┐рдд, рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рд╣рдо рдорд╛рдирдЪрд┐рддреНрд░ рд╕реЗ рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╣рд╛рдВ рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдПрдХтАЬ рд╢реВрдиреНрдп рдкреНрд░рдХрд╛рд░ рдореВрд▓реНрдп тАЭрдорд┐рд▓рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдирдВрдмрд░ 0. рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИред рдЕрдЧрд░ рд╣рдо рдорд╛рдорд▓реЛрдВ 0 рдФрд░ рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ 2 рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо "рдПрдХрд╛рдзрд┐рдХ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ" рдХреЗ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рдХреЗ рд╕рд╛рде рдЖрдП - рдПрдХ рдРрд╕рд╛ рд░реВрдк рдЬрд╣рд╛рдВ рд╕рд╛рдорд╛рдиреНрдп рдПрдХрд▓ рдореВрд▓реНрдп рдХреЗ рдмрдЬрд╛рдп, рдирдХреНрд╢рд╛ рдПрдХ рдЬреЛрдбрд╝реА рд▓реМрдЯрд╛рддрд╛ рд╣реИ: рдореВрд▓реНрдп рд╕реНрд╡рдпрдВ рдФрд░ рдПрдХ рдФрд░ рдмреВрд▓рд┐рдпрди рдЬреЛ рдЗрд╕ рд╕рд╡рд╛рд▓ рдХрд╛ рдЙрддреНрддрд░ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЕрдиреБрд░реЛрдзрд┐рдд рдХреБрдВрдЬреА рдирдХреНрд╢реЗ рдореЗрдВ рдореМрдЬреВрдж рд╣реИ рдпрд╛ рдирд╣реАрдВред

рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкрд┐рдЫрд▓реЗ рдЯреБрдХрдбрд╝реЗ рдХреЛрдб рдХреА рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:

 package main import ( "fmt" ) func main() { m := map[int]int{0: 0, 1: 10} m2, ok := m[2] if !ok { // somehow process this case m2 = 20 } fmt.Println(m, m[0], m[1], m2) } 

рдФрд░ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рд╣рдореЗрдВ рдорд┐рд▓рддрд╛ рд╣реИ:

map[0:0 1:10] 0 10 20

Go рдореЗрдВ рдПрдХ рдЯреЗрдмрд▓ рдмрдирд╛рдПрдВред


рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рд╢рдмреНрдж рдХреА рдШрдЯрдирд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдЧрд┐рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╢рдмреНрджрдХреЛрд╢ рд╢реБрд░реВ рдХрд░реЗрдВ рдФрд░ рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдПрдВред

 package main func main() { var m map[string]int for _, word := range []string{"hello", "world", "from", "the", "best", "language", "in", "the", "world"} { m[word]++ } for k, v := range m { println(k, v) } } 

рдХреНрдпрд╛ рдЖрдк рдПрдХ рдЧреЛрдлрд░ рдХреЛ рдкрдХрдбрд╝рддреЗ рд╣реИрдВ? - рдФрд░ рд╡рд╣ рд╣реИ!

рдЫрд╡рд┐

рдЬрдм рд╣рдо рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдПрдХ рдШрдмрд░рд╛рд╣рдЯ рд╣реЛрддреА рд╣реИ рдФрд░ рд╕рдВрджреЗрд╢ "рд╢реВрдиреНрдп рдорд╛рдирдЪрд┐рддреНрд░ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдХрд╛ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ" рдорд┐рд▓рддрд╛ рд╣реИред рдФрд░ рд╕рднреА рдХреНрдпреЛрдВрдХрд┐ рдореЗрдкрд╛ рдПрдХ рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░ рд╣реИ рдФрд░ рдпрд╣ рдПрдХ рдЪрд░ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ, рдЖрдкрдХреЛ рдЗрд╕реЗ рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

 m := make(map[string]int) 

рдереЛрдбрд╝рд╛ рдХрдо рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдЧрд╛ рдХрд┐ рдпрд╣ рдЗрд╕ рддрд░рд╣ рдХреНрдпреЛрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдорд╛рдирдЪрд┐рддреНрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА 4 рддрд░реАрдХреЗ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдП рдЧрдП рдереЗ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рджреЛ рдХреА рд╣рдордиреЗ рдЬрд╛рдВрдЪ рдХреА рдереА - рдпрд╣ рдПрдХ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рдФрд░ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рдгрд╛ рд╣реИред рдЖрдк " рд╕рдордЧреНрд░ рд╢рд╛рдмреНрджрд┐рдХ " рдбрд┐рдЬрд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рднреА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ

  map[key_type]value_type{} 

рдФрд░ рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ, рддреЛ рддреБрд░рдВрдд рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдЖрд░рдВрдн рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рд╡рд┐рдзрд┐ рднреА рдорд╛рдиреНрдп рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдирдП рдкреНрд░рдпреЛрдЧ рд╕реЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП - рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдЗрд╕рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдЪрд░ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╢реВрдиреНрдп рд╕реВрдЪрдХ рдкреНрд░рдХрд╛рд░ рд╕реЗ рднрд░рд╛ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдирдХреНрд╢реЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╢реВрдиреНрдп рд╣реЛрдЧрд╛ (рд╣рдореЗрдВ рдЙрд╕реА рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рддрд╛ рд╣реИ var рдореЗрдВ, рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рдЗрд╕рдХрд╛ рд╕реВрдЪрдХ рд╣реИ)ред

рдХрд┐рд╕реА рдлрдВрдХреНрд╢рди рдХреЛ рдореИрдк рдХреИрд╕реЗ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ


рдорд╛рди рд▓реАрдЬрд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдЙрд╕ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдХреЙрд▓ рд╕реЗ рдкрд╣рд▓реЗ рдФрд░ рдмрд╛рдж рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ:

 package main func foo(n int) { n = 10 } func main() { n := 15 println("n before foo =", n) foo(n) println("n after foo =", n) } 

рдПрдХ рдЙрджрд╛рд╣рд░рдг, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдХрд╛рдлреА рд╕реНрдкрд╖реНрдЯ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рднреА рдирд┐рд╖реНрдХрд░реНрд╖ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:

 n before foo = 15 n after foo = 15 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╢рд╛рдпрдж рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рддреЗ рд╣реИрдВ, рдПрди рдлрд╝рдВрдХреНрд╢рди рдореВрд▓реНрдп рд╕реЗ рдЖрдпрд╛ рдерд╛, рд╕рдВрджрд░реНрдн рд╕реЗ рдирд╣реАрдВ, рдЗрд╕рд▓рд┐рдП рдореВрд▓ рдЪрд░ рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реИред

рдЖрдЗрдП рдХрд░рддреЗ рд╣реИрдВ рдПрдХ рдРрд╕рд╛ рд╣реА рдореЗрдкрд╛ рдЯреНрд░рд┐рдХ:

 package main func foo(m map[int]int) { m[10] = 10 } func main() { m := make(map[int]int) m[10] = 15 println("m[10] before foo =", m[10]) foo(m) println("m[10] after foo =", m[10]) } 

рдФрд░ рд▓реЛ рдФрд░ рдирд┐рд╣рд╛рд░рдирд╛:

 m[10] before foo = 15 m[10] after foo = 10 

рдорд╛рди рдмрджрд▓ рдЧрдпрд╛ рд╣реИред "рдареАрдХ рд╣реИ, рдореЗрдкрд╛ рдХреЛ рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ?", рдЖрдк рдкреВрдЫрддреЗ рд╣реИрдВред рдирд╣реАрдВред рдЧреЛ рдореЗрдВ рдХреЛрдИ рд▓рд┐рдВрдХ рдирд╣реАрдВ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП C ++ рдореЗрдВ 2 рдЪрд░реЛрдВ рдХреЛ 1 рдкрддреЗ рдХреЗ рд╕рд╛рде рдмрдирд╛рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред рд▓реЗрдХрд┐рди рдлрд┐рд░ рдЖрдк рдПрдХ рд╣реА рдкрддреЗ рдкрд░ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реБрдП 2 рдЪрд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ (рд▓реЗрдХрд┐рди рдпреЗ рд╕рдВрдХреЗрдд рд╣реИрдВ, рдФрд░ рд╡реЗ рдЧреЛ рдореЗрдВ рд╣реИрдВ)ред

рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдлрд╝рдВрдХреНрд╢рди fn рд╣реИ рдЬреЛ рдореИрдк m рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддрд╛ рд╣реИред рдореБрдЦреНрдп рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рд╣рдо рдмрд╕ рдПрдХ рдЪрд░ рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреЗрдЬрддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕рдХреЗ рдмрд╛рдж рдХреНрдпрд╛ рд╣реБрдЖред

 package main import "fmt" func fn(m map[int]int) { m = make(map[int]int) fmt.Println("m == nil in fn?:", m == nil) } func main() { var m map[int]int fn(m) fmt.Println("m == nil in main?:", m == nil) } 

рдирд┐рд╖реНрдХрд░реНрд╖:

m == nil in fn?: false
m == nil in main?: true

рдЗрд╕рд▓рд┐рдП, рдЪрд░ m рдХреЛ рдорд╛рди рджреНрд╡рд╛рд░рд╛ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП, рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рдпрдорд┐рдд рдЗрдВрдЯ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдирд╣реАрдВ рдмрджрд▓рд╛ (fn рдореЗрдВ рдореВрд▓реНрдп рдХреА рд╕реНрдерд╛рдиреАрдп рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрджрд▓ рдЧрдИ)ред рдлрд┐рд░ рдореА рдореЗрдВ рдкрдбрд╝реЗ рдореВрд▓реНрдп рдХреЛ рд╣реА рдХреНрдпреЛрдВ рдмрджрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ? рдЗрд╕ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рднрд╛рд╖рд╛ рд░рдирдЯрд╛рдЗрдо рдХреЗ рдХреЛрдб рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

 // A header for a Go map. type hmap struct { // Note: the format of the hmap is also encoded in cmd/compile/internal/gc/reflect.go. // Make sure this stays in sync with the compiler's definition. count int // # live cells == size of map. Must be first (used by len() builtin) flags uint8 B uint8 // log_2 of # of buckets (can hold up to loadFactor * 2^B items) noverflow uint16 // approximate number of overflow buckets; see incrnoverflow for details hash0 uint32 // hash seed buckets unsafe.Pointer // array of 2^B Buckets. may be nil if count==0. oldbuckets unsafe.Pointer // previous bucket array of half the size, non-nil only when growing nevacuate uintptr // progress counter for evacuation (buckets less than this have been evacuated) extra *mapextra // optional fields } 

рдореИрдк рдЗрди рдЧреЛ рдХреЗрд╡рд▓ рд╣рд╛рдкрд░ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдПрдХ рд╕рдВрдХреЗрддрдХ рд╣реИред рдпрд╣ рдЗрд╕ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рд╣реИ рдХрд┐, рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЛ рдорд╛рди рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рдореЗрдВ рд╕реНрд╡рдпрдВ рдорд╛рди рдмрджрд▓ рдЬрд╛рддреЗ рд╣реИрдВ - рдпрд╣ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред рд╣рдореНрдк рдХреА рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╢рд╛рдорд┐рд▓ рд╣реИрдВ: рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛, "рдмрд╛рд▓реНрдЯрд┐рдпреЛрдВ" рдХреА рд╕рдВрдЦреНрдпрд╛ (рдЧрдгрдирд╛ рдореЗрдВ рддреЗрдЬреА рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рдШреБрдЧрдгрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ), рд░реИрдВрдбрдорд╛рдЗрдЬрд╝рд┐рдВрдЧ рд╣реИрд╢ рдХреЗ рд▓рд┐рдП рдмреАрдЬ (рдЗрд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдард┐рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП - рдЙрди рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЛ рдЪреБрдирдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдЬреЛ рдирд┐рд░рдВрддрд░ рдЯрдХрд░рд╛рд╡ рд╣реИрдВ), рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реЗрд╡рд╛ рдХреНрд╖реЗрддреНрд░ рдФрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рдПрдХ рдкреЙрдХреЗрдЯ рдмрд╛рд▓реНрдЯреА рдЬрд╣рд╛рдВ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдЗрдП рддрд╕реНрд╡реАрд░ рдХреЛ рджреЗрдЦреЗрдВ:

рдЫрд╡рд┐

рддрд╕реНрд╡реАрд░ рд╕реНрдореГрддрд┐ рдореЗрдВ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдПрдХ рдпреЛрдЬрдирд╛рдмрджреНрдз рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рджрд░реНрд╢рд╛рддреА рд╣реИ - рдЗрд╕рдореЗрдВ рдПрдХ рд╣рд╛рдордк рд╣реЗрдбрд░ рд╣реИ, рд╕реВрдЪрдХ рдЬреЛ рдХрд┐ рдЧреЛ рдореЗрдВ рдПрдХ рдирдХреНрд╢рд╛ рд╣реИ (рдЗрд╕реЗ var рдХреЗ рд╕рд╛рде рдШреЛрд╖рд┐рдд рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдкреНрд░рд╛рд░рдВрдн рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдбрд╛рд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╕рдордп рджреБрд░реНрдШрдЯрдирд╛ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ)ред рдмрд╛рд▓реНрдЯреА рдлрд╝реАрд▓реНрдб рдХреБрдВрдЬреА-рдореВрд▓реНрдп рдЬреЛрдбрд╝реЗ рдХрд╛ рдПрдХ рднрдВрдбрд╛рд░ рд╣реИ, рдРрд╕реЗ рдХрдИ рдмрд╛рд▓реНрдЯреА рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ 8 рдЬреЛрдбрд╝реЗ рд╣реИрдВред рдкрд╣рд▓реЗ "рдмрдХреЗрдЯ" рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рд╣реИрд╢ рдмрд┐рдЯреНрд╕ рдХреЗ рд▓рд┐рдП рд╕реНрд▓реЙрдЯ рд╣реЛрддреЗ рд╣реИрдВ (e0..e7 рдХреЛ рдИ - рдХреНрдпреЛрдВрдХрд┐ рдЕрддрд┐рд░рд┐рдХреНрдд рд╣реИрд╢ рдмрд┐рдЯреНрд╕ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ)ред рдЖрдЧреЗ рд╕рднреА рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рдХреЗ рд░реВрдк рдореЗрдВ рдХреБрдВрдЬрд┐рдпрд╛рдБ рдФрд░ рдорд╛рди рд╣реИрдВ, рдлрд┐рд░ рд╕рднреА рдорд╛рдиреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИред

рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╣реИрд╢ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ "рдмрд╛рд▓реНрдЯреА" рдореЗрдВ рд╣рдо рдореВрд▓реНрдп рдбрд╛рд▓рддреЗ рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ "рдмрд╛рд▓реНрдЯреА" рдХреЗ рдЕрдВрджрд░ 8 рдЯрдХрд░рд╛рд╡ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ "рдмрд╛рд▓реНрдЯреА" рдХреЗ рдЕрдВрдд рдореЗрдВ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рд╣реЛрддрд╛ рд╣реИ, рдЕрдЧрд░ рдкрд┐рдЫрд▓реЗ рдПрдХ рдУрд╡рд░рдлреНрд▓реЛ рд╣реЛрддрд╛ рд╣реИред

рдирдХреНрд╢рд╛ рдХреИрд╕реЗ рдмрдврд╝рддрд╛ рд╣реИ?


рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рдЖрдк рд▓рд╛рдЗрди рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ:

  // Maximum average load of a bucket that triggers growth is 6.5. 

рдпрд╣реА рд╣реИ, рдЕрдЧрд░ рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рд▓реНрдЯреА рдореЗрдВ рдФрд╕рддрди 6.5 рд╕реЗ рдЕрдзрд┐рдХ рддрддреНрд╡ рд╣реИрдВ, рддреЛ рдмрд╛рд▓реНрдЯреА рд╕рд░рдгреА рдореЗрдВ рд╡реГрджреНрдзрд┐ рд╣реЛрддреА рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╕рд░рдгреА рдХреЛ 2 рдЧреБрдирд╛ рдЕрдзрд┐рдХ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдкреБрд░рд╛рдиреЗ рдбреЗрдЯрд╛ рдХреЛ рд╣рд░ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдпрд╛ рд╡рд┐рд▓реЛрдкрди рдХреЗ рдЫреЛрдЯреЗ рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдмрд╣реБрдд рдмрдбрд╝реА рджреЗрд░реА рди рд╣реЛред рдЗрд╕рд▓рд┐рдП, рдбреЗрдЯрд╛ рдХреЛ рдЦрд╛рд▓реА рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╕рднреА рдСрдкрд░реЗрд╢рди рдереЛрдбрд╝реЗ рдзреАрдореЗ рд╣реЛрдВрдЧреЗ (рдЦреЛрдЬ рдХрд░рддреЗ рд╕рдордп, рд╣рдореЗрдВ рднреА рджреЛ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдЦреЛрдЬрдирд╛ рд╣реЛрдЧрд╛)ред рдПрдХ рд╕рдлрд▓ рдирд┐рдХрд╛рд╕реА рдХреЗ рдмрд╛рдж, рдирдП рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдЫрд╡рд┐

рдорд╛рдирдЪрд┐рддреНрд░ рддрддреНрд╡ рдХрд╛ рдкрддрд╛ рд▓реЗрдирд╛ред


рдПрдХ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рдмрд┐рдВрджреБ - рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдореИрдВ рдЗрд╕ рддрд░рд╣ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛:

 package main import ( "fmt" ) func main() { m := make(map[int]int) m[1] = 10 a := &m[1] fmt.Println(m[1], *a) } 

рд▓реЗрдХрд┐рди рдЧреЛ рдХрд╣рддреЗ рд╣реИрдВ: "рдореИрдВ [1] рдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рд▓рдЧрд╛ рд╕рдХрддрд╛"ред рдбреЗрдЯрд╛ рдирд┐рдХрд╛рд╕реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдореВрд▓реНрдп рдХреЗ рдкрддреЗ рдХреЛ рд▓реЗрдирд╛ рдЕрд╕рдВрднрд╡ рдХреНрдпреЛрдВ рд╣реИ рдЗрд╕рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ред рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдордиреЗ рдореВрд▓реНрдп рдХрд╛ рдкрддрд╛ рд▓реЗ рд▓рд┐рдпрд╛, рдФрд░ рдлрд┐рд░ рдореЗрдкрд╛ рдмрдврд╝реА, рдирдИ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХреА рдЧрдИ, рдбреЗрдЯрд╛ рдХреЛ рдЦрд╛рд▓реА рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛, рдкреБрд░рд╛рдиреЗ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛, рд╕реВрдЪрдХ рдЧрд▓рдд рд╣реЛ рдЧрдпрд╛, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдирд┐рд╖рд┐рджреНрдз рд╣реИрдВред

рдЬреЗрдирд░рд┐рдХ рдХреЗ рдмрд┐рдирд╛ рдирдХреНрд╢рд╛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ?


рди рддреЛ рдПрдХ рдЦрд╛рд▓реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕, рдФрд░ рди рд╣реА рдХреЛрдб рдкреАрдврд╝реА рдХрд╛ рдЗрд╕рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рд╣реИ, рдкреВрд░реА рдмрд╛рдд рдЗрд╕реЗ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реИред рдЧреМрд░ рдХрд░реЗрдВ рдХрд┐ рдЧреЛ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдХрд╛рд░реНрдп рдХреНрдпрд╛ рд╣реИрдВ:

 v := m["k"] тЖТ func mapaccess1(t *maptype, h *hmap, key unsafe.Pointer) unsafe.Pointer v, ok := m["k"] тЖТ func mapaccess2(t *maptype, h *hmap, key unsafe.Pointer) (unsafe.Pointer, bool) m["k"] = 9001 тЖТ func mapassign(t *maptype, h *hmap, key unsafe.Pointer) unsafe.Pointer delete(m, "k") тЖТ func mapdelete(t *maptype, h *hmap, key unsafe.Pointer) 

рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрд░рдорд╢рдГ рдореИрдкрд╕рд╛рдЗрди рдФрд░ рдореИрдкрдбреЗрд▓реЗрдЯ рдХреЛ рд▓рд┐рдЦрдиреЗ рдФрд░ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХреНрд╕реЗрд╕ рдХреЗ рд▓рд┐рдП рдореИрдкреИрдХрд╕ рдлрд╝рдВрдХреНрд╢рди рд╣реИрдВред рд╕рднреА рдСрдкрд░реЗрд╢рди рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдкреЙрдЗрдВрдЯрд░, рдЬреЛ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдореВрд▓реНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд░реНрдгрдирдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рд╣реИред

 type mapType struct { key *_type elem *_type ...} type _type struct { size uintptr alg *typeAlg ...} type typeAlg struct { hash func(unsafe.Pointer, uintptr) uintptr equal func(unsafe.Pointer, unsafe.Pointer) bool...} 

MapType рдХреБрдВрдЬреА рдФрд░ рдорд╛рди рдХреЗ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ (_type) рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЗ рд▓рд┐рдП, рд╣реИрд╢, рдЖрдХрд╛рд░, рдФрд░ рдЗрд╕реА рддрд░рд╣ рдХреА рддреБрд▓рдирд╛ рдХреЗ рд╕рдВрдЪрд╛рд▓рди (рдЯрд╛рдЗрдкрдЕрд▓реНрдЧ) рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рд╣рдореЗрд╢рд╛ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЙрдирдХрд╛ рдЙрддреНрдкрд╛рджрди рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПред

рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░ред рдЬрдм рд╣рдо v = m [k] рд▓рд┐рдЦрддреЗ рд╣реИрдВ (рдХреБрдВрдЬреА k рд╕реЗ v рдХрд╛ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ), рд╕рдВрдХрд▓рдХ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ:

 kPointer := unsafe.Pointer(&k) vPointer := mapaccess1(typeOf(m), m, kPointer) v = *(*typeOfvalue)vPointer 

рдпрд╣реА рд╣реИ, рд╣рдо рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдПрдХ рдХреБрдВрдЬреА рдореЗрдВ рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВ, рдореИрдк рдЯрд╛рдЗрдк рд╕рдВрд░рдЪрдирд╛, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рд╣рдореЗрдВ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕ рдХреБрдВрдЬреА рдФрд░ рдорд╛рди рдХреЗ рдХреМрди рд╕реЗ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рд╣реИрдВ, рдкреЙрдЗрдВрдЯрд░ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рд╣реИрдВрдк (рдпрд╛рдиреА, рдореИрдк) рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╕рднреА рдХреЛ рдореИрдкреЗрдХреИрд╕реЗ 1 рдореЗрдВ рдкрд╛рд╕ рдХрд░ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рд╡реИрд▓реНрдпреВ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рд▓реМрдЯрд╛рдПрдЧрд╛ред рд╣рдордиреЗ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рд╡рд╛рдВрдЫрд┐рдд рдкреНрд░рдХрд╛рд░, рдбреЗрд░реЗрдлреЗрд░реЗрдВрд╕ рдореЗрдВ рдбрд╛рд▓рд╛ рдФрд░ рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ред

рдЖрдЗрдП рдЕрдм рд░рдирдЯрд╛рдЗрдо рд╕реЗ рдЦреЛрдЬ рдХреЛрдб рджреЗрдЦреЗрдВ (рдЬреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдЕрдиреБрдХреВрд▓рд┐рдд рд╣реИ):

 func lookup(t *mapType, m *mapHeader, key unsafe.Pointer) unsafe.Pointer { 

рдлрд╝рдВрдХреНрд╢рди рдореИрдк рдореЗрдВ рдХреБрдВрдЬреА рдХреА рдЦреЛрдЬ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рдорд╛рди рдкрд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рджрд▓реАрд▓реЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ - рдпрд╣ рдореИрдк рдЯрд╛рдЗрдк рд╣реИ, рдЬреЛ рдХреБрдВрдЬреА рдкреНрд░рдХрд╛рд░реЛрдВ рдФрд░ рдореВрд▓реНрдпреЛрдВ рдХреЗ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рддрд╛ рд╣реИ, рдореИрдк рд╣реА (рдореИрдкрд╣реЗрдбрд░) рдФрд░ рдореЗрдореЛрд░реА рдХреЛ рдкреЙрдЗрдВрдЯрд░ рдЬреЛ рдХрд┐ рд╕реНрдЯреЛрд░ рдХрд░рддрд╛ рд╣реИред рд╣рдо рдЙрд╕ рдореЗрдореЛрд░реА рдХреЛ рдкреЙрдЗрдВрдЯрд░ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ рдЬреЛ рд╡реИрд▓реНрдпреВ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рддрд╛ рд╣реИред

  if m == nil || m.count == 0 { return zero } 

рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдЬрд╛рдБрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдореИрдк рд╣реЗрдбрд░ рдХрд╛ рдкреЙрдЗрдВрдЯрд░ рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реИ, рдЕрдЧрд░ рд╡рд╣рд╛рдБ 0 рдПрд▓рд┐рдореЗрдВрдЯ рд╣реИрдВ рдФрд░ рдПрдХ рд╢реВрдиреНрдп рдорд╛рди рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ, рдпрджрд┐ рдРрд╕рд╛ рд╣реИред

  hash := t.key.hash(key, m.seed) // hash := hashfn(key) bucket := hash & (1<<m.logB-1) // bucket := hash % nbuckets extra := byte(hash >> 56) // extra := top 8 bits of hash b := (*bucket)(add(m.buckets, bucket*t.bucketsize)) // b := &m.buckets[bucket] 

рд╣рдо рдХреБрдВрдЬреА рд╣реИрд╢ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ (рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд┐рд╡рд░рдгрдХ рд╕реЗ рджреА рдЧрдИ рдХреБрдВрдЬреА рдХреА рдЧрдгрдирд╛ рдХреИрд╕реЗ рдХрд░реЗрдВ)ред рдлрд┐рд░ рд╣рдо рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЛ рдХрд┐рд╕ "рдмрд╛рд▓реНрдЯреА" рдореЗрдВ рдЬрд╛рдиреЗ рдФрд░ рджреЗрдЦрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ ("рдмрд╛рд▓реНрдЯрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реЛрдиреЗ рдХреА рд╢реЗрд╖", рдЧрдгрдирд╛рдПрдВ рдмрд╕ рдереЛрдбрд╝реА рддреЗрдЬ рд╣реИрдВ)ред рдлрд┐рд░ рд╣рдо рдЕрддрд┐рд░рд┐рдХреНрдд рд╣реИрд╢ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ (рд╣рдо рд╣реИрд╢ рдХреЗ 8 рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдЯреНрд╕ рд▓реЗрддреЗ рд╣реИрдВ) рдФрд░ рдореЗрдореЛрд░реА (рдкрддрд╛ рдЕрдВрдХрдЧрдгрд┐рдд) рдореЗрдВ "рдмрд╛рд▓реНрдЯреА" рдХреА рд╕реНрдерд┐рддрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред

  for { for i := 0; i < 8; i++ { if b.extra[i] != extra { // check 8 extra hash bits continue } k := add(b, dataOffset+i*t.key.size) // pointer to ki in bucket if t.key.equal(key, k) { // return pointer to vi return add(b, dataOffset+8*t.key.size+i*t.value.size) } } b = b.overflow if b == nil { return zero } } 

рдЦреЛрдЬреЗрдВ, рдпрджрд┐ рдЖрдк рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИ: рд╣рдо "рдмрд╛рд▓реНрдЯрд┐рдпреЛрдВ" рдХреА рдЬрдВрдЬреАрд░реЛрдВ рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реИрдВ, рдЕрдЧрд▓реЗ рдПрдХ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВ, рдЕрдЧрд░ рдЖрдкрдХреЛ рдпрд╣ рдирд╣реАрдВ рдорд┐рд▓рд╛ред "рдмрд╛рд▓реНрдЯреА" рдореЗрдВ рдЦреЛрдЬ рдЕрддрд┐рд░рд┐рдХреНрдд рд╣реИрд╢ рдХреА рддреНрд╡рд░рд┐рдд рддреБрд▓рдирд╛ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ (рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдпреЗ e0 ... рдкреНрд░рддреНрдпреЗрдХ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ e7 рддреНрд╡рд░рд┐рдд рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝реА рдХрд╛ "рдорд┐рдиреА" рд╣реИрд╢ рд╣реИрдВ)ред рдпрджрд┐ рдпрд╣ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддрд╛ рд╣реИ, рддреЛ рдЖрдЧреЗ рдмрдврд╝реЗрдВ, рдпрджрд┐ рдпрд╣ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЕрдзрд┐рдХ рд╕рд╛рд╡рдзрд╛рдиреА рд╕реЗ рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ - рд╣рдо рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдореЗрдореЛрд░реА рдореЗрдВ рдЭреВрда рдХреЗ рд▓рд┐рдП рдЦреЛрдЬреЗ рдЬрд╛рдиреЗ рдХрд╛ рд╕рдВрджреЗрд╣ рдХрд╣рд╛рдВ рд╣реИ, рдпрд╣ рддреБрд▓рдирд╛ рдХрд░реЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрджрд┐ рдмрд░рд╛рдмрд░ рд╣реИ, рддреЛ рд╕реНрдореГрддрд┐ рдореЗрдВ рдорд╛рди рдХреА рд╕реНрдерд┐рддрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ рдФрд░ рд╡рд╛рдкрд╕ рд▓реМрдЯреЗрдВред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрд▓реМрдХрд┐рдХ рдХреБрдЫ рднреА рдирд╣реАрдВред

рдирд┐рд╖реНрдХрд░реНрд╖


рдорд╛рдирдЪрд┐рддреНрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЬрд╛рдиреЗрдВ рдФрд░ рд╕рдордЭреЗрдВ рдХрд┐ рд╡реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ! рдЖрдк рдХреБрдЫ рд╕реВрдХреНрд╖реНрдорддрд╛рдУрдВ рдХреЛ рд╕рдордЭрдХрд░ рд░реЗрдХ рд╕реЗ рдмрдЪ рд╕рдХрддреЗ рд╣реИрдВ - рдЖрдк рдореВрд▓реНрдп рдХрд╛ рдкрддрд╛ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд▓рдЧрд╛ рд╕рдХрддреЗ, рдХреНрдпреЛрдВ рд╕рдм рдХреБрдЫ рдЖрд░рдореНрдн рдХреЗ рдмрд┐рдирд╛ рдШреЛрд╖рдгрд╛ рдХреЗ рджреМрд░рд╛рди рдЧрд┐рд░ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВ рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИ рдпрджрд┐ рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЬреНрдЮрд╛рдд рд╣реИ (рд╣рдо рдирд┐рдХрд╛рд╕реА рд╕реЗ рдмрдЪреЗрдВрдЧреЗ) рдФрд░ рдмрд╣реБрдд рдХреБрдЫред



рд╕рдВрджрд░реНрдн:

"рдЧреЛ рдореИрдк рдЗрди рдПрдХреНрд╢рди", рдПрдВрдбреНрд░рдпреВ рдЧреЗрд░реИрдВрдб
"рдХреИрд╕реЗ рд░рдирдЯрд╛рдЗрдо рдХреБрд╢рд▓рддрд╛ рд╕реЗ рдирдХреНрд╢реЗ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ", рдбреЗрд╡ рдЪреЗрдиреА
"рдЕрдВрдбрд░рд╕реНрдЯреИрдВрдбрд┐рдВрдЧ рдЯрд╛рдЗрдк рдЗрди рдЧреЛ", рд╡рд┐рд▓рд┐рдпрдо рдХреИрдиреЗрдбреА
рдирдХреНрд╢рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЕрдВрджрд░, рдХреАрде рд░рд╛рдиреНрдбреЗрд▓
рдореИрдк рд╕реЛрд░реНрд╕ рдХреЛрдб, рдЧреЛ рд░рдирдЯрд╛рдЗрдо
рдЧреЛрд▓рдВрдЧ рдпреБрдХреНрддрд┐
рдкреНрд░рднрд╛рд╡реА рдЬрд╛рдУ
рдЧреЛрдлрд░ рдХреЗ рдЪрд┐рддреНрд░

Source: https://habr.com/ru/post/hi457728/


All Articles