Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
Go ÓïÑ﵀ 10 ¸öʵÓü¼Êõ
 
»ðÁú¹ûÈí¼þ ·¢²¼ÓÚ£º2014-09-09
  2596  次浏览      28
 

ÕâÀïÊÇÎÒ¹ýÈ¥¼¸ÄêÖбàдµÄ´óÁ¿ Go ´úÂëµÄ¾­Ñé×Ü½á¶øÀ´µÄ×Ô¼ºµÄ×î¼Ñʵ¼ù¡£ÎÒÏàÐÅËüÃǾßÓе¯ÐԵġ£ÕâÀïµÄµ¯ÐÔÊÇÖ¸£º

ij¸öÓ¦ÓÃÐèÒªÊÊÅäÒ»¸öÁé»îµÄ»·¾³¡£Ä㲻ϣÍûÿ¹ý 3 µ½ 4 ¸öÔ¾Ͳ»µÃ²»½«ËüÃÇÈ«²¿Öع¹Ò»±é¡£Ìí¼ÓеÄÌØÐÔÓ¦µ±ºÜÈÝÒס£Ðí¶àÈ˲ÎÓ뿪·¢¸ÃÓ¦Óã¬ËüÓ¦µ±¿ÉÒÔ±»Àí½â£¬ÇÒά»¤¼òµ¥¡£Ðí¶àÈËʹÓøÃÓ¦Óã¬bug Ó¦¸ÃÈÝÒ×±»·¢ÏÖ²¢ÇÒ¿ÉÒÔ¿ìËÙµÄÐÞ¸´¡£ÎÒÓÃÁ˺ܳ¤µÄʱ¼äѧµ½ÁËÕâЩÊÂÇé¡£ÆäÖеÄһЩºÜ΢С£¬µ«¶ÔÓÚÐí¶àÊÂÇé¶¼»áÓÐÓ°Ïì¡£

ËùÓÐÕâЩ¶¼½ö½öÊǽ¨Ò飬¾ßÌåÇé¿ö¾ßÌå¶Ô´ý£¬²¢ÇÒÈç¹ûÓаïÖúµÄ»°Îñ±Ø¸æËßÎÒ¡£ËæÊ±ÁôÑÔ:)

1. ʹÓõ¥Ò»µÄ GOPATH

¶à¸ö GOPATH µÄÇé¿ö²¢²»¾ßÓе¯ÐÔ¡£GOPATH ±¾Éí¾ÍÊǸ߶È×ÔÎÒÍ걸µÄ£¨Í¨¹ýµ¼Èë·¾¶£©¡£Óжà¸ö GOPATH »áµ¼ÖÂijЩ¸±×÷Óã¬ÀýÈç¿ÉÄÜʹÓÃÁ˸ø¶¨µÄ¿âµÄ²»Í¬µÄ°æ±¾¡£Äã¿ÉÄÜÔÚij¸öµØ·½Éý¼¶ÁËËü£¬µ«ÊÇÆäËûµØ·½È´Ã»ÓÐÉý¼¶¡£¶øÇÒ£¬ÎÒ»¹Ã»Óöµ½¹ýÈκÎÒ»¸öÐèҪʹÓöà¸ö GOPATH µÄÇé¿ö¡£ËùÒÔֻʹÓõ¥Ò»µÄ GOPATH£¬Õâ»áÌáÉýÄã Go µÄ¿ª·¢½ø¶È¡£

Ðí¶àÈ˲»Í¬ÒâÕâÒ»¹Ûµã£¬½ÓÏÂÀ´ÎÒ»á×öһЩ³ÎÇå¡£Ïñ etcd »òcamlistore ÕâÑùµÄ´óÏîĿʹÓÃÁËÏñ godep ÕâÑùµÄ¹¤¾ß£¬½«ËùÓÐÒÀÀµ±£´æµ½Ä³¸öĿ¼ÖС£Ò²¾ÍÊÇ˵£¬ÕâЩÏîÄ¿×ÔÉíÓÐÒ»¸öµ¥Ò»µÄ GOPATH¡£ËüÃÇÖ»ÄÜÔÚÕâ¸öĿ¼ÀïÕÒµ½¶ÔÓ¦µÄ°æ±¾¡£³ý·ÇÄãµÄÏîÄ¿ºÜ´ó²¢ÇÒ¼«ÎªÖØÒª£¬·ñÔò²»ÒªÎªÃ¿¸öÏîĿʹÓò»Í¬µÄ GOPATH¡£Èç¹ûÄãÈÏΪÏîÄ¿ÐèÒªÒ»¸ö×Ô¼ºµÄ GOPATH Ŀ¼£¬ÄÇô¾Í´´½¨Ëü£¬·ñÔò²»Òª³¢ÊÔʹÓöà¸ö GOPATH¡£ËüÖ»»áÍÏÂýÄãµÄ½ø¶È¡£

