ÕâÀïÊÇÎÒ¹ýÈ¥¼¸ÄêÖбàдµÄ´óÁ¿ 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
ÀïÓÐÕâÑùµÄ´úÂ룺
»¹ÓÐÕâ¸ö£º
»á·¢Éúʲô£¿ÄãÃÇÖеĴó¶àÊýÓ¦µ±ÒѾ·Ç³£ÊìϤÕâÑùµÄ¾ºÌ¬ÁË¡£¼òµ¥À´ËµÕâ¸ö¾ºÌ¬ÊÇÓÉÓÚ 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 ¿ªÊ¼¼ÆÊý×ÜÊÇÓÐÓõġ£ÔÙ´ÎÌáÐÑ£¬ÓÀÔ¶±£³Ö¼òµ¥¡£ |