Go 璇█涓悓鏃舵湁鍑芥暟鍜屾柟娉曘?span style="color: #ff0000;">鏂規硶灝辨槸涓涓寘鍚簡鎺ュ彈鑰咃紙receiver錛夌殑鍑芥暟錛宺eceiver鍙互鏄唴緗被鍨嬫垨鑰呯粨鏋勪綋綾誨瀷鐨勪竴涓兼垨鑰呮槸涓涓寚閽堛傛墍鏈夌粰瀹氱被鍨嬬殑鏂規硶灞炰簬璇ョ被鍨嬬殑鏂規硶闆嗐?br />
濡備笅闈㈢殑榪欎釜渚嬪瓙錛屽畾涔変簡涓涓柊綾誨瀷Integer錛屽畠鍜宨nt涓鏍鳳紝鍙槸涓哄畠鍐呯疆鐨刬nt綾誨瀷澧炲姞浜嗕釜鏂版柟娉昄ess()
type Integer int func (a Integer) Less(b Integer) bool { return a < b } func main() { var a Integer = 1 if a.Less(2) { fmt.Println("less then 2") } }
鍙互鐪嬪嚭錛孏o璇█鍦ㄨ嚜瀹氫箟綾誨瀷鐨勫璞′腑娌℃湁C++/Java閭g闅愯棌鐨則his鎸囬拡錛岃屾槸鍦ㄥ畾涔夋垚鍛樻柟娉曟椂鏄懼紡澹版槑浜嗗叾鎵灞炵殑瀵硅薄銆?/p>
method鐨勮娉曞涓嬶細
func (r ReceiverType) funcName(parameters) (results)
褰撹皟鐢╩ethod鏃訛紝浼氬皢receiver浣滀負鍑芥暟鐨勭涓涓弬鏁幫細
funcName(r, parameters);
鎵浠ワ紝receiver鏄肩被鍨嬭繕鏄寚閽堢被鍨嬭鐪媘ethod鐨勪綔鐢ㄣ傚鏋滆淇敼瀵硅薄鐨勫鹼紝灝遍渶瑕佷紶閫掑璞$殑鎸囬拡銆?/p>
鎸囬拡浣滀負Receiver浼氬瀹炰緥瀵硅薄鐨勫唴瀹瑰彂鐢熸搷浣?鑰屾櫘閫氱被鍨嬩綔涓篟eceiver浠呬粎鏄互鍓湰浣滀負鎿嶄綔瀵硅薄,騫朵笉瀵瑰師瀹炰緥瀵硅薄鍙戠敓鎿嶄綔銆?/p>
func (a *Ingeger) Add(b Integer) { *a += b } func main() { var a Integer = 1 a.Add(3) fmt.Println("a =", a) // a = 4 }
濡傛灉Add鏂規硶涓嶄嬌鐢ㄦ寚閽堬紝鍒檃榪斿洖鐨勭粨鏋滀笉鍙橈紝榪欐槸鍥犱負Go璇█鍑芥暟鐨勫弬鏁頒篃鏄熀浜庡間紶閫掋?/p>
娉ㄦ剰錛?span style="color: #ff0000;">褰撴柟娉曠殑鎺ュ彈鑰呮槸鎸囬拡鏃訛紝鍗充嬌鐢ㄥ肩被鍨嬭皟鐢ㄩ偅涔堟柟娉曞唴閮ㄤ篃鏄鎸囬拡鐨勬搷浣溿?/span>
涔嬪墠璇磋繃錛孏o璇█娌℃湁鏋勯犲嚱鏁扮殑姒傚康錛岄氬父浣跨敤涓涓叏灞鍑芥暟鏉ュ畬鎴愩備緥濡傦細
func NewRect(x, y, width, height float64) *Rect { return &Rect{x, y, width, height} } func main() { rect1 := NewRect(1,2,10,20) fmt.Println(rect1.width) }
Go璇█鎻愪緵浜嗙戶鎵匡紝浣嗘槸閲囩敤浜嗙粍鍚堢殑璇硶錛屾垜浠皢鍏剁О涓哄尶鍚嶇粍鍚堬紝渚嬪錛?/span>
type Base struct { name string } func (base *Base) Set(myname string) { base.name = myname } func (base *Base) Get() string { return base.name } type Derived struct { Base age int } func (derived *Derived) Get() (nm string, ag int) { return derived.name, derived.age } func main() { b := &Derived{} b.Set("sina") fmt.Println(b.Get()) }
渚嬪瓙涓紝鍦˙ase綾誨瀷瀹氫箟浜唃et()鍜宻et()涓や釜鏂規硶錛岃孌erived綾誨瀷緇ф壙浜咮ase綾伙紝騫舵敼鍐欎簡Get()鏂規硶錛屽湪Derived瀵硅薄璋冪敤Set()鏂規硶錛屼細鍔犺澆鍩虹被瀵瑰簲鐨勬柟娉曪紱鑰岃皟鐢℅et()鏂規硶鏃訛紝鍔犺澆媧劇敓綾繪敼鍐欑殑鏂規硶銆?/p>
緇勫悎鐨勭被鍨嬪拰琚粍鍚堢殑綾誨瀷鍖呭惈鍚屽悕鎴愬憳鏃訛紝 浼氫笉浼氭湁闂鍛紵鍙互鍙傝冧笅闈㈢殑渚嬪瓙錛?/p>
type Base struct { name string age int } func (base *Base) Set(myname string, myage int) { base.name = myname base.age = myage } type Derived struct { Base name string } func main() { b := &Derived{} b.Set("sina", 30) fmt.Println("b.name =",b.name, "\tb.Base.name =", b.Base.name) fmt.Println("b.age =",b.age, "\tb.Base.age =", b.Base.age) }
鍊艱涔夊拰寮曠敤璇箟鐨勫樊鍒湪浜庤祴鍊鹼紝姣斿
b = a b.Modify()
濡傛灉b鐨勪慨鏀逛笉浼氬獎鍝峚鐨勫鹼紝閭d箞姝ょ被鍨嬪睘浜庡肩被鍨嬶紱濡傛灉浼氬獎鍝峚鐨勫鹼紝閭d箞姝ょ被鍨嬫槸寮曠敤綾誨瀷銆?/span>
Go璇█涓殑澶у鏁扮被鍨嬮兘鍩轟簬鍊艱涔夛紝鍖呮嫭錛?/p>
C璇█涓殑鏁扮粍姣旇緝鐗瑰埆錛岄氳繃鍑芥暟浼犻掍竴涓暟緇勭殑鏃跺欏熀浜庡紩鐢ㄨ涔夛紝浣嗘槸鍦ㄧ粨鏋勪綋瀹氫箟鏁扮粍鍙橀噺鐨勬椂鍊欏熀浜庡艱涔夈傝屽湪Go璇█涓紝鏁扮粍鍜屽熀鏈被鍨嬫病鏈夊尯鍒紝鏄緢綰補鐨勫肩被鍨嬶紝渚嬪錛?/p>
var a = [3] int{1,2,3} var b = a b[1]++ fmt.Println(a, b) // [1 2 3] [1 3 3]
浠庣粨鏋滅湅錛宐=a璧嬪艱鍙ユ槸鏁扮粍鍐呭鐨勫畬鏁村鍒訛紝瑕佹兂琛ㄨ揪寮曠敤錛岄渶瑕佺敤鎸囬拡錛?/p>
var a = [3] int{1,2,3} var b = &a銆銆銆銆// 寮曠敤璇箟 b[1]++ fmt.Println(a, b) // [1 3 3] [1 3 3]
Interface 鏄竴緇勬娊璞℃柟娉曪紙鏈叿浣撳疄鐜扮殑鏂規硶/浠呭寘鍚柟娉曞悕鍙傛暟榪斿洖鍊肩殑鏂規硶錛夌殑闆嗗悎錛屽鏋滃疄鐜頒簡 interface 涓殑鎵鏈夋柟娉曪紝鍗寵綾?瀵硅薄灝卞疄鐜頒簡璇ユ帴鍙c?/p>
Interface 鐨勫0鏄庢牸寮忥細
type interfaceName interface { //鏂規硶鍒楄〃 }
Interface 鍙互琚換鎰忓璞″疄鐜幫紝涓涓被鍨?瀵硅薄涔熷彲浠ュ疄鐜板涓?interface錛?br />interface鐨勫彉閲忓彲浠ユ寔鏈変換鎰忓疄鐜拌interface綾誨瀷鐨勫璞°?/span>
濡備笅闈㈢殑渚嬪瓙錛?/p>
package main import "fmt" type Human struct { name string age int phone string } type Student struct { Human //鍖垮悕瀛楁 school string loan float32 } type Employee struct { Human //鍖垮悕瀛楁 company string money float32 } //Human瀹炵幇SayHi鏂規硶 func (h Human) SayHi() { fmt.Printf("Hi, I am %s you can call me on %s\n", h.name, h.phone) } //Human瀹炵幇Sing鏂規硶 func (h Human) Sing(lyrics string) { fmt.Println("La la la la...", lyrics) } //Employee閲嶈澆Human鐨凷ayHi鏂規硶 func (e Employee) SayHi() { fmt.Printf("Hi, I am %s, I work at %s. Call me on %s\n", e.name, e.company, e.phone) } // Interface Men琚獺uman,Student鍜孍mployee瀹炵幇 // 鍥犱負榪欎笁涓被鍨嬮兘瀹炵幇浜嗚繖涓や釜鏂規硶 type Men interface { SayHi() Sing(lyrics string) } func main() { mike := Student{Human{"Mike", 25, "222-222-XXX"}, "MIT", 0.00} paul := Student{Human{"Paul", 26, "111-222-XXX"}, "Harvard", 100} sam := Employee{Human{"Sam", 36, "444-222-XXX"}, "Golang Inc.", 1000} tom := Employee{Human{"Tom", 37, "222-444-XXX"}, "Things Ltd.", 5000} //瀹氫箟Men綾誨瀷鐨勫彉閲廼 var i Men //i鑳藉瓨鍌⊿tudent i = mike銆銆銆銆 fmt.Println("This is Mike, a Student:") i.SayHi() i.Sing("November rain") //i涔熻兘瀛樺偍Employee i = tom fmt.Println("This is tom, an Employee:") i.SayHi() i.Sing("Born to be wild") //瀹氫箟浜唖lice Men fmt.Println("Let's use a slice of Men and see what happens") x := make([]Men, 3) //榪欎笁涓兘鏄笉鍚岀被鍨嬬殑鍏冪礌錛屼絾鏄粬浠疄鐜頒簡interface鍚屼竴涓帴鍙?/span> x[0], x[1], x[2] = paul, sam, mike for _, value := range x{ value.SayHi() } }
絀篿nterface(interface{})涓嶅寘鍚換浣曠殑method錛屾鍥犱負濡傛錛?span style="background-color: #ffff00;">鎵鏈夌殑綾誨瀷閮藉疄鐜頒簡絀篿nterface銆傜┖interface瀵逛簬鎻忚堪璧蜂笉鍒頒換浣曠殑浣滅敤(鍥犱負瀹冧笉鍖呭惈浠諱綍鐨刴ethod錛夛紝浣嗘槸絀篿nterface鍦ㄦ垜浠渶瑕佸瓨鍌ㄤ換鎰忕被鍨嬬殑鏁板肩殑鏃跺欑浉褰撴湁鐢紝鍥犱負瀹冨彲浠ュ瓨鍌ㄤ換鎰忕被鍨嬬殑鏁板箋傚畠鏈夌偣綾諱技浜嶤璇█鐨剉oid*綾誨瀷銆?/span>
// 瀹氫箟a涓虹┖鎺ュ彛 var a interface{} var i int = 5 s := "Hello world" // a鍙互瀛樺偍浠繪剰綾誨瀷鐨勬暟鍊?/span> a = i a = s
interface鐨勫彉閲忛噷闈㈠彲浠ュ瓨鍌ㄤ換鎰忕被鍨嬬殑鏁板鹼紙璇ョ被鍨嬪疄鐜頒簡interface錛夛紝閭d箞鎴戜滑鎬庝箞鍙嶅悜鐭ラ亾榪欎釜interface鍙橀噺閲岄潰瀹為檯淇濆瓨浜嗙殑鏄摢涓被鍨嬬殑瀵硅薄鍛紵鐩墠甯哥敤鐨勬湁涓ょ鏂規硶錛歴witch嫻嬭瘯銆丆omma-ok鏂█銆?/p>
switch嫻嬭瘯濡備笅錛?/p>
type Element interface{} type List [] Element type Person struct { name string age int } //鎵撳嵃 func (p Person) String() string { return "(name: " + p.name + " - age: "+strconv.Itoa(p.age)+ " years)" } func main() { list := make(List, 3) list[0] = 1 //an int list[1] = "Hello" //a string list[2] = Person{"Dennis", 70} for index, element := range list{ switch value := element.(type) { case int: fmt.Printf("list[%d] is an int and its value is %d\n", index, value) case string: fmt.Printf("list[%d] is a string and its value is %s\n", index, value) case Person: fmt.Printf("list[%d] is a Person and its value is %s\n", index, value) default: fmt.Println("list[%d] is of a different type", index) } } }
濡傛灉浣跨敤Comma-ok鏂█鐨勮瘽錛?/p>
func main() { list := make(List, 3) list[0] = 1 // an int list[1] = "Hello" // a string list[2] = Person{"Dennis", 70} for index, element := range list { if value, ok := element.(int); ok { fmt.Printf("list[%d] is an int and its value is %d\n", index, value) } else if value, ok := element.(string); ok { fmt.Printf("list[%d] is a string and its value is %s\n", index, value) } else if value, ok := element.(Person); ok { fmt.Printf("list[%d] is a Person and its value is %s\n", index, value) } else { fmt.Printf("list[%d] is of a different type\n", index) } } }
姝estruct綾誨瀷鍙互鍖呭惈涓涓尶鍚嶅瓧孌碉紝interface涔熷彲浠ュ祵濂楀彟澶栦竴涓帴鍙c?/p>
濡傛灉涓涓猧nterface1浣滀負interface2鐨勪竴涓祵鍏ュ瓧孌碉紝閭d箞interface2闅愬紡鐨勫寘鍚簡interface1閲岄潰鐨刴ethod銆?/p>
鎵璋撳弽灝勶紙reflect錛夊氨鏄兘媯鏌ョ▼搴忓湪榪愯鏃剁殑鐘舵併?/p>
浣跨敤reflect涓鑸垎鎴愪笁姝ワ紝涓嬮潰綆瑕佺殑璁茶В涓涓嬶細瑕佸幓鍙嶅皠鏄竴涓被鍨嬬殑鍊?榪欎簺鍊奸兘瀹炵幇浜嗙┖interface)錛岄鍏堥渶瑕佹妸瀹冭漿鍖栨垚reflect瀵硅薄(reflect.Type鎴栬卹eflect.Value錛屾牴鎹笉鍚岀殑鎯呭喌璋冪敤涓嶅悓鐨勫嚱鏁?銆傝繖涓ょ鑾峰彇鏂瑰紡濡備笅錛?/p>
t := reflect.TypeOf(i) //寰楀埌綾誨瀷鐨勫厓鏁版嵁,閫氳繃t鎴戜滑鑳借幏鍙栫被鍨嬪畾涔夐噷闈㈢殑鎵鏈夊厓绱?/span> v := reflect.ValueOf(i) //寰楀埌瀹為檯鐨勫鹼紝閫氳繃v鎴戜滑鑾峰彇瀛樺偍鍦ㄩ噷闈㈢殑鍊鹼紝榪樺彲浠ュ幓鏀瑰彉鍊?/span>
杞寲涓簉eflect瀵硅薄涔嬪悗鎴戜滑灝卞彲浠ヨ繘琛屼竴浜涙搷浣滀簡錛屼篃灝辨槸灝唕eflect瀵硅薄杞寲鎴愮浉搴旂殑鍊鹼紝渚嬪
tag := t.Elem().Field(0).Tag //鑾峰彇瀹氫箟鍦╯truct閲岄潰鐨勬爣絳?/span> name := v.Elem().Field(0).String() //鑾峰彇瀛樺偍鍦ㄧ涓涓瓧孌甸噷闈㈢殑鍊?/span>
鑾峰彇鍙嶅皠鍊艱兘榪斿洖鐩稿簲鐨勭被鍨嬪拰鏁板?/p>
var x float64 = 3.4 v := reflect.ValueOf(x) fmt.Println("type:", v.Type()) fmt.Println("kind is float64:", v.Kind() == reflect.Float64) fmt.Println("value:", v.Float())
鏈鍚庯紝鍙嶅皠鐨勮瘽錛岄偅涔堝弽灝勭殑瀛楁蹇呴』鏄彲淇敼鐨勶紝鎴戜滑鍓嶉潰瀛︿範榪囦紶鍊煎拰浼犲紩鐢紝榪欎釜閲岄潰涔熸槸涓鏍風殑閬撶悊銆傚弽灝勭殑瀛楁蹇呴』鏄彲璇誨啓鐨勬剰鎬濇槸錛屽鏋滀笅闈㈣繖鏍峰啓錛岄偅涔堜細鍙戠敓閿欒
var x float64 = 3.4 v := reflect.ValueOf(x) v.SetFloat(7.1)
濡傛灉瑕佷慨鏀圭浉搴旂殑鍊鹼紝蹇呴』榪欐牱鍐?/p>
var x float64 = 3.4 p := reflect.ValueOf(&x) v := p.Elem() v.SetFloat(7.1)
涓婇潰鍙槸瀵瑰弽灝勭殑綆鍗曚粙緇嶏紝鏇存繁鍏ョ殑鐞嗚В榪橀渶瑕佽嚜宸卞湪緙栫▼涓笉鏂殑瀹炶返銆?/p>
鍙傝冩枃妗o細
http://se77en.cc/2014/05/05/methods-interfaces-and-embedded-types-in-golang/
http://se77en.cc/2014/05/04/choose-whether-to-use-a-value-or-pointer-receiver-on-methods/
http://www.cnblogs.com/chenny7/p/4497969.html
func (p myType ) funcName ( a, b int , c string ) ( r , s int ) { return }
閫氳繃鍑芥暟瀹氫箟錛屾垜浠彲浠ョ湅鍒癎o涓嚱鏁板拰鍏朵粬璇█涓殑鍏辨у拰鐗規?/p>
Go涓嚱鏁扮殑鐗規ф槸闈炲父閰風殑錛岀粰鎴戜滑甯︽潵涓嶄竴鏍風殑緙栫▼浣撻獙銆?/p>
鍦℅o涓氳繃緇欏嚱鏁版爣鏄庢墍灞炵被鍨嬶紝鏉ョ粰璇ョ被鍨嬪畾涔夋柟娉曪紝涓婇潰鐨?nbsp;p myType
鍗寵〃紺虹粰myType澹版槑浜嗕竴涓柟娉曪紝 p myType
涓嶆槸蹇呴』鐨勩傚鏋滄病鏈夛紝鍒欑函綺規槸涓涓嚱鏁幫紝閫氳繃鍖呭悕縐拌闂俻ackageName.funcationName
濡傦細
//瀹氫箟鏂扮殑綾誨瀷double錛屼富瑕佺洰鐨勬槸緇檉loat64綾誨瀷鎵╁厖鏂規硶 type double float64 //鍒ゆ柇a鏄惁絳変簬b func (a double) IsEqual(b double) bool { var r = a - b if r == 0.0 { return true } else if r < 0.0 { return r > -0.0001 } return r < 0.0001 } //鍒ゆ柇a鏄惁絳変簬b func IsEqual(a, b float64) bool { var r = a - b if r == 0.0 { return true } else if r < 0.0 { return r > -0.0001 } return r < 0.0001 } func main() { var a double = 1.999999 var b double = 1.9999998 fmt.Println(a.IsEqual(b)) fmt.Println(a.IsEqual(3)) fmt.Println( IsEqual( (float64)(a), (float64)(b) ) ) }
涓婅堪紺轟緥涓?float64 鍩烘湰綾誨瀷鎵╁厖浜嗘柟娉旾sEqual錛岃鏂規硶涓昏鏄В鍐崇簿搴﹂棶棰樸?鍏舵柟娉曡皟鐢ㄦ柟寮忎負錛?nbsp;a.IsEqual(double)
錛屽鏋滀笉鎵╁厖鏂規硶錛屾垜浠彧鑳戒嬌鐢ㄥ嚱鏁?code style="margin: 0px 2px; padding: 0px 5px; border: 1px solid #eaeaea; background-color: #f8f8f8; border-radius: 3px; white-space: nowrap; font-family: monospace, Monaco;">IsEqual(a, b float64)
濡?nbsp;func IsEqual(a, b float64) bool
榪欎釜鏂規硶灝卞彧淇濈暀浜嗕竴涓被鍨嬪0鏄?姝ゆ椂鍏ュ弬a鍜宐鍧囨槸float64鏁版嵁綾誨瀷銆?榪欐牱涔熸槸鍙互鐨勶細 func IsEqual(a, b float64, accuracy int) bool
濡?nbsp;func Sum(args ...int)
鍙傛暟args鏄殑slice錛屽叾鍏冪礌綾誨瀷涓篿nt 銆傜粡甯鎬嬌鐢ㄧ殑fmt.Printf灝辨槸涓涓帴鍙椾換鎰忎釜鏁板弬鏁扮殑鍑芥暟 fmt.Printf(format string, args ...interface{})
鍓嶉潰鎴戜滑瀹氫箟鍑芥暟鏃惰繑鍥炲兼湁涓や釜r,s 銆傝繖鏄潪甯告湁鐢ㄧ殑錛屾垜鍦ㄥ啓C#浠g爜鏃訛紝甯稿父涓轟簡浠庡凡鏈夊嚱鏁頒腑鑾峰緱鏇村鐨勪俊鎭紝闇瑕佷慨鏀瑰嚱鏁扮鍚嶏紝浣跨敤out ,ref 絳夋柟寮忓幓鑾峰緱鏇村榪斿洖緇撴灉銆傝岀幇鍦ㄤ嬌鐢℅o鏃跺垯寰堢畝鍗曪紝鐩存帴鍦ㄨ繑鍥炲煎悗闈㈡坊鍔犺繑鍥炲弬鏁板嵆鍙?/p>
濡?鍦–#涓竴涓瓧絎︿覆杞崲涓篿nt綾誨瀷鏃墮昏緫浠g爜
int v=0; if ( int.TryPase("123456",out v) ) { //code }
鑰屽湪Go涓紝鍒欏彲浠ヨ繖鏍峰疄鐜?閫昏緫綺劇畝鑰屾槑紜?/p>
if v,isOk :=int.TryPase("123456") ; isOk { //code }
鍚屾椂鍦℅o涓緢澶氬嚱鏁板厖鍒嗗埄鐢ㄤ簡澶氳繑鍥炲?/p>
閭d箞濡傛灉鎴戝彧闇瑕佹煇涓涓繑鍥炲鹼紝鑰屼笉鍏沖績鍏朵粬榪斿洖鍊肩殑璇濓紝鎴戣濡備綍鍔炲憿錛?榪欐椂鍙互綆鍗曠殑浣跨敤絎﹀彿涓嬪垝綰?#8221;_“ 鏉ュ拷鐣ヤ笉鍏沖績鐨勮繑鍥炲箋傚錛?/p>
_, cos = math.Sincos(3.1415) //鍙渶瑕乧os璁$畻鐨勫?
鍓嶉潰鎴戜滑璇翠簡鍑芥暟鍙互鏈夊涓繑鍥炲鹼紝榪欓噷鎴戣繕瑕佽鐨勬槸錛屽湪鍑芥暟瀹氫箟鏃跺彲浠ョ粰鎵鏈夌殑榪斿洖鍊煎垎鍒懡鍚嶏紝榪欐牱灝辮兘鍦ㄥ嚱鏁頒腑浠繪剰浣嶇疆緇欎笉鍚岃繑鍥炲煎鍒訛紝鑰屼笉闇瑕佸湪return璇彞涓墠鎸囧畾榪斿洖鍊箋傚悓鏃朵篃鑳藉寮哄彲璇繪э紝涔熸彁楂榞odoc鎵鐢熸垚鏂囨。鐨勫彲璇繪?/p>
濡傛灉涓嶆敮鎸佸懡鍚嶈繑鍥炲鹼紝鎴戝彲鑳戒細鏄繖鏍峰仛鐨?/p>
func ReadFull(r Reader, buf []byte) (int, error) { var n int var err error for len(buf) > 0 { var nr int nr, err = r.Read(buf) n += nr if err !=nil { return n,err } buf = buf[nr:] } return n,err }
浣嗘敮鎸佺粰榪斿洖鍊煎懡鍚嶅悗錛屽疄闄呬笂灝辨槸鐪佺暐浜嗗彉閲忕殑澹版槑錛宺eturn鏃舵棤闇鍐欐垚return n,err
鑰屾槸灝嗙洿鎺ュ皢鍊艱繑鍥?/p>
func ReadFull(r Reader, buf []byte) (n int, err error) { for len(buf) > 0 && err == nil { var nr int nr, err = r.Read(buf) n += nr buf = buf[nr:] } return }
鍜孏o涓叾浠栦笢瑗夸竴鏍鳳紝鍑芥暟涔熸槸鍊鹼紝榪欐牱灝卞彲浠ュ0鏄庝竴涓嚱鏁扮被鍨嬬殑鍙橀噺錛屽皢鍑芥暟浣滀負鍙傛暟浼犻掋?/p>
澹版槑鍑芥暟涓哄肩殑鍙橀噺(鍖垮悕鍑芥暟:鍙祴鍊間釜鍙橀噺錛屼篃鍙洿鎺ユ墽琛?
//璧嬪?fc := func(msg string) { fmt.Println("you say :", msg) } fmt.Printf("%T \n", fc) fc("hello,my love") //鐩存帴鎵ц func(msg string) { fmt.Println("say :", msg) }("I love to code")
杈撳嚭緇撴灉濡備笅錛岃繖閲岃〃鏄巉c 鐨勭被鍨嬩負錛歠unc(string)
func(string) you say : hello,my love say : I love to code
灝嗗嚱鏁頒綔涓哄叆鍙傦紙鍥炶皟鍑芥暟錛夛紝鑳藉甫鏉ヤ究鍒┿傚鏃ュ織澶勭悊錛屼負浜嗙粺涓澶勭悊錛屽皢淇℃伅鍧囬氳繃鎸囧畾鍑芥暟鍘昏褰曟棩蹇楋紝涓旀槸鍚﹁褰曟棩蹇楄繕鏈夊紑鍏?/p>
func Log(title string, getMsg func() string) { //濡傛灉寮鍚棩蹇楄褰?鍒欒褰曟棩蹇? if true { fmt.Println(title, ":", getMsg()) } } //---------璋冪敤-------------- count := 0 msg := func() string { count++ return "鎮ㄦ病鏈夊嵆浣挎彁閱掓垜,宸茶Е鐘硶寰? } Log("error", msg) Log("warring", msg) Log("info", msg) fmt.Println(count)
榪欓噷杈撳嚭緇撴灉濡備笅錛宑ount 涔熷彂鐢熶簡鍙樺寲
error : 鎮ㄦ病鏈夊嵆浣挎彁閱掓垜,宸茶Е鐘硶寰?warring : 鎮ㄦ病鏈夊嵆浣挎彁閱掓垜,宸茶Е鐘硶寰?info : 鎮ㄦ病鏈夊嵆浣挎彁閱掓垜,宸茶Е鐘硶寰?3
浣犳湁娌℃湁娉ㄦ剰鍒頒笂闈㈢ず渚嬩腑鐨?nbsp;fc := func(msg string)...
錛屾棦鐒跺尶鍚嶅嚱鏁板彲浠ヨ祴鍊肩粰涓涓彉閲忥紝鍚屾椂鎴戜滑緇忓父榪欐牱緇檌nt璧嬪?nbsp;value := 2
,鏄惁鎴戜滑鍙互澹版槑func(string) 綾誨瀷 鍛紝褰撶劧鏄彲浠ョ殑銆?/p>
//涓涓褰曟棩蹇楃殑綾誨瀷錛歠unc(string) type saveLog func(msg string) //灝嗗瓧絎︿覆杞崲涓篿nt64,濡傛灉杞崲澶辮觸璋冪敤saveLog func stringToInt(s string, log saveLog) int64 { if value, err := strconv.ParseInt(s, 0, 0); err != nil { log(err.Error()) return 0 } else { return value } } //璁板綍鏃ュ織娑堟伅鐨勫叿浣撳疄鐜?func myLog(msg string) { fmt.Println("Find Error:", msg) } func main() { stringToInt("123", myLog) //杞崲鏃跺皢璋冪敤mylog璁板綍鏃ュ織 stringToInt("s", myLog) }
榪欓噷鎴戜滑瀹氫箟浜嗕竴涓被鍨嬶紝涓撻棬鐢ㄤ綔璁板綍鏃ュ織鐨勬爣鍑嗘帴鍙c傚湪stringToInt鍑芥暟涓鏋滆漿鎹㈠け璐ュ垯璋冪敤鎴戣嚜宸卞畾涔夌殑鎺ュ彛鍑芥暟榪涜鏃ュ織澶勭悊錛岃嚦浜庢渶緇堟墽琛岀殑鍝釜鍑芥暟錛屽垯鏃犻渶鍏沖績銆?/p>
defer 鍙堟槸涓涓垱鏂幫紝瀹冪殑浣滅敤鏄細寤惰繜鎵ц錛屽湪澹版槑鏃朵笉浼氱珛鍗蟲墽琛岋紝鑰屾槸鍦ㄥ嚱鏁皉eturn鍚庢椂鎸夌収鍚庤繘鍏堝嚭鐨勫師鍒欎緷嬈℃墽琛屾瘡涓涓猟efer銆傝繖鏍峰甫鏉ョ殑濂藉鏄紝鑳界‘淇濇垜浠畾涔夌殑鍑芥暟鑳界櫨鍒嗕箣鐧捐兘澶熻鎵ц鍒幫紝榪欐牱灝辮兘鍋氬緢澶氭垜浠兂鍋氱殑浜嬶紝濡傞噴鏀捐祫婧愶紝娓呯悊鏁版嵁錛岃褰曟棩蹇楃瓑
榪欓噷鎴戜滑閲嶇偣鏉ヨ鏄庝笅defer鐨勬墽琛岄『搴?/p>
func deferFunc() int { index := 0 fc := func() { fmt.Println(index, "鍖垮悕鍑芥暟1") index++ defer func() { fmt.Println(index, "鍖垮悕鍑芥暟1-1") index++ }() } defer func() { fmt.Println(index, "鍖垮悕鍑芥暟2") index++ }() defer fc() return func() int { fmt.Println(index, "鍖垮悕鍑芥暟3") index++ return index }() } func main() { deferFunc() }
榪欓噷杈撳嚭緇撴灉濡備笅錛?/p>
0 鍖垮悕鍑芥暟3 1 鍖垮悕鍑芥暟1 2 鍖垮悕鍑芥暟1-1 3 鍖垮悕鍑芥暟2
鏈夊涓嬬粨璁猴細
鍙﹀錛屾垜浠父浣跨敤defer鍘誨叧闂璉O,鍦ㄦ甯告墦寮鏂囦歡鍚庯紝灝辯珛鍒誨0鏄庝竴涓猟efer錛岃繖鏍峰氨涓嶄細蹇樿鍏抽棴鏂囦歡錛屼篃鑳戒繚璇佸湪鍑虹幇寮傚父絳変笉鍙鏂欑殑鎯呭喌涓嬩篃鑳藉叧闂枃浠躲傝屼笉鍍忓叾浠栬璦錛?code style="margin: 0px 2px; padding: 0px 5px; border: 1px solid #eaeaea; background-color: #f8f8f8; border-radius: 3px; white-space: nowrap; font-family: monospace, Monaco;">try-catch 鎴栬?nbsp;using()
鏂瑰紡榪涜澶勭悊銆?/p>
file , err :=os.Open(file) if err != nil { return err } defer file.Close() //dosomething with file
鍚庣畫錛屾垜灝嗚璁猴細 浣滅敤鍩熴佷紶鍊煎拰浼犳寚閽?浠ュ強 淇濈暀鍑芥暟init(),main()
鏈瑪璁頒腑鎵鍐欎唬鐮佸瓨鍌ㄤ綅緗細