2. ½« for-select ·â×°µ½º¯ÊýÖÐ

Èç¹ûÔÚij¸öÌõ¼þÏ£¬ÄãÐèÒª´Ó for-select ÖÐÍ˳ö£¬¾ÍÐèҪʹÓñêÇ©¡£ÀýÈ磺

func main() {

L:
for {
select {
case <-time.After(time.Second):
fmt.Println("hello")
default:
break L
}
}

fmt.Println("ending")
}

ÈçÄãËù¼û£¬ÐèÒªÁªºÏbreakʹÓñêÇ©¡£ÕâÓÐÆäÓÃ;£¬²»¹ýÎÒ²»Ï²»¶¡£Õâ¸öÀý×ÓÖÐµÄ for Ñ­»·¿´ÆðÀ´ºÜС£¬µ«ÊÇͨ³£ËüÃÇ»á¸ü´ó£¬¶øÅжÏbreakµÄÌõ¼þÒ²¸üΪÈß³¤¡£

Èç¹ûÐèÒªÍ˳öÑ­»·£¬ÎһὫ for-select ·â×°µ½º¯ÊýÖУº

func main() {
foo()
fmt.Println("ending")
}

func foo() {
for {
select {
case <-time.After(time.Second):
fmt.Println("hello")
default:
return
}
}
}

Ä㻹¿ÉÒÔ·µ»ØÒ»¸ö´íÎ󣨻òÈÎºÎÆäËûÖµ£©£¬Ò²ÊÇͬÑùƯÁÁµÄ£¬Ö»ÐèÒª£º

1
2
3
4
// ×èÈû
if err := foo(); err != nil {
// ´¦Àí err
}

3. ÔÚ³õʼ»¯½á¹¹ÌåʱʹÓôøÓбêÇ©µÄÓï·¨

ÕâÊÇÒ»¸öÎÞ±êÇ©Óï·¨µÄÀý×Ó£º

type T struct {
Foo string
Bar int
}

func main() {
t := T{"example", 123} // ÎÞ±êÇ©Óï·¨
fmt.Printf("t %+v\n", t)
}

ÄÇôÈç¹ûÄãÌí¼ÓÒ»¸öеÄ×ֶε½T½á¹¹Ì壬´úÂë»á±àÒëʧ°Ü£º

type T struct {
Foo string
Bar int
Qux string
}

func main() {
t := T{"example", 123} // ÎÞ·¨±àÒë
fmt.Printf("t %+v\n", t)
}

Èç¹ûʹÓÃÁ˱êÇ©Óï·¨£¬Go µÄ¼æÈÝÐÔ¹æÔò£¨http://golang.org/doc/go1compat£©»á´¦Àí´úÂë¡£ÀýÈçÔÚÏònet°üµÄÀàÐÍÌí¼Ó½Ð×öZoneµÄ×ֶΣ¬²Î¼û£ºhttp://golang.org/doc/go1.1#library¡£»Øµ½ÎÒÃǵÄÀý×Ó£¬Ê¹ÓñêÇ©Óï·¨£º

type T struct {
Foo string
Bar int
Qux string
}

func main() {
t := T{Foo: "example", Qux: 123}
fmt.Printf("t %+v\n", t)
}

Õâ¸ö±àÒëÆðÀ´Ã»ÎÊÌ⣬¶øÇÒµ¯ÐÔÒ²ºÃ¡£²»ÂÛÄãÈçºÎÌí¼ÓÆäËû×ֶε½T½á¹¹Ìå¡£ÄãµÄ´úÂë×ÜÊÇÄܱàÒ룬²¢ÇÒÔÚÒÔºóµÄ Go µÄ°æ±¾Ò²¿ÉÒÔ±£Ö¤ÕâÒ»µã¡£Ö»ÒªÔÚ´úÂ뼯ÖÐÖ´ÐÐgo vet£¬¾Í¿ÉÒÔ·¢ÏÖËùÓеÄÎÞ±êÇ©µÄÓï·¨¡£

4. ½«½á¹¹ÌåµÄ³õʼ»¯²ð·Öµ½¶àÐÐ

Èç¹ûÓÐÁ½¸öÒÔÉϵÄ×ֶΣ¬ÄÇô¾ÍÓöàÐС£Ëü»áÈÃÄãµÄ´úÂë¸ü¼ÓÈÝÒ×ÔĶÁ£¬Ò²¾ÍÊÇ˵²»Òª£º

T{Foo: "example", Bar:someLongVariable, Qux:anotherLongVariable, B: forgetToAddThisToo}

¶øÊÇ£º

T{
Foo: "example",
Bar: someLongVariable,
Qux: anotherLongVariable,
B: forgetToAddThisToo,
}

5. ΪÕûÊý³£Á¿Ìí¼Ó String() ·½·¨

Èç¹ûÄãÀûÓà iota À´Ê¹ÓÃ×Ô¶¨ÒåµÄÕûÊýö¾ÙÀàÐÍ£¬Îñ±ØÒªÎªÆäÌí¼Ó String() ·½·¨¡£ÀýÈ磬ÏñÕâÑù£º

type State int

const (
Running State = iota
Stopped
Rebooting
Terminated
)

Èç¹ûÄã´´½¨ÁËÕâ¸öÀàÐ͵ÄÒ»¸ö±äÁ¿£¬È»ºóÊä³ö£¬»áµÃµ½Ò»¸öÕûÊý

func main() {
state := Running

// print: "state 0"
fmt.Println("state ", state)
}

³ý·ÇÄã»Ø¹Ë³£Á¿¶¨Ò壬·ñÔòÕâÀïµÄ0¿´ÆðÀ´ºÁÎÞÒâÒå¡£Ö»ÐèҪΪStateÀàÐÍÌí¼ÓString()·½·¨¾Í¿ÉÒÔÐÞ¸´Õâ¸öÎÊÌ⣨http://play.golang.org/p/ewMKl6K302£©£º

func (s State) String() string {
switch s {
case Running:
return "Running"
case Stopped:
return "Stopped"
case Rebooting:
return "Rebooting"
case Terminated:
return "Terminated"
default:
return "Unknown"
}
}

еÄÊä³öÊÇ£ºstate: Running¡£ÏÔÈ»ÏÖÔÚ¿´ÆðÀ´¿É¶ÁÐÔºÃÁ˺ܶࡣÔÚÄãµ÷ÊÔ³ÌÐòµÄʱºò£¬Õâ»á´øÀ´¸ü¶àµÄ±ãÀû¡£Í¬Ê±»¹¿ÉÒÔÔÚʵÏÖ MarshalJSON()¡¢UnmarshalJSON() ÕâÀà·½·¨µÄʱºòʹÓÃͬÑùµÄÊֶΡ£

6. Èà iota ´Ó a +1 ¿ªÊ¼ÔöÁ¿

ÔÚÇ°ÃæµÄÀý×ÓÖÐͬʱҲ²úÉúÁËÒ»¸öÎÒÒѾ­Óöµ½¹ýÐí¶à´ÎµÄ bug¡£¼ÙÉèÄãÓÐÒ»¸öеĽṹÌ壬ÓÐÒ»¸öState×ֶΣº

type T struct {
Name string
Port int
State State
}

ÏÖÔÚÈç¹û»ùÓÚ T ´´½¨Ò»¸öеıäÁ¿£¬È»ºóÊä³ö£¬Äã»áµÃµ½Ææ¹ÖµÄ½á¹û

func main() {
t := T{Name: "example", Port: 6666}

// prints: "t {Name:example Port:6666 State:Running}"
fmt.Printf("t %+v\n", t)
}

¿´µ½ bug ÁËÂð£¿State×Ö¶ÎûÓгõʼ»¯£¬Go ĬÈÏʹÓöÔÓ¦ÀàÐ͵ÄÁãÖµ½øÐÐÌî³ä¡£ÓÉÓÚStateÊÇÒ»¸öÕûÊý£¬ÁãÖµÒ²¾ÍÊÇ0£¬µ«ÔÚÎÒÃǵÄÀý×ÓÖÐËü±íʾRunning¡£

ÄÇôÈçºÎÖªµÀ State ±»³õʼ»¯ÁË£¿»¹ÊÇËüÕæµÃÊÇÔÚRunningģʽ£¿Ã»ÓÐ°ì·¨Çø·ÖËüÃÇ£¬ÄÇôÕâ¾Í»á²úÉúδ֪µÄ¡¢²»¿ÉÔ¤²âµÄ bug¡£²»¹ý£¬ÐÞ¸´Õâ¸öºÜÈÝÒ×£¬Ö»ÒªÈà iota ´Ó +1 ¿ªÊ¼

const (
Running State = iota + 1
Stopped
Rebooting
Terminated
)

ÏÖÔÚt±äÁ¿½«Ä¬ÈÏÊä³öUnknown£¬²»ÊÇÂ𣿠£º

func main() {
t := T{Name: "example", Port: 6666}

// Êä³ö£º "t {Name:example Port:6666 State:Unknown}"
fmt.Printf("t %+v\n", t)
}

 

²»¹ýÈà iota ´ÓÁãÖµ¿ªÊ¼Ò²ÊÇÒ»ÖÖ½â¾ö°ì·¨¡£ÀýÈ磬Äã¿ÉÒÔÒýÈëÒ»¸öеÄ״̬½Ð×öUnknown£¬½«ÆäÐÞ¸ÄΪ£º

const (
Unknown State = iota
Running
Stopped
Rebooting
Terminated
)

7. ·µ»Øº¯Êýµ÷ÓÃ

ÎÒÒѾ­¿´¹ýºÜ¶à´úÂëÀýÈ磨http://play.golang.org/p/8Rz1EJwFTZ£©£º

func bar() (string, error) {
v, err := foo()
if err != nil {
return "", err
}

return v, nil
}

È»¶ø£¬ÄãÖ»ÐèÒª£º

func bar() (string, error) {
return foo()
}

¸ü¼òµ¥Ò²¸üÈÝÒ×ÔĶÁ£¨µ±È»£¬³ý·ÇÄãÒª¶ÔijЩÄÚ²¿µÄÖµ×öһЩ¼Ç¼£©¡£

8. °Ñ slice¡¢map µÈ¶¨ÒåΪ×Ô¶¨ÒåÀàÐÍ

½« slice »ò map ¶¨Òå³É×Ô¶¨ÒåÀàÐÍ¿ÉÒÔÈôúÂëά»¤ÆðÀ´¸ü¼ÓÈÝÒס£¼ÙÉèÓÐÒ»¸öServerÀàÐͺÍÒ»¸ö·µ»Ø·þÎñÆ÷ÁбíµÄº¯Êý£º

type Server struct {
Name string
}

func ListServers() []Server {
return []Server{
{Name: "Server1"},
{Name: "Server2"},
{Name: "Foo1"},
{Name: "Foo2"},
}
}

ÏÖÔÚ¼ÙÉèÐèÒª»ñÈ¡Ä³Ð©ÌØ¶¨Ãû×ֵķþÎñÆ÷¡£ÐèÒª¶Ô ListServers() ×öһЩ¸Ä¶¯£¬Ôö¼ÓɸѡÌõ¼þ£º

// ListServers ·µ»Ø·þÎñÆ÷ÁÐ±í¡£Ö»»á·µ»Ø°üº¬ name µÄ·þÎñÆ÷¡£¿ÕµÄ name ½«»á·µ»ØËùÓзþÎñÆ÷¡£
func ListServers(name string) []Server {
servers := []Server{
{Name: "Server1"},
{Name: "Server2"},
{Name: "Foo1"},
{Name: "Foo2"},
}

// ·µ»ØËùÓзþÎñÆ÷
if name == "" {
return servers
}

// ·µ»Ø¹ýÂ˺óµÄ½á¹û
filtered := make([]Server, 0)

for _, server := range servers {
if strings.Contains(server.Name, name) {
filtered = append(filtered, server)
}
}

return filtered
}

ÏÖÔÚ¿ÉÒÔÓÃÕâ¸öÀ´É¸Ñ¡ÓÐ×Ö·û´®FooµÄ·þÎñÆ÷£º

func main() {
servers := ListServers("Foo")

// Êä³ö£º¡°servers [{Name:Foo1} {Name:Foo2}]¡±
fmt.Printf("servers %+v\n", servers)
}

ÏÔÈ»Õâ¸öº¯ÊýÄܹ»Õý³£¹¤×÷¡£²»¹ýËüµÄµ¯ÐÔ²¢²»ºÃ¡£Èç¹ûÄãÏë¶Ô·þÎñÆ÷¼¯ºÏÒýÈëÆäËûÂß¼­µÄ»°»áÈçºÎÄØ£¿ÀýÈç¼ì²éËùÓзþÎñÆ÷µÄ״̬£¬ÎªÃ¿¸ö·þÎñÆ÷´´½¨Ò»¸öÊý¾Ý¿â¼Ç¼£¬ÓÃÆäËû×ֶνøÐÐɸѡµÈµÈ¡­¡­

ÏÖÔÚÒýÈëÒ»¸ö½Ð×öServersµÄÐÂÀàÐÍ£¬²¢ÇÒÐÞ¸Äԭʼ°æ±¾µÄ ListServers() ·µ»ØÕâ¸öÐÂÀàÐÍ£º

type Servers []Server

// ListServers ·µ»Ø·þÎñÆ÷Áбí
func ListServers() Servers {
return []Server{
{Name: "Server1"},
{Name: "Server2"},
{Name: "Foo1"},
{Name: "Foo2"},
}
}

ÏÖÔÚÐèÒª×öµÄÊÇֻҪΪServersÀàÐÍÌí¼ÓÒ»¸öеÄFilter()·½·¨£º

// Filter ·µ»Ø°üº¬ name µÄ·þÎñÆ÷¡£¿ÕµÄ name ½«»á·µ»ØËùÓзþÎñÆ÷¡£
func (s Servers) Filter(name string) Servers {
filtered := make(Servers, 0)

for _, server := range s {
if strings.Contains(server.Name, name) {
filtered = append(filtered, server)
}

}

return filtered
}

ÏÖÔÚ¿ÉÒÔÕë¶Ô×Ö·û´®Fooɸѡ·þÎñÆ÷£º

func main() {
servers := ListServers()
servers = servers.Filter("Foo")
fmt.Printf("servers %+v\n", servers)
}

¹þ£¡¿´µ½ÄãµÄ´úÂëÊǶàôµÄ¼òµ¥ÁËÂ𣿻¹Ïë¶Ô·þÎñÆ÷µÄ״̬½øÐмì²é£¿»òÕßΪÿ¸ö·þÎñÆ÷Ìí¼ÓÒ»ÌõÊý¾Ý¿â¼Ç¼£¿Ã»ÎÊÌ⣬Ìí¼ÓÒÔÏÂз½·¨¼´¿É£º

func (s Servers) Check()
func (s Servers) AddRecord()
func (s Servers) Len()
...

9. withContext ·â×°º¯Êý

ÓÐʱ¶ÔÓÚº¯Êý»áÓÐÒ»Ð©ÖØ¸´ÀͶ¯£¬ÀýÈçËø/½âËø£¬³õʼ»¯Ò»¸öеľֲ¿ÉÏÏÂÎÄ£¬×¼±¸³õʼ»¯±äÁ¿µÈµÈ¡­¡­ÕâÀïÓÐÒ»¸öÀý×Ó£º

func foo() {
mu.Lock()
defer mu.Unlock()

// foo Ïà¹ØµÄ¹¤×÷
}

func bar() {
mu.Lock()
defer mu.Unlock()

// bar Ïà¹ØµÄ¹¤×÷
}

func qux() {
mu.Lock()
defer mu.Unlock()

// qux Ïà¹ØµÄ¹¤×÷
}

Èç¹ûÄãÏëÒªÐÞ¸Äij¸öÄÚÈÝ£¬ÄãÐèÒª¶ÔËùÓеͼ½øÐÐÐ޸ġ£Èç¹ûËüÊÇÒ»¸ö³£¼ûµÄÈÎÎñ£¬ÄÇô×îºÃ´´½¨Ò»¸ö½Ð×öwithContextµÄº¯Êý¡£Õâ¸öº¯ÊýµÄÊäÈë²ÎÊýÊÇÁíÒ»¸öº¯Êý£¬²¢Óõ÷ÓÃÕßÌṩµÄÉÏÏÂÎÄÀ´µ÷ÓÃËü£º

func withLockContext(fn func()) {
mu.Lock
defer mu.Unlock()

fn()
}

Ö»ÐèÒª½«Ö®Ç°µÄº¯ÊýÓÃÕâ¸ö½øÐзâ×°£º

func foo() {
withLockContext(func() {
// foo Ïà¹Ø¹¤×÷
})
}

func bar() {
withLockContext(func() {
// bar Ïà¹Ø¹¤×÷
})
}

func qux() {
withLockContext(func() {
// qux Ïà¹Ø¹¤×÷
})
}

²»Òª¹âÏë׿ÓËøµÄÇéÐΡ£¶Ô´ËÀ´Ëµ×îºÃµÄÓÃÀýÊÇÊý¾Ý¿âÁ´½Ó¡£ÏÖÔÚ¶Ô withContext º¯Êý×÷һЩССµÄ¸Ä¶¯£º

func withDBContext(fn func(db DB) error) error {
// ´ÓÁ¬½Ó³Ø»ñȡһ¸öÊý¾Ý¿âÁ¬½Ó
dbConn := NewDB()

return fn(dbConn)
}

ÈçÄãËù¼û£¬Ëü»ñȡһ¸öÁ¬½Ó£¬È»ºó´«µÝ¸øÌṩµÄ²ÎÊý£¬²¢ÇÒÔÚµ÷Óú¯ÊýµÄʱºò·µ»Ø´íÎó¡£ÄãÐèÒª×öµÄÖ»ÊÇ£º

func foo() {
withDBContext(func(db *DB) error {
// foo Ïà¹Ø¹¤×÷
})
}

func bar() {
withDBContext(func(db *DB) error {
// bar Ïà¹Ø¹¤×÷
})
}

func qux() {
withDBContext(func(db *DB) error {
// qux Ïà¹Ø¹¤×÷
})
}

ÄãÔÚ¿¼ÂÇÒ»¸ö²»Í¬µÄ³¡¾°£¬ÀýÈç×÷һЩԤ³õʼ»¯£¿Ã»ÎÊÌ⣬ֻÐèÒª½«ËüÃǼӵ½withDBContext¾Í¿ÉÒÔÁË¡£Õâ¶ÔÓÚ²âÊÔҲͬÑùÓÐЧ¡£

Õâ¸ö·½·¨ÓиöȱÏÝ£¬ËüÔö¼ÓÁËËõ½ø²¢ÇÒ¸üÄÑÔĶÁ¡£ÔÙ´ÎÌáʾ£¬ÓÀԶѰÕÒ×î¼òµ¥µÄ½â¾ö·½°¸¡£

10. Ϊ·ÃÎÊ map Ôö¼Ó setter£¬getters

Èç¹ûÄãÖØ¶ÈʹÓà map ¶ÁдÊý¾Ý£¬ÄÇô¾ÍΪÆäÌí¼Ó getter ºÍ setter °É¡£Í¨¹ý getter ºÍ setter Äã¿ÉÒÔ½«Âß¼­·â·Ö±ð×°µ½º¯ÊýÀï¡£ÕâÀï×î³£¼ûµÄ´íÎó¾ÍÊDz¢·¢·ÃÎÊ¡£Èç¹ûÄãÔÚij¸ö goroutein ÀïÓÐÕâÑùµÄ´úÂ룺

m["foo"] = bar

»¹ÓÐÕâ¸ö£º

delete(m, "foo")

»á·¢Éúʲô£¿ÄãÃÇÖеĴó¶àÊýÓ¦µ±ÒѾ­·Ç³£ÊìϤÕâÑùµÄ¾ºÌ¬ÁË¡£¼òµ¥À´ËµÕâ¸ö¾ºÌ¬ÊÇÓÉÓÚ map ĬÈϲ¢·ÇḬ̈߳²È«¡£²»¹ýÄã¿ÉÒÔÓû¥³âÁ¿À´±£»¤ËüÃÇ£º

mu.Lock()
m["foo"] = "bar"
mu.Unlock()

ÒÔ¼°£º

mu.Lock()
delete(m, "foo")
mu.Unlock()

¼ÙÉèÄãÔÚÆäËûµØ·½Ò²Ê¹ÓÃÕâ¸ö map¡£Äã±ØÐë°Ñ»¥³âÁ¿·ÅµÃµ½´¦¶¼ÊÇ£¡È»¶øÍ¨¹ý getter ºÍ setter º¯Êý¾Í¿ÉÒÔºÜÈÝÒ׵ıÜÃâÕâ¸öÎÊÌ⣺

func Put(key, value string) {
mu.Lock()
m[key] = value
mu.Unlock()
}
func Delete(key string) {
mu.Lock()
delete(m, key)
mu.Unlock()
}

ʹÓýӿڿÉÒÔ¶ÔÕâÒ»¹ý³Ì×ö½øÒ»²½µÄ¸Ä½ø¡£Äã¿ÉÒÔ½«ÊµÏÖÍêÈ«Òþ²ØÆðÀ´¡£Ö»Ê¹ÓÃÒ»¸ö¼òµ¥µÄ¡¢Éè¼ÆÁ¼ºÃµÄ½Ó¿Ú£¬È»ºóÈðüµÄÓû§Ê¹ÓÃËüÃÇ£º

type Storage interface {
Delete(key string)
Get(key string) string
Put(key, value string)
}

ÕâÖ»ÊǸöÀý×Ó£¬²»¹ýÄãÓ¦¸ÃÄÜÌå»áµ½¡£¶ÔÓڵײãµÄʵÏÖʹÓÃʲô¶¼Ã»¹ØÏµ¡£²»¹âÊÇʹÓýӿڱ¾ÉíºÜ¼òµ¥£¬¶øÇÒ»¹½â¾öÁ˱©Â¶ÄÚ²¿Êý¾Ý½á¹¹´øÀ´µÄ´óÁ¿µÄÎÊÌâ¡£

µ«ÊǵóÐÈÏ£¬ÓÐʱֻÊÇΪÁËͬʱ¶ÔÈô¸É¸ö±äÁ¿¼ÓËø¾ÍʹÓýӿڻáÓÐЩ¹ý·Ö¡£Àí½âÄãµÄ³ÌÐò£¬²¢ÇÒÔÚÄãÐèÒªµÄʱºòʹÓÃÕâЩ¸Ä½ø¡£

×ܽá

³éÏóÓÀÔ¶¶¼²»ÊÇÈÝÒ×µÄÊÂÇé¡£ÓÐʱ£¬×î¼òµ¥µÄ¾ÍÊÇÄãÒѾ­ÊµÏֵķ½·¨¡£ÒªÖªµÀ£¬²»ÒªÈÃÄãµÄ´úÂë¿´ÆðÀ´ºÜ´ÏÃ÷¡£Go ÌìÉú¾ÍÊǸö¼òµ¥µÄÓïÑÔ£¬ÔÚ´ó¶àÊýÇé¿öÏÂÖ»»áÓÐÒ»ÖÖ·½·¨À´×÷ijÊ¡£¼òµ¥ÊÇÁ¦Á¿µÄԴȪ£¬Ò²ÊÇΪʲôÔÚÈ˵IJãÃæËü±íÏÖµÄÈç´ËÓе¯ÐÔ¡£

Èç¹û±ØÒªµÄ»°£¬Ê¹ÓÃÕâЩ»ùÊý¡£ÀýÈ罫[]Serverת»¯ÎªServersÊÇÁíÒ»ÖÖ³éÏ󣬽öÔÚÄãÓÐÒ»¸öºÏÀíµÄÀíÓɵÄÇé¿öÏÂÕâô×ö¡£²»¹ýÓÐһЩ¼¼Êõ£¬Èç iota ´Ó 1 ¿ªÊ¼¼ÆÊý×ÜÊÇÓÐÓõġ£ÔÙ´ÎÌáÐÑ£¬ÓÀÔ¶±£³Ö¼òµ¥¡£

   
2596 ´Îä¯ÀÀ       28
Ïà¹ØÎÄÕÂ

¹È¸è½ÌÄãÈçºÎ¹¹½¨Ò»¸öÓÅÐãµÄÒÆ¶¯ÍøÕ¾
ÈçºÎ¸ßЧµØ¹ÜÀíÍøÕ¾¾²Ì¬×ÊÔ´
¸ßÐÔÄÜÍøÕ¾½¨ÉèµÄ×î¼Ñʵ¼ù
Ïл°ÍøÕ¾×ó²àµ¼º½µÄʵÏÖ
 
Ïà¹ØÎĵµ

ÍøÕ¾½¨Éè·½°¸Á÷³Ì
ÍøÕ¾½¨Éècss½Ì³Ì
ÆóÒµÍøÕ¾½¨ÉèÓëÍÆ¹ã
ÍøÕ¾½¨Éè·½°¸Êé
Ïà¹Ø¿Î³Ì

Éè¼ÆÄ£Ê½Ô­ÀíÓëÓ¦ÓÃ
´ÓÐèÇó¹ý¶Éµ½Éè¼Æ
Èí¼þÉè¼ÆÔ­ÀíÓëʵ¼ù
ÈçºÎ±àд¸ßÖÊÁ¿´úÂë
×îл¼Æ»®
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢ 6-12[ÏÃÃÅ]
È˹¤ÖÇÄÜ.»úÆ÷ѧϰTensorFlow 6-22[Ö±²¥]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 6-30[±±¾©]
ǶÈëʽÈí¼þ¼Ü¹¹-¸ß¼¶Êµ¼ù 7-9[±±¾©]
Óû§ÌåÑé¡¢Ò×ÓÃÐÔ²âÊÔÓëÆÀ¹À 7-25[Î÷°²]
ͼÊý¾Ý¿âÓë֪ʶͼÆ× 8-23[±±¾©]

Ê®Ììѧ»áDIV+CSS(WEB±ê×¼)
HTML 5µÄ¸ïУº½á¹¹Ö®ÃÀ
½éÉÜ27¿î¾­µäµÄCSS¿ò¼Ü
35¸öÓд´ÒâµÄ404´íÎóÒ³Ãæ
×îÈÝÒ×·¸µÄ13¸öJavaScript´íÎó
Éè¼ÆÒ×Àí½âºÍ²Ù×÷µÄÍøÕ¾

Éè¼ÆÄ£Ê½Ô­ÀíÓëÓ¦ÓÃ
´ÓÐèÇó¹ý¶Éµ½Éè¼Æ
Èí¼þÉè¼ÆÔ­ÀíÓëʵ¼ù
ÈçºÎ±àд¸ßÖÊÁ¿´úÂë
µ¥Ôª²âÊÔ¡¢Öع¹¼°³ÖÐø¼¯³É
Èí¼þ¿ª·¢¹ý³ÌÖ¸ÄÏ

¶«Èí¼¯ÍÅ ´úÂëÖØ¹¹
ij½ðÈÚÈí¼þ·þÎñÉÌ ¼¼ÊõÎĵµ
Öдïµçͨ Éè¼ÆÄ£Ê½Ô­ÀíÓëʵ¼ù
·¨¹úµçÐÅ ¼¼ÊõÎĵµ±àдÓë¹ÜÀí
Î÷ÃÅ×Ó Ç¶ÈëʽÉè¼ÆÄ£Ê½
ÖÐд󶫷½ÈËÊÙ ¼¼ÊõÎĵµ±àд