ĺ¤ăăŽč¨čŞăŻăçĄĺé˘ć°ăćĺŽăăăăăŽčť˝éăŽć§ćăćäžăăžăăăăŽĺ ´ĺăé˘ć°ăŽĺăŻĺ¨ĺ˛ăŽăłăłăăăšăăăć´žçăăžăă
Goăă˘ăźďźhttps://tour.golang.org/moretypes/24ďźăŽĺ°ă塼复ăăăäžăčăăŚăżăžăăăă
func compute(fn func(float64, float64) float64) float64 {
return fn(3, 4)
}
var _ = compute(func(a, b float64) float64 { return a + b })
ĺ¤ăăŽč¨čŞă§ăŻăăłăłăăăšăăăć´žçăăŚăăĺŻč˝ć§ăăăăăăăăŽĺ ´ĺăçĄĺé˘ć°ăŽăăŠăĄăźăżăźă¨ćťăĺ¤ăŽĺăĺé¤ă§ăăžăă äžăă°ďź
// Scala
compute((x: Double, y: Double) => x + y)
compute((x, y) => x + y) // Parameter types elided.
compute(_ + _) // Or even shorter.
// Rust
compute(|x: f64, y: f64| -> f64 { x + y })
compute(|x, y| { x + y }) // Parameter and return types elided.
ăăŽăăăŞăăŠăźă ăGo2ăŤčż˝ĺ ăăăă¨ăć¤č¨ăăăă¨ăććĄăăžăăçšĺŽăŽć§ćăććĄăăăă¨ăŻăăăžăăă č¨čŞäťć§ăŽčŚłçšăăăăăăŻăé˘ć°ĺăŽäşćć§ăŽăăĺ¤ć°ăŤĺ˛ăĺ˝ăŚăăă¨ăă§ăăăĺćĺŽăăăŚăăŞăé˘ć°ăŞăăŠăŤăŽĺ˝˘ĺźă¨čăăăă¨ăă§ăăžăă ăăŽĺ˝˘ĺźăŽăŞăăŠăŤăŤăŻăăăŠăŤăăŽĺăăŞăă x := nil
ăă¨ăŠăźă§ăăăŽă¨ĺăăăăŤă :=
ăŽĺłĺ´ă§ä˝żç¨ăăăă¨ăŻă§ăăžăăă
Cap'n Protoă使ç¨ăăăŞă˘ăźăĺźăłĺşăăŻăĺ ĽĺăăčŚćąăĄăăťăźă¸ă渥ăăăé˘ć°ăăŠăĄăźăżăźăĺăăžăă https://github.com/capnproto/go-capnproto2/wiki/Getting-Startedăăďź
s.Write(ctx, func(p hashes.Hash_write_Params) error {
err := p.SetData([]byte("Hello, "))
return err
})
Rustć§ćăŽä˝żç¨ďźäžă¨ăăŚďźďź
s.Write(ctx, |p| {
err := p.SetData([]byte("Hello, "))
return err
})
errgroupăăăąăźă¸ďźhttp://godoc.org/golang.org/x/sync/errgroupďźăŻăă´ăŤăźăăłăŽă°ăŤăźăă玥çăăžăă
g.Go(func() error {
// perform work
return nil
})
Scalać§ćăŽä˝żç¨ďź
g.Go(() => {
// perform work
return nil
})
ďźăăŽĺ ´ĺăé˘ć°ăŽăˇă°ăăăŁăŻé常ăŤĺ°ăăăăăăăăŻăăăăăčť˝éăŽć§ćăăăžăć確ă§ăŞăĺ ´ĺă§ăăĺŻč˝ć§ăăăăžăăďź
ç§ăŻä¸čŹçăŞčăćšăŤĺ ąćăăŚăăžăăăä¸ăăăăçšĺŽăŽäžăŻăăžă誏ĺžĺăăŞăăă¨ăăăăăžăăć§ćăŽçšă§ćŻčźçĺ°ăăŞçŻç´ăŻĺéĄăŽäžĄĺ¤ăăŞăăăă§ăă ăăăăăăăăăăŁă¨čŻăäžăăăŁă¨čŞŹĺžĺăŽăă襨č¨ćłăăăăžăă
ďźăăăăäşé ćźçŽĺăŽäžăé¤ăăŚăăăăăăăŽĺ ´ĺăĺ ¸ĺçăŞGoăłăźăă§ăŠăăťăŠä¸čŹçă§ăăăăŻăăăăžăăăďź
ăăăă賢ăăăăć確ăŞćšăčŻăă§ăă ăăăăŽăˇă§ăźăăŤăăć§ćăčŚă¤ăăžăă
ăăăăŞăăťăŠéăă
2017ĺš´8ć18ćĽéććĽă04ďź43 Robert [email protected]
ć¸ăăžăăďź
ç§ăŻä¸čŹçăŞčăćšăŤĺ ąćăăŚăăžăăăĺ ˇä˝çăŞäžăčŚă¤ăăžăă
ăăžă誏ĺžĺăăŞăăă¨ăčăăă¨ďźć§ćăŽçšă§ćŻčźçĺ°ăăŞçŻç´
ăăŠăăŤăŽäžĄĺ¤ăŻăŞăăăă§ăă ăăăăăăăăăăŁă¨čŻăäžăăăăžă
ăă誏ĺžĺăŽăă襨č¨ăâ
ăăŽăšăŹăăăŤăľăăšăŻăŠă¤ăăăŚăăăăăăăăĺăĺăŁăŚăăžăă
ăăŽăĄăźăŤăŤç´ćĽčżäżĄăăGitHubă§čĄ¨ç¤şăăŚăă ăă
https://github.com/golang/go/issues/21498#issuecomment-323159706 ăăžăăŻăăĽăźă
ăšăŹăă
https://github.com/notifications/unsubscribe-auth/AAAcAxlgwt-iPryyY-d5w8GJho0bY9bkks5sZInfgaJpZM4O6pBB
ă
é˘ć°ćŹä˝ăĺç´ăŞĺźă§ăăĺ ´ĺăŤä˝żç¨ăĺśéăăă¨ăăăăŻăă誏ĺžĺăăăă¨ćăăžăă ăăăăŻă¨ć示çăŞreturn
ăč¨čż°ăăĺż
čŚăăăĺ ´ĺăĺŠçšăŻĺ¤ĺ°ĺ¤ąăăăžăă
ăăŞăăŽäžăŻ
s.Write(ctx, p => p.SetData([]byte("Hello, "))
g.Go(=> nil)
ć§ćăŻćŹĄăŽăăăŞăăŽă§ă
[ Identifier ] | "(" IdentifierList ")" "=>" ExpressionList
ăăăŻăé˘ć°ĺăŽĺ¤ă¸ăŽĺ˛ăĺ˝ăŚďźé˘ć°ĺźăłĺşăăŽăăăťăšă§ăŽăăŠăĄăźăżăźă¸ăŽĺ˛ăĺ˝ăŚăĺŤăďźă§ăŽăżä˝żç¨ă§ăăžăă čĺĽĺăŽć°ăŻé˘ć°ĺăŽăăŠăĄăźăżăŽć°ă¨ä¸č´ăăĺż čŚăăăăé˘ć°ĺăŤăăŁăŚčĺĽĺăŽĺăćąşăžăăžăă é˘ć°ĺăŽçľćăăźăă§ăăăăçľćăăŠăĄăźăżăźăŽć°ăăŞăšăĺ ăŽĺźăŽć°ă¨ä¸č´ăăŚăăĺż čŚăăăăžăă ĺĺźăŽăżă¤ăăŻă寞ĺżăăçľćăăŠăĄăźăżăźăŽăżă¤ăăŤĺ˛ăĺ˝ăŚĺŻč˝ă§ăăĺż čŚăăăăžăă ăăăŻăćăăăŞćšćłă§é˘ć°ăŞăăŠăŤă¨ĺçă§ăă
ăăăŤăŻăăăăć§ć解ćăŽăăăžăăăăăăžăă ć§ćăć¤č¨ăăăă¨ăčĺłćˇąăă§ăăă
Îť [Identifier] | "(" IdentifierList ")" "." ExpressionList
ăŽăăăŤ
s.Write(ctx, Îťp.p.SetData([]byte("Hello, "))
ăŻăăźă¸ăŁăźăä¸čŹçăŤä˝żç¨ăăăăăă¤ăăŽăąăźăšă
ďźç§ăŻçžĺ¨ăăăŽćŠč˝ăŽćç¨ć§ăŽč¨źć ăćäžăăăăăŤă丝ăŤăŚăźăšăąăźăšăĺéăăăă¨ăăŚăăžăăďź
ç§ăŻĺŽéăJavaăŽăăăŤGoăéˇăçĄĺé˘ć°ăĺşĺĽăăŞăăŽă弽ăă§ăă
Javaă§ăŻăçăçĄĺé˘ć°ă§ăăăŠă ăăŻç´ ć´ăăăçăăŽăŤĺŻžăăéˇăé˘ć°ăŻçăé˘ć°ăŤćŻăšăŚĺéˇă§éăă§ăă Javaă§1čĄăŽăŠă ăăŽăżă使ç¨ăăăă¨ăć¨ĺĽ¨ăăăăźăŻ/ć稿ăăŠăăă§čŚăăă¨ăăăăžăďźäťăŻčŚă¤ăăăžăăďźăăăăăŤăŻéĺéˇć§ăŽĺŠçšăăăšăŚăăăăă§ăă
Goă§ăŻăăăŽĺéĄăŻçşçăăžăăăçăĺżĺé˘ć°ă¨éˇăĺżĺé˘ć°ăŻăŠăĄăăćŻčźçďźăă ăăăžăĺ¤ăăŻăăăžăăăďźĺéˇă§ăăăăăéˇăé˘ć°ă使ç¨ăăăă¨ăŤç˛žçĽçăŞé厳ăŻăăăžăăăăăăŻé常ăŤäžżĺŠăŞĺ ´ĺăăăăžăă
ăăšăŚăĺźă§ăăăé˘ć°ăŽçľćăé˘ć°ăŽĺŽçžŠăŽćĺžăŽĺźă§ăăăăăé˘ć°ĺč¨čŞă§ăŻççĽĺ˝˘ăŻčŞçśă§ăă
éč¨ăćăŁăŚăăăă¨ăŻç´ ć´ăăăăŽă§ăä¸č¨ăĺ˝ăŚăŻăžăăŞăäťăŽč¨čŞăŻăăăćĄç¨ăăŚăăžăă
ăăăăç§ăŽçľé¨ă§ăŻăăšăăźăăĄăłăă使ç¨ăăŚč¨čŞăŽçžĺŽăŤăśă¤ăăŁăă¨ăăăăăŻćąşăăŚç´ ć´ăăăăă¨ă§ăŻăăăžăăă
ăăăăŻă¨ăŞăżăźăłăĺż čŚăŞăăăăťăźĺéˇă§ăăăăĺźăŽăżăĺŤăăăă¨ăă§ăăăăăćăĺç´ăŞăăŽăé¤ăăŚăĺşćŹçăŤăŻĺ˝šăŤçŤăĄăžăăă
GoăŽçĄĺé˘ć°ăŻăćéŠĺă§ăăéăčżăăăŽă§ăă ăă䝼ä¸ĺăăă¨ăŽäžĄĺ¤ăŻăăăăžăăă
ĺéĄă¨ăŞăăŽăŻfunc
ć§ćă§ăŻăŞăăĺéˇăŞĺ厣č¨ă§ăă
é˘ć°ăŞăăŠăŤăć確ăŞĺăĺé¤ă§ăăăăăŤăăă ăă§ă大ăăŤĺ˝šçŤăĄăžăă Cap'n'ProtoăŽäžă使ç¨ăăăŤăŻďź
s.Write(ctx, func(p) error { return p.SetData([]byte("Hello, ")) })
ăŻăăĺŽéăŤăă¤ăşăčż˝ĺ ăăăŽăŻĺ厣č¨ă§ăă ćŽĺżľăŞăăăăfuncďźpďźerrorăăŤăŻăă§ăŤćĺłăăăăžăă ăăăăăć¨čŤăăăăżă¤ăăŽäťŁăăăŤ_ă訹ĺŻăăăă¨ăŻćŠč˝ăăžăăďź
s.Write(ctx, func(p _) _ { return p.SetData([]byte("Hello, ")) })
ç§ăŻăăăăăă弽ăă§ăă ć§ćăŽĺ¤ć´ăŻăžăŁăăĺż čŚăăăžăăă
_ăŽĺéłăŻĺĽ˝ăă§ăŻăăăžăăă ăăśăăfuncăŻăăżă¤ăăăŠăĄăźăżăć¨ć¸ŹăăăăźăŻăźăăŤç˝Žăćăăăă¨ăă§ăăžăă
s.Write(ctx, Îť(p) { return p.SetData([]byte("Hello, ")) })
ăăăŻĺŽéăŤććĄă§ăăăăăă¨ăăăăŚăŁăźăłăŽăšăăźă ăŽăăăŤćăçăăĺ ´ĺăŤGoăăŠăŽăăăŤčŚăăăăĺăĺşăăŚăăă ăă§ăăďź ăăŽććĄăŻä¸ĺż čŚă§ăăăč¨čŞăčŞăżăăăăŤéçšă罎ăăŚăăăă¨ă¨ä¸č´ăăŚăăŞăă¨ćăăžăă
äťăŽč¨čŞă¨_čŚăçŽ_ăç°ăŞăă¨ăăççąă ăă§ăč¨čŞăŽć§ćăĺ¤ć´ăăăă¨ăăăŽăŻăăăŚăă ăăă
ăłăźăŤăăăŻăăźăšăŽAPIăŤäžĺăăäťăŽč¨čŞă§ăŻăç°Ąć˝ăŞçĄĺé˘ć°ăŽć§ćă使ç¨ăăćšă誏ĺžĺăăăă¨ćăăžăă Goă§ăŻăć°ăăć§ćăĺŽéăŤĺšćăçşćŽăăăăŠăăăŻăăăăžăăă äşşă ăçĄĺé˘ć°ă使ç¨ăăäžăăăăăăŞăăăă§ăŻăăăžăăăăĺ°ăŞăă¨ăç§ăčŞăżć¸ăăăăłăźăă§ăŻăé ťĺşŚăŻăăŞăä˝ăă§ăă
ăłăźăŤăăăŻăăźăšăŽAPIăŤäžĺăăäťăŽč¨čŞă§ăŻăç°Ąć˝ăŞçĄĺé˘ć°ăŽć§ćă使ç¨ăăćšă誏ĺžĺăăăă¨ćăăžăă
ăăç¨ĺşŚăăăăŻčŞĺˇąĺźˇĺăŽćĄäťśă§ăăGoă§ç°Ąć˝ăŞé˘ć°ăä˝ćăăćšăç°ĄĺăŞĺ ´ĺăŻăăăćŠč˝çăŞăšăżă¤ăŤăŽAPIă襨示ăăăĺŻč˝ć§ăăăăžăă ďźăăăčŻăăă¨ăăŠăăăŻăăăăžăăăďź
ăćŠč˝çăAPIă¨ăăłăźăŤăăăŻăAPIăŤăŻéăăăăăă¨ă埡調ăăăă¨ćăăžăăăăłăźăŤăăăŻăă¨čăă¨ăăéĺćăłăźăŤăăăŻăă¨ćăăžăăăăăŻă嚸éăŤăéżăăŚăăä¸ç¨ŽăŽăšăă˛ăăăŁăłăźăăŤă¤ăŞăăăžăăčĄăă ĺćAPIďź filepath.Walk
ăstrings.TrimFunc
ăŞăŠďźăŻăä¸čŹçăŤGoăăă°ăŠă ăŽĺćăšăżă¤ăŤă¨ăŽăăăăłă°ăĺŞăăŚăăăăăăăăăç§ăăĄăĺżľé ăŤç˝ŽăăŚăăăšăăŚăźăšăąăźăšă§ăă
ăăă§ăăŁă¤ă ăéł´ăăăŚăćŠćŚă大ĺš
ăŤć¸ăăăăăŽarrow
ăšăżă¤ăŤăŽăŠă ăć§ćďźăŤăŞăźĺďźăç解ăăăăăŤăŞăŁăăŚăźăšăąăźăšăćäžăăăă¨ćăăžăă
ć¤č¨ďź
// current syntax
func add(a int) func(int) int {
return func(b int) int {
return a + b
}
}
// arrow version (draft syntax, of course)
add := (a int) => (b int) => a + b
func main() {
add2 := add(2)
add3 := add(3)
fmt.Println(add2(5), add3(6))
}
ăăă§ăĺ¤ămongo.FieldConvertFunc
ăžăăŻćŠč˝çăŞă˘ăăăźăăĺż
čŚă¨ăăăăŽăŤăŤăŹăźăăăă¨ăăŚăăă¨ćłĺăăŚăă ăăăăăčť˝éăŞć§ćă使ç¨ăăă¨ăé˘ć°ăăŤăŹăźăăăŞăçść
ăăĺăćżăăă¨ăăŤăçśćłă大ĺš
ăŤćšĺăăăăă¨ăăăăăžăăăŤăŹăźăŤăŞăăžăďźčŞ°ăăćăăŞăăăăŁă¨çžĺŽçăŞäžăćäžăăŚĺš¸ăă§ăďźă
ç´ĺžă§ăăžăăăďź ăăăŻćăăŞăăŁăă goăŽăˇăłăăŤăă大弽ăă§ăäżčˇăă䞥ĺ¤ăăăă¨ćăăžăă
ç§ăŤăă辡ăăăăä¸ă¤ăŽçśćłăŻăăăŞăăćăŁăŚăăŚăăŤăŹăźă§ćŹĄăŽč°čŤăăŤăŹăźăăăă¨ăăăă¨ă§ăă
äťăăăŞăăŻĺ¤ć´ăăĺż
čŚăăăăžăfunc (a, b) x
ăŤfunc (a) func(b) x { return func (b) { return ...... x } }
ç˘ĺ°ć§ćăăăĺ ´ĺăŻăĺăŤĺ¤ć´ăăžă(a, b) => x
ăŤ(a) => (b) => x
@neildç§ăŻăžă ăăŽăšăŹăăăŤč˛˘çŽăăŚăăžăăăăăăŞăăććĄăăăăŽă¨ĺć§ăŽä˝ăăăĺŠçăĺžăĺĽăŽăŚăźăšăąăźăšăăăăžăă
ăăăăăăŽăłăĄăłăăŻăĺŽéăŤăŻăăłăźăăĺźăłĺşăéăŽĺéˇć§ăŤĺŻžĺŚăăĺĽăŽćšćłăŤé˘ăăăăŽă§ăgocode
ďźăžăăŻĺć§ăŽďźăăłăăŹăźăăŽăăăŞăăźăŤă使ç¨ăăŚăé˘ć°ĺ¤ăĺĺžăăžăă
ăăŞăăŽäžăĺăďź
func compute(fn func(float64, float64) float64) float64 {
return fn(3, 4)
}
ĺ Ľĺăăă¨äťŽĺŽăăă¨ă揥ăŽăăăŤăŞăăžăă
var _ = compute(
^
^
示ăăăä˝ç˝ŽăŤăŤăźă˝ăŤă罎ăăžăă 揥ăŤăăăŽăăăŞăăźăŤăĺźăłĺşăă¨ă揥ăŽăăăŞé˘ć°ĺ¤ăç°ĄĺăŤăăłăăŹăźăĺă§ăăžăă
var _ = compute(func(a, b float64) float64 { })
^
ăăăŻç˘şăăŤç§ăčăăŚăăăŚăźăšăąăźăšăăŤăăźăăă§ăăăă ăăăŻăăŞăăăŤăăźăăŚăăžăăďź
ăłăźăăŻăć¸ăăăŚăăăăăăŻăăăŤé ťçšăŤčŞăżĺăăăžăă ăăă§č¨čŞć§ćăĺ¤ć´ăă䞥ĺ¤ăăăă¨ăŻćăăžăăă ĺŠçšăăăĺ ´ĺăăăăŻä¸ťăŤăłăźăăăăčŞăżăăăăăăă¨ă§ăă ă¨ăăŁăżăźăŽăľăăźăăŻăăăĺŠăăžăăă
ăăĄăăăĺéĄăŻăçĄĺé˘ć°ăăĺŽĺ ¨ăŞĺăŽć ĺ ąăĺé¤ăăăă¨ăčŞăżăăăăĺŠăăă厳ăăăă¨ăăăă¨ă§ăă
ăăŽç¨ŽăŽć§ćăčŞăżăăăăä˝ä¸ăăăă¨ăŻćăăžăăăăťă¨ăăŠăăšăŚăŽćć°ăŽăăă°ăŠăăłă°č¨čŞăŤăŻăé˘ć°ĺăšăżă¤ăŤă使ç¨ăăŚăă¤ăŠăźăăŹăźăăć¸ăăăăłăźăăăăć確ă§äżĺŽăăăăăăăăăŽć§ćăăăăžăă é˘ć°ăŤăăŠăĄăźăżăźă¨ăăŚć¸Ąăăăă¨ăăŤgolangă§çĄĺé˘ć°ă使ç¨ăăăŽăŻé常ăŤčŚçă§ăăăăăŻă渥ăăŞăăă°ăŞăăŞăăă¨ăăăăŁăŚăăĺăăăä¸ĺşŚĺ Ľĺăăĺż čŚăăăăăă§ăă
ç§ăŻăăŽććĄăćŻćăăžăă ăżă¤ăăłă°ăçŻç´ăăčŞăżăăăăĺä¸ăăăžăăç§ăŽăŚăźăšăąăźăšă
// Type definitions and functions implementation.
type intSlice []int
func (is intSlice) Filter(f func(int) bool) intSlice { ... }
func (is intSlice) Map(f func(int) int) intSlice { ... }
func (is intSlice) Reduce(f func(int, int) int) int { ... }
list := []int{...}
is := intSlice(list)
čť˝éăŽçĄĺé˘ć°ć§ćăŞăďź
res := is.Map(func(i int)int{return i+1}).Filter(func(i int) bool { return i % 2 == 0 }).
Reduce(func(a, b int) int { return a + b })
čť˝éăŽçĄĺé˘ć°ć§ćă使ç¨ďź
res := is.Map((i) => i+1).Filter((i)=>i % 2 == 0).Reduce((a,b)=>a+b)
ç°Ąć˝ăŞçĄĺé˘ć°ĺźăăŞăăăăGoăŻčŞăżăŤăăăŞăăDRYăŽĺĺăŤéĺăăžăă é˘ć°ĺ/ăłăźăŤăăăŻAPIăč¨čż°ăăŚä˝żç¨ăăăăŽă§ăăăăăŽăăăŞAPIăŽä˝żç¨ăŻăăăšăŚăŽAPIĺźăłĺşăă§ăĺŽçžŠć¸ăżăŽé˘ć°ăžăăŻăłăłăăăšăăăé常ăŤć確ăŞĺć ĺ ąăçš°ăčżăĺżĺé˘ć°ĺźăŽăăăăă使ç¨ăăĺż čŚăăăăăăé常ăŤĺéˇă§ăďź APIăŻćŁăăč¨č¨ăăăŚăăžăďźă
ăăŽććĄăŤĺŻžăăç§ăŽéĄćăŻăGoăäťăŽč¨čŞăŽăăăŤčŚăăăăäźźăŚăăăšăă ă¨ç§ăćăăťăŠé ăăŻăăăžăăă ç§ăŽćŹ˛ćąăŻăčŞĺčŞčşŤăçš°ăčżăăä¸ĺż čŚăŞć§ćä¸ăŽăă¤ăşăĺŤăăăă¨ă¸ăŽĺŤćŞćăŤĺŽĺ ¨ăŤé§ăçŤăŚăăăŚăăžăă
Goă§ăŻăé˘ć°ĺŽŁč¨ăŽć§ćăŻăäťăŽĺŽŁč¨ăŽé常ăŽăăżăźăłăăĺ°ăĺ¤ăăŚăăžăă ĺŽć°ăĺăĺ¤ć°ăŤă¤ăăŚăŻă常ăŤćŹĄăŽăăŽăăăăžăă
keyword name type value
äžăă°ďź
const c int = 0
type t foo
var v bool = true
ä¸čŹăŤăĺăŻăŞăăŠăŤĺăŤăăăă¨ăăĺĺăŤăăăă¨ăă§ăăžăă ăăăćŠč˝ăăé˘ć°ăŽĺ ´ĺăĺăŻĺ¸¸ăŤăŞăăŠăŤç˝˛ĺă§ăăĺż čŚăăăăžăă 揥ăŽăăăŞçťĺăä˝ćă§ăăžăă
type BinaryOp func(x, y Value) Value
func f BinaryOp { ... }
ăăă§ăé˘ć°ĺăŻĺĺă¨ăăŚćĺŽăăăžăă ĺ°ăćĄĺźľăăă¨ăBinaryOpăŻăăźă¸ăŁăŻăăăă揥ăŽăăăŤć¸ăăă¨ăă§ăăžă
BinaryOp{ return x.Add(y) }
ăăăŻăăŻăăźă¸ăŁăźčĄ¨č¨ăçăăăăŽăŤĺ¤§ăăŤĺ˝šçŤă¤ĺŻč˝ć§ăăăăžăă äžăă°ďź
vector.Apply(BinaryOp{ return x.Add(y) })
丝ăŞćŹ çšăŻăăăŠăĄăźăżăźĺăé˘ć°ă§ĺŽŁč¨ăăăŚăăŞăăă¨ă§ăă é˘ć°ĺă使ç¨ăăă¨ăăăăăŻăăšăłăźăĺ
ăăŤăŞăăžăăăăăŻăăżă¤ăS
ăŽć§é ä˝ĺ¤x
ă使ç¨ăăă¨ăăťăŹăŻăżăźĺźx.f
ăŽăšăłăźăăŤăăŁăźăŤăf
ăĺ
ĽăăŽă¨ĺăă§ăă x.f
ăžăăŻć§é ä˝ăŞăăŠăŤS{f: "foo"}
ă
ăžăăăăăŤăŻć示çăŤĺŽŁč¨ăăăé˘ć°ĺăĺż čŚă§ăăăăăŻăăăŽĺăé常ăŤä¸čŹçă§ăăĺ ´ĺăŤăŽăżćĺłăăăăžăă
ăăŽč°čŤăŽăĄăăăŠĺĽăŽčŚçšă
čŞăżăăăă珏ä¸ă§ăăăăăăŻç§ăăĄĺ ¨ĺĄăĺćă§ăăăă¨ăŽăăă§ăă
ă¨ăŻăăăç§ăăăŁă¤ă ăéł´ăăăăăŽăŻďźäťăŽčŞ°ăăć示çăŤč¨ăŁăŚăăăăăŤăŻčŚăăŞăăŽă§ďźăčŞăżăăăăŽĺéĄăŻĺ¸¸ăŤăăŞăăć ŁăăŚăăăă¨ăŤăăăŁăŚăăă¨ăăăă¨ă§ăă čŞăżăăăăćăŞăăŽă厳ăŤăăăŽăăŤă¤ăăŚčŠąăĺăăă¨ăŻăç§ăŽćčŚă§ăŻăŠăăŤăčĄăăžăăă
@griesemerăăăăăV8ăŤĺăçľăă§ăăćéăăăŽăăă¤ăăŽčŚçšăăăă§ĺ˝šçŤă¤ă§ăăăă ç§ăŻďźĺ°ăŞăă¨ăďźé˘ć°ďź function(x) { return x; }
ďźăŽjavascriptăŽäťĽĺăŽć§ćăŤé常ăŤćşčśłăăŚăăă¨č¨ăăžăăăăăŻăďźăăćĺłă§ďźçžĺ¨ăŽGoăăăăăăŤčŞăżăăăăŞăŁăŚăăžăă ç§ăŻ@douglascrockfordăŽăăăŽć°ăăć§ćăŻćéăŽçĄé§ă§ăăăăŁăłăăŤăăžăăă
ăăăăăăă§ăăç˘ĺ°ăŽć§ćăŻ_happened_ă§ăăăç§ăŻăăă_ăăŞăăă°ăŞăăŞăăŁăăŽă§_ĺăĺ Ľăăžăăă ăăăăäťćĽă§ăŻăăăăăăĺ¤ă使ç¨ăăăă忍éŠăŤăŞăŁăăă¨ă§ăčŞăżăăăăĺ¤§ĺš ăŤĺä¸ăăă¨č¨ăăžăă ç§ăŻăŤăŞăźĺăŽăąăźăšă使ç¨ăăžăăďźăăăŚ@hooluupogăŻăăăăăă§ăźăłăăŽĺć§ăŽăąăźăšăć辡ăăžăăďźăčť˝éăŽć§ćăŻé庌ăŤĺˇ§ĺŚă§ăŞăăŚăčť˝éăŽăłăźăăçćăăžăă
äťă x => y => z => ...
ăŽăăăŞăă¨ăăăăłăźăăčŚăă¨ăä¸çŽă§ç解ăăăŽăăŻăăăŤç°ĄĺăŤăŞăăžăďźçš°ăčżăăžăăăç§ăŻăăăŤć
ŁăăŚăăăŽă§ăăăăťăŠćă§ăŻăăăžăăă§ăăăăăžăŁăăéăŽăă¨ăćăăžăăďźă
ç§ăč¨ăŁăŚăăăŽăŻăăăŽč°čŤăŻćŹĄăŽăăăŤčŚç´ăăăžăă
ç§ăăĄăă§ăăćĺăŽăă¨ăŻăăăĺ¤ăăŽăŚăźăšăąăźăšăćäžăăăă¨ă§ăă
@dimitropoulosăŽăłăĄăłăăŤĺżăăŚăăăăç§ăŽčŚč§ŁăŽĺ¤§ăžăăŞčŚç´ă§ăă
çžĺ¨ăŽć§ćă§ăŽä˝żç¨ăŻé常ăŤĺéˇă§ăăăăăăăŽććĄăă大ăăŞăĄăŞăăăĺžăăăăăśă¤ăłăăżăźăłďźé˘ć°ĺăăă°ăŠăăłă°ăŞăŠďźă使ç¨ăăăă¨ćăăžăă
@dimitropoulosç§ăŻV8ăŤĺăçľăă§ăăžăăăăăăăŻC ++ă§č¨čż°ăăă䝎ćłăăˇăłăć§çŻăăăă¨ă§ăăă ĺŽéăŽJavascriptă§ăŽç§ăŽçľé¨ăŻéăăăŚăăžăă ă¨ăŻč¨ăăăŽăŽăJavascriptăŻĺçăŤĺäťăăăăč¨čŞă§ăăăĺăăŞăăă°ĺäťăăŽĺ¤ăăŻăŞăăŞăăžăă ä˝äşşăăŽäşşă䝼ĺăŤć辡ăăăăăŤăăăă§ăŽä¸ťčŚăŞĺéĄăŻăĺăçš°ăčżăĺż čŚăăăăă¨ă§ăăăăăŻăJavascriptăŤăŻĺĺ¨ăăŞăĺéĄă§ăă
ăžăăč¨é˛ăŽăăăŤďźGoăŽč¨č¨ăŽĺćăŽé ăç§ăăĄăŻĺŽéăŤé˘ć°ăˇă°ăăăŁăŽç˘ĺ°ć§ćă調ăšăžăăă 芳細ăŻčŚăăŚăăžăăăă
func f (x int) -> float32
ăăŻă¤ăăăźăăŤăăăžăăă č¤ć°ăŽďźăżăăŤă§ăŻăŞăďźćťăĺ¤ă§ăŻăăžăćŠč˝ăăŞăăŁăăăăćçľçăŤç˘ĺ°ăĺé¤ăăžăăă func
ă¨ăăŠăĄăźăżăĺĺ¨ăăĺ ´ĺăç˘ĺ°ăŻä¸čŚă§ăăă ăăăăăăăăăďźć°ĺŚçăŤčŚăăăăăŤďźă§ăăăăăă§ăä¸čŚă§ăă ăžăăăç°ăŞăă税éĄăŽč¨čŞăŤĺąăăć§ćăŽăăăŤăčŚăăžăăă
ăăăăăăăŠăźăăłăšăŽéŤăćąç¨č¨čŞă§ăŻăăźă¸ăŁă使ç¨ăăăă¨ă§ăć°ăăăăăćŠč˝çăŞăăă°ăŠăăłă°ăšăżă¤ăŤă¸ăŽćăéăăăžăăă 10ĺš´ĺžăŽäťăĺĽăŽč§ĺşŚăăčŚăăăăăăžăăă
ăăă§ăăăŻăăźă¸ăŁăźç¨ăŽçšĺĽăŞć§ćăä˝ćăăŞăăăăŤăăăă§ăŻé常ăŤćł¨ćăăĺż čŚăăăă¨ćăăžăă ç§ăăĄăäťćăŁăŚăăăăŽăŻăˇăłăăŤă§ĺŽćçă§ăăăăăăžă§ăăžăćŠč˝ăăŚăăžăăă ă˘ăăăźăăăŠăă§ăăăä˝ăĺ¤ĺăăăă°ăăăăŻĺŽćçă§ăăăăăăăćŠč˝ăŤéŠç¨ăăăĺż čŚăăăă¨ç§ăŻäżĄăăŚăăžăă
Goă§ăŻăé˘ć°ĺŽŁč¨ăŽć§ćăŻăäťăŽĺŽŁč¨ăŽé常ăŽăăżăźăłăăĺ°ăĺ¤ăăŚăăžăă ĺŽć°ăĺăĺ¤ć°ăŤă¤ăăŚăŻă常ăŤćŹĄăŽăăŽăăăăžăă
keyword name type value
[âŚ]
ăăăćŠč˝ăăé˘ć°ăŽĺ ´ĺăĺăŻĺ¸¸ăŤăŞăăŠăŤç˝˛ĺă§ăăĺż čŚăăăăžăă
ăăŠăĄăźăżăŞăšăă¨const
ăăăłvar
厣č¨ăŽĺ ´ĺăĺć§ăŽăăżăźăłIdentifierList Type
ăăăăăăăăăăăäżćăăĺż
čŚăăăăă¨ăŤćł¨ćăăŚăă ăăă ăŠă ăč¨çŽăšăżă¤ăŤăŽ:
ăăźăŻăłăé¤ĺ¤ăăŚăĺ¤ć°ĺăĺăăĺé˘ăăăăă§ăă
ă˘ăăăźăăăŠăă§ăăăä˝ăĺ¤ĺăăăă°ăăăăŻĺŽćçă§ăăăăăăăćŠč˝ăŤéŠç¨ăăăĺż čŚăăăă¨ç§ăŻäżĄăăŚăăžăă
keyword name type value
ăăżăźăłăŻ_declarations_ç¨ă§ăăă @ neildăč¨ĺăăăŚăźăšăąăźăšăŻăăšăŚ_literals_ç¨ă§ăă
ăŞăăŠăŤăŽĺéĄăŤĺăçľăă¨ă厣č¨ăŽĺéĄăŻĺăăŤčśłăăŞăăăŽăŤăŞăă¨ćăăžăă ĺŽć°ăĺ¤ć°ăăăăłnowĺăŽĺŽŁč¨ă§ăŻă value
ăŽĺăŤ=
ăăźăŻăłă訹ĺŻďźăžăăŻčŚćąďźăăžăă ăăăé˘ć°ăŤćĄĺźľăăăŽăŻç°ĄĺăŞăăă§ăă
FunctionDecl = "func" ( FunctionSpec | "(" { FunctionSpec ";" } ")" ).
FunctionSpec = FunctionName Function |
IdentifierList (Signature | [ Signature ] "=" Expression) .
FunctionLit = "func" Function | ShortFunctionLit .
ShortParameterList = ShortParameterDecl { "," ShortParameterDecl } .
ShortParameterDecl = IdentifierList [ "..." ] [ Type ] .
=
ăăźăŻăłăŽĺžăŽĺźăŻăé˘ć°ăŞăăŠăŤă§ăăăăăłăłăă¤ăŤćăŤĺźć°ăăăšăŚä˝żç¨ĺŻč˝ăŞĺźăłĺşăăŤăăŁăŚčżăăăé˘ć°ă§ăăĺż
čŚăăăăžăă =
形ĺźă§ăăĺźć°ĺăŽĺŽŁč¨ăăŞăăŠăŤăăFunctionSpec
ăŤç§ťĺăăăăăŤă Signature
ăćĺŽă§ăăžăă
ShortParameterDecl
ă¨ć˘ĺăŽParameterDecl
ăŽéăăŻăăˇăłă°ăŤăăłIdentifierList
ăĺă§ăŻăŞăăăŠăĄăźăżăźĺă¨ăăŚč§Łéăăăăă¨ă§ăă
äž
äťćĽĺăĺ ĽăăăăăăŽé˘ć°ĺŽŁč¨ăčăăŚăżăžăăăă
func compute(f func(x, y float64) float64) float64 { return f(3, 4) }
䝼ä¸ăŽäžăŤĺ ăăŚăăăăäżćăăăďźGo 1äşćć§ăŞăŠďźă Function
ăŽćŹçŞç°ĺ˘ăĺé¤ăăŚă ShortFunctionLit
ăăźă¸ă§ăłăŽăżă使ç¨ăăăă¨ăă§ăăžăă
ăăžăăžăŞShortFunctionLit
ăŞăăˇă§ăłăŤă¤ăăŚăä¸č¨ă§ććĄăăććłăŻćŹĄăŽăăăŤăŞăăžăă
ăăłăŽăăăŞďź
ShortFunctionLit = "|" ShortParameterList "|" Block .
揥ăŽăăăăăčŞăăžăă
func compute = |f func(x, y float64) float64| { f(3, 4) }
func compute(func (x, y float64) float64) float64 = |f| { f(3, 4) }
md5-c712da47cbcf3d0379ff810dfd76ce59
```go
func (
compute(func (x, y float64) float64) float64 = |f| { f(3, 4) }
)
md5-8a4d86e5ac5f718d8d35839eaf9f1029
ShortFunctionLit = "(" ShortParameterList ")" "=>" Expression .
md5-e429c4db0e2a76fe83f1f524910c0075
```go
func compute(func (x, y float64) float64) float64 = (f) => f(3, 4)
md5-bcb7677c087284f6121b65ce14d46d93
```go
func (
compute(func (x, y float64) float64) float64 = (f) => f(3, 4)
)
md5-bf0cf8ca5f55bbedf92dc2047d871378
ShortFunctionLit = "Îť" ShortParameterList "." Expression .
md5-3c1a0d273a1aee09721883f5be8fcfce
```go
func compute(func (x, y float64) float64) float64) = Îťf.f(3, 4)
md5-87735958588cf5a763da8a89d1f9a675
```go
func (
compute(func (x, y float64) float64) float64) = Îťf.f(3, 4)
)
md5-d613a37ac429244205560535e5401d63
ShortFunctionLit = "\" ShortParameterList "->" Expression .
md5-95523002741f1036dff7837c1701336d
```go
func compute(func (x, y float64) float64) float64) = \f -> f(3, 4)
md5-818e7097669fe3bc7a333787735e5657
```go
func (
compute(func (x, y float64) float64) float64) = \f -> f(3, 4)
)
md5-af63df358fad8d4beffd23e2d0c337a4
ShortFunctionLit = "[" ShortParameterList "]" Block .
md5-f66b9b33e7dca8cce60726de14cfc931
```go
func compute(func (x, y float64) float64) float64) = [f] { f(3, 4) }
md5-13e2e0ab357ce95a5a0e2fbd930ba841
```go
func (
compute(func (x, y float64) float64) float64) = [f] { f(3, 4) }
)
ĺäşşçăŤăŻăScalaăŽăăăŞăăŞă˘ăłăăé¤ăăŚăăšăŚăăăŞăčŞăżăăăă¨ćăăžăă ďźç§ăŽçŽăŤăŻăScalaăŽăăăŞăăŞă˘ăłăăŻćŹĺź§ăéăăăžăăăăăŤăăăçˇăŽăšăăŁăłăăŻăăăŤĺ°éŁăŤăŞăăžăăďź
ĺäşşçăŤăŻăć¨ć¸Źă§ăăă¨ăăŤăăŠăĄăźăżăźă¨çľćăŽăżă¤ăăççĽă§ăăăŽă§ăăă°ă丝ăŤăăăŤčĺłăăăăžăă ăăăă§ăăă°ăçžĺ¨ăŽé˘ć°ăŞăăŠăŤć§ćă§ăĺéĄăăăžăăă ďźăăăŤă¤ăăŚăŻä¸ă§čŞŹćăăžăăăďź
確ăăŤăăăăŻ@griesemerăŽăłăĄăłăăŤĺăăžăă
ă˘ăăăźăăăŠăă§ăăăä˝ăĺ¤ĺăăăă°ăăăăŻĺŽćçă§ăăăăăăăćŠč˝ăŤéŠç¨ăăăĺż čŚăăăă¨ç§ăŻäżĄăăŚăăžăă
ç§ăŻăăăŤĺŽĺ ¨ăŤăŻĺžăăžăăă é˘ć°ćŹä˝ăăĺĺăŞç˛žĺşŚă§é˘ć°ăĺ°ĺşăăćšćłăăŞăăăăé˘ć°ĺŽŁč¨ăŤăŻĺż ăé˘ć°ăŽĺŽĺ ¨ăŞĺć ĺ ąăĺŤăăĺż čŚăăăăžăă ďźăăĄăăăăăăŻăăšăŚăŽč¨čŞăŤĺ˝ăŚăŻăžăăăă§ăŻăăăžăăăăGoăŤăŻĺ˝ăŚăŻăžăăžăăďź
ĺŻžç §çăŤăé˘ć°ăŞăăŠăŤăŻăłăłăăăšăăăĺć ĺ ąăć¨ć¸Źă§ăăžăă
@neildä¸ćŁç˘şăŞăă¨ăă芍ăłăăžăďźç§ăăăŽćăćĺłăăăŽăŻăć°ăăç°ăŞăć§ćďźç˘ĺ°ăžăăŻăăŞăăćăŁăŚăăăăŽďźăăăŁăĺ ´ĺăăăăŻăăčŚĺçă§ăŠăăŤă§ăéŠç¨ăăăăŻăă ă¨ăăăă¨ă§ăă ăżă¤ăăççĽă§ăăĺŻč˝ć§ăăăĺ ´ĺăăăăŻĺăłç´äş¤ăăžăă
@griesemerăăăă¨ă; ç§ăŻďźăťă¨ăăŠďźăăŽçšăŤĺćăăžăă
ăăŽććĄăŽčĺłćˇąă質ĺăŻăć§ćă使ç¨ăăăă¨ăčŻăă˘ă¤ăă˘ăăŠăăă¨ăăăă¨ă ă¨ćăăžăă ăăŽć§ćăä˝ă§ăăăăŻéčŚă§ăăăćŻčźçç°Ąĺă§ăă
ăăăăç§ăŻčŞĺăŽććĄăĺ°ăčŞčť˘čťăŤäšăăăă¨ăăčŞćăŤćľćăăăă¨ăŻă§ăăžăăă
var sum func(int, int) int = func a, b { return a + b }
@neildăŽććĄăŻç§ăŤă¨ăŁăŚćŁăăă¨ćăăŚăăžăă ăăăŻć˘ĺăŽć§ćăŤăăŞăčżăă§ăăăĺćĺŽăŽçš°ăčżăăćé¤ăăăăăé˘ć°ĺăăă°ăŠăăłă°ă§ćŠč˝ăăžăă (a, b) => a + b
ăăăăŻăăăŤăłăłăăŻăă§ăŻăŞăăć˘ĺăŽć§ćăŤăăžăéŠĺăăžăă
@neild
var sum func(int, int) int = func a, b { return a + b }
ăăăŻĺ¤ć°ăžăăŻé˘ć°ă厣č¨ăăžăăďź ĺ¤ć°ăŽĺ ´ĺăĺçăŽé˘ć°ĺŽŁč¨ăŻăŠăŽăăăŤăŞăăžăăďź
ä¸č¨ăŽĺŽŁč¨ăšăăźăă§ăŻăćŁăăç解ăăŚăăĺ ´ĺăŻćŹĄăŽăăăŤăŞăăžăă
ShortFunctionLit = "func" ShortParameterList Block .
func compute = func f func(x, y float64) float64 { return f(3, 4) }
func compute(func (x, y float64) float64) float64 = func f { return f(3, 4) }
func (
compute = func f func(x, y float64) float64 { return f(3, 4) }
)
func (
compute(func (x, y float64) float64) float64 = func f { return f(3, 4) }
)
ç§ăŻăăĄăłă§ăŻăŞăă¨ćăăžăă func
ă§ĺ°ăéĺăă func
ăăźăŻăłă¨ăăăŤçśăăăŠăĄăźăżăźăŽéăŤĺĺăŞčŚčŚçăăŹăźăŻăćäžăăŚăăŞăăăă§ăă
ăžăăŻăăŞăăŠăŤăŤĺ˛ăĺ˝ăŚăăŽă§ăŻăŞăă厣č¨ăăćŹĺź§ăé¤ĺ¤ăăžăăďź
func compute f func(x, y float64) float64 { return f(3, 4) }
ç§ăŻăžă čŚčŚçăŞäźćŠăŽćŹ ĺŚă弽ăă§ăŻăăăžăăă...
ăăăŻĺ¤ć°ăžăăŻé˘ć°ă厣č¨ăăžăăďź ĺ¤ć°ăŽĺ ´ĺăĺçăŽé˘ć°ĺŽŁč¨ăŻăŠăŽăăăŤăŞăăžăăďź
ĺ¤ć°ă ĺçăŽé˘ć°ĺŽŁč¨ăŻăăăăfunc sum a, b { return a+b }
ă§ăăăćăăăŞççąă§çĄĺšăŤăŞăăžăăé˘ć°ĺŽŁč¨ăăăăŠăĄăźăżăźĺăĺé¤ăăăă¨ăŻă§ăăžăăă
ç§ăčăăŚăăććłăŽĺ¤ć´ăŻćŹĄăŽăăăŤăŞăăžăă
ShortFunctionLit = "func" [ IdentifierList ] [ "..." ] FunctionBody .
çăé˘ć°ăŞăăŠăŤăŻăăăŠăĄăźăżăźăŞăšăăŽćŹĺź§ăççĽăăŚé常ăŽé˘ć°ăŞăăŠăŤă¨ĺşĺĽăăăç俥ăăŠăĄăźăżăźăŽĺĺăŽăżăĺŽçžŠăăçşäżĄăăŠăĄăźăżăźăŻĺŽçžŠăăžăăă ç俥ăăŠăĄăźăżăŽăżă¤ăă¨çşäżĄăăŠăĄăźăżăŽăżă¤ăăăăłć°ăŻăĺ¨ĺ˛ăŽăłăłăăăšăăăĺ°ĺşăăăžăă
çăé˘ć°ăŞăăŠăŤă§ăŞăăˇă§ăłăŽăăŠăĄăźăżăźĺăćĺŽă§ăăăăăŤăăĺż čŚăŻăŞăă¨ćăăžăă ăăŽĺ ´ĺăŻăé常ăŽé˘ć°ăŞăăŠăŤă使ç¨ăăă ăă§ăă
@ianlancetaylorăććăăăăăŤăčť˝é襨č¨ăŻăăăŠăĄăźăżăźăżă¤ăăç°ĄĺăŤć¨ć¸Źă§ăăăăăăăŠăĄăźăżăźăżă¤ăăŽççĽă訹ĺŻăăăŚăăĺ ´ĺăŤăŽăżćĺłăăăăžăă ăăŽăăă @ neildăŽććĄăŻăç§ăăăăžă§ăŤčŚăä¸ă§ćéŤăă¤ćăĺç´ăŞăăŽă§ăă ăă ăăç°ĄĺăŤč¨ąĺŻăăăŞăăă¨ăŽ1ă¤ăŻăĺĺäťăçľćăăŠăĄăźăżăźăĺç §ăăé˘ć°ăŞăăŠăŤăŽčť˝é襨č¨ă§ăă ăăăăăăăăăăŽĺ ´ĺă彟ăăŻĺŽĺ ¨ăŞčĄ¨č¨ćłă使ç¨ăăĺż čŚăăăăžăă ďźĺ°ăä¸čŚĺă§ăďźă
(x, y) { ... }
ăfunc (x, y T) T { ... }
ăŽç縎形ă¨ăăŚč§Łćă§ăăĺ ´ĺăăăăžăă ăăźăľăźăŽĺ
čŞăżăĺ°ăĺż
čŚăŤăŞăăžăăăăăăťăŠćŞăăŻăŞăăăăăăžăăă
ĺŽé¨ă¨ăăŚăé˘ć°ăŞăăŠăŤăăłăłăăŻăăŞć§ćăŤć¸ăç´ăăsrc /ăŤĺŻžăăŚĺŽčĄăăăăăŤgofmtăĺ¤ć´ăăžăăă ăăă§çľćăčŚăăă¨ăă§ăăžăďź
https://github.com/neild/go/commit/2ff18c6352788aa8f8cbe8b5d5d4c73956ca7c6f
ç§ăŻăăăçăŤăăŞăŁăŚăăĺ ´ĺăŤéĺŽăăăă¨ăŻăăžăăă§ăăă ăłăłăăŻăăŞć§ćăĺŽéăŤăŠăŽăăăŤćŠč˝ăăăăç解ăăăăŁăă ăă§ăă çľćăŤă¤ăăŚćčŚăčż°ăšăăŤăŻăăžă ĺĺăŤćăä¸ăăŚăăžăăă
@neildăăźăšĺćă ăăă¤ăăŽčŚłĺŻďź
ć示çăŞĺ注éăŞăă§ăăăăŽăąăźăšăĺŚçăăăŤăŻăăăč¤éăŞć¨čŤă˘ăŤă´ăŞăşă ăĺż
čŚăŤăŞăăăăé˘ć°ăŞăăŠăŤă:=
ă使ç¨ăăŚăă¤ăłăăăăăąăźăšăŽĺ˛ĺăŻćĺž
ĺ¤ăă§ăă
ăłăźăŤăăăŻăŤć¸ĄăăăăŞăăŠăŤăŻăčŞăżăăăĺ ´ĺăăăă°ăčŞăżăŤăăĺ ´ĺăăăăžăă
ăă¨ăă°ăĺ¤ăăŽčĄăŤăžăăăé˘ć°ăŞăăŠăŤăŽreturn-typeć
ĺ ąă夹ăăă¨ăŻăčŞč
ăŤćŠč˝APIăć˘ăăŚăăăŽăăĺ˝äť¤ĺAPIăć˘ăăŚăăăŽăăçĽăăăăăăĺ°ăćŽĺżľă§ăă
ăšăŠă¤ăšĺ ăŽé˘ć°ăŞăăŠăŤăŽĺŽĺćăŽĺć¸ăŻĺ¤§ĺš ă§ăă
defer
ăăăłgo
ăšăăźăăĄăłăăŻčĺłćˇąăăąăźăšă§ăăĺŽéăŤé˘ć°ăŤć¸Ąăăăĺźć°ăăĺźć°ăŽĺăć¨ć¸Źăăžăăďź
ćŤĺ°žăŽ...
ăăźăŻăłăŽăăă¤ăăäžăăćŹ č˝ăăŚăăžăă
defer
ă¨go
ăŻç˘şăăŤé常ăŤčĺłćˇąăăąăźăšă§ăă
go func p {
// do something with p
}("parameter")
ĺŽéăŽé˘ć°ăăŠăĄăźăżăźăăp
ăŽăżă¤ăăĺ°ăĺşăăžăăďź ăăăŻgo
ăšăăźăăĄăłăăŤăŻé常ăŤäžżĺŠă§ăăăăăĄăăăăŻăăźă¸ăŁăźă使ç¨ăăă ăă§ăťăźĺăĺšćăĺžăăă¨ăă§ăăžăă
p := "parameter"
go func() {
// do something with p
}()
ç§ăŻăăăĺŽĺ ¨ăŤăľăăźăăăžăă çç´ăŤč¨ăŁăŚăăäťăŽč¨čŞăŽăăăŤčŚăăăăăŠăăăŻć°ăŤăăăĺżĺé˘ć°ă使ç¨ăăăăăŽăăĺéˇă§ăŞăćšćłăĺż čŚă§ăă
硨éďźč¤ĺăŞăăŠăŤć§ćăĺç¨ăăŚăăžă...
type F func(int) float64
var f F
f = F { (i) (o) { o = float64(i); return } }
f = F { (i) o { o = float64(i); return } } // single return value
f = F { func (i) o { o = float64(i); return } } // +func for good measure?
ăă ăŽă˘ă¤ăă˘ďź
SwiftăŽć§ćă使ç¨ăă_untypedé˘ć°literal_ă使ç¨ăăOPăŽäžăŻćŹĄăŽăăăŤăŞăăžăă
compute({ $0 + $1 })
ăăăŤăŻăGo1ă¨ĺŽĺ ¨ăŞä¸ä˝äşćć§ăăăă¨ăăĺŠçšăăăă¨ćăăžăă
ç°ĄĺăŞtcpăăŁăăă˘ăăŞăć¸ăăŚăăăŽă§ăăăăčŚă¤ăăžăăă
ĺşćŹçăŤç§ăŻăăŽä¸ăŤăšăŠă¤ăšăăăć§é ăćăŁăŚăăžă
type connIndex struct {
conns []net.Conn
mu sync.Mutex
}
ĺćăŤăăă¤ăăŽćä˝ăéŠç¨ăăăďźćĽçśăŽčż˝ĺ ăăăšăŚăŽäşşă¸ăŽăĄăăťăźă¸ăŽé俥ăŞăŠďź
ăăĽăźăăăŻăšăŽăăăŻăłăźăăăłăăźăăŚč˛źăäťăăă¨ăăé常ăŽăăšăăăŠăŁăăăăăźă˘ăłăŽă´ăŤăźăăłă使ç¨ăăŚă˘ăŻăťăšă玥çăăăăă䝣ăăăŤăăŻăăźă¸ăŁăźă渥ăă ăă ă¨ćăăžăă
func (c *connIndex) run(f func([]net.Conn)) {
c.mu.Lock()
defer c.mu.Unlock()
f(c.conns)
}
çăćä˝ăŽĺ ´ĺăăăŽé庌ăŤĺéˇă§ăďź lock
ăăăłdefer unlock()
ăăăĺŞăăŚăăžăďź
conns.run(func(conns []net.Conn) { conns = append(conns, conn) })
run
ăĄă˝ăăă§ćŁç˘şăŞé˘ć°ăˇă°ăăăŁăĺ
ĽĺăăăăăăăăŻDRYăŽĺĺăŤéĺăăžăă
é˘ć°ăˇă°ăăăŁăŽć¨ć¸ŹăăľăăźăăăăŚăăĺ ´ĺăŻă揥ăŽăăăŤč¨čż°ă§ăăžă
conns.run(func(conns) { conns = append(conns, conn) })
ăăăŤăăŁăŚăłăźăăčŞăżăŤăăăŞăă¨ăŻćăăžăăă append
ăŽăăă§ăšăŠă¤ăšă§ăăăă¨ăăăăăžăăăžăăĺ¤ć°ăŤéŠĺăŞĺĺăäťăăŚăăăŽă§ăčŚăŞăăŚă[] net.Connă§ăăă¨ć¨ć¸Źă§ăăžăă run
ăĄă˝ăăăˇă°ăăăŁă§ă
é˘ć°ćŹä˝ăŤĺşăĽăăŚăăŠăĄăźăżăźăŽăżă¤ăăć¨ć¸Źăăăă¨ăăăŽăŻéżăă䝣ăăăŤăăăăćăăăŞĺ ´ĺďźé˘ć°ăŤăŻăăźă¸ăŁă渥ăăŞăŠďźăŤăŽăżć¨čŤăčż˝ĺ ăăžăă
čŞč
ăŤăŞăăˇă§ăłăćäžăăăŽă§ăăăăŻčŞăżăăăăćăŞăăă¨ăŻăŞăă¨ćăăžăăăăŠăĄăźăżăźăŽăżă¤ăăăăăăŞăĺ ´ĺăŻă godef
ăăăăăŤăźă˝ăŤăĺăăăŚă¨ăăŁăżăźăŤčĄ¨ç¤şăăăăă¨ăă§ăăžăă ă
ăăă襨示/ă¸ăŁăłăăăăăżăłăăăăă¨ăé¤ăăŚăćŹăŽä¸ă§ĺ˝źăăăăŁăŠăŻăżăźăŽç´šäťăçš°ăčżăăŞăćšćłăŽăăăŤä¸Śăšćżăăžăă
ç§ăŻć¸ăăŽăčŚćăŞăŽă§ăăăžăăăă°ăăăăčŞăă§çăćŽăŁăă§ăăă:)
é˘ć°ćŹä˝ăĺç´ăŞĺźă§ăăĺ ´ĺăŤä˝żç¨ăĺśéăăă¨ăăăăŻăă誏ĺžĺăăăă¨ćăăžăă
ç§ăŻăăăŚĺ寞ăăžăă ăăă§ăé˘ć°ăĺŽçžŠăă2ă¤ăŽćšćłăŤă¤ăŞăăăžăăç§ăĺ˛ç˘ăŤćăăăççąăŽă˛ă¨ă¤ăŻăăăĄăăĄă§ĺéˇć§ăăăăŞăăăăăăăăŞčĄ¨çžĺăăăăă¨ă§ăăăăŹăźăšăăă¨ă func
ăăźăŻăźăăžăăŻăăŠăĄăźăżăźăŽăăăăăé˘ć°ăŤăŞăăžăă
conns.run(func(conns []net.Conn) { conns = append(conns, conn) })
runăĄă˝ăăăŤćŁç˘şăŞé˘ć°ăˇă°ăăăŁăĺ ĽĺăăăăăăăăŻDRYăŽĺĺăŤéĺăăžăă
ééăăŞăăDRYăŻéčŚă§ăă ăăăăĺŻč˝ăŞéăćĺ°éăŽĺ´ĺă§ăłăźăăç解ăăč˝ĺăç ç˛ăŤăăŚĺĺăçśćăăăăăŤăăă°ăŠăăłă°ăŽăăšăŚăŽé¨ĺăŤăăăéŠç¨ăăăă¨ăŻăăăźăŻăimhoăĺ°ăăŞăźăăźăˇăĽăźăăăŚăăžăă
ăăă§ăŽä¸čŹçăŞĺéĄďźăăăłäťăŽăăă¤ăăŽććĄďźăŻăč°čŤă丝ăŤăłăźăăĺŽĺ
¨ăŤä˝ćĽăăćšćłăŤă¤ăăŚă§ăăăŽăŤĺŻžăăăłăźăăĺŽĺ
¨ăŤä˝ćĽăăćšćłăŤă¤ăăŚă§ăăă¨ćăăžăă ăăăć¸ăăć°ĺš´ĺžă ç§ăŻćčżpoc.pl
ăŤćĽăžăăăăăăăä˝ăăăăŽăăžă ç解ăăăă¨ăăŚăăžă...;ďź
conns.run(func(conns) { conns = append(conns, conn) })
ăăăŤăăŁăŚăłăźăăčŞăżăŤăăăŞăă¨ăŻćăăžăăăčż˝ĺ ăŽăăăŤăšăŠă¤ăšă§ăăăă¨ăăăăăžăăĺ¤ć°ăŤĺĺăäťăăăŽă§ăĺŽčĄăĄă˝ăăăŽăˇă°ăăăŁăčŚăŞăăŚă[] net.Connă§ăăă¨ć¨ć¸Źă§ăăžăă ă
ç§ăŽčŚč§Łă§ăŻăăăŽĺŁ°ćăŤăŻăăă¤ăăŽĺéĄăăăăžăă äťăŽäşşăăăăăŠăŽăăăŤčŚăŚăăăăŻăăăăžăăăăç§ăŻć¨ć¸ŹăăăŽăĺŤăă§ăă 1ă¤ăŻćŁăăăăăăăžăăăă1ă¤ăŻééăŁăŚăăăăăăăžăăăă確ăăŤăăăŤĺŞĺăăĺż
čŚăăăăžă-ăăżă¤ăă []net.Conn
ăŤäżĺăăăăăŤă ăžăăăłăźăăŽĺŻčŞć§ă¨ăăăăăăăŻăăăăŤĺşăĽăăŽă§ăŻăŞăăéŠĺăŞĺ¤ć°ĺăŤăăŁăŚăľăăźăăăăĺż
čŚăăăăžăă
çľčŤă¨ăăŚďźč°čŤăŽçŚçšăŻăăłăźăăć¸ăă¨ăăŽĺ°ăăŞĺ´ĺăć¸ăăćšćłăăăăăŽăłăźăăç解ăăăăăŽĺ´ĺăć¸ăăćšćłăŤç§ťăăšăă ă¨ćăăžăă
ćĺžăŤăDaveCheneyăRobertPikeďźiircďźăĺźç¨ăăŚçˇ ăăăăăžăă
ăŻăŞă˘ăŻčł˘ăăăăĺŞăăŚăăžăă
é˘ć°ăŽç˝˛ĺăĺ
Ľĺăăé˘ĺăŞä˝ćĽăŻăăŞăźăăłăłăăŞăźăăŤăăŁăŚăăăăčť˝ć¸ă§ăăžăă ăă¨ăă°ăgoplsăŻăé˘ć°ăŞăăŠăŤăä˝ćăăčŁĺŽăćäžăăžăă
ăăăŻăĺĺăăžă ă˝ăźăšăłăźăăŤăăăçĄĺé˘ć°ăĺŽçžŠăăćšćłă1ă¤ăăăŞăă署ĺĺ ¨ä˝ăĺ Ľĺăăĺż čŚăăŞăă¨ăăčŻăä¸éçšăćäžăăă¨ćăăžăă
ăăăŻčż˝ĺ ăăăžăăďź
...ăăŽćŠč˝ăć°ăŤĺ
ĽăăŞăĺ ´ĺă§ăăĺ¤ăć§ćă使ç¨ă§ăăžăă
...ăăăˇăłăăŤăŤăăăç§ăăĄăŤă¨ăŁăŚăăăŽć°ćŠč˝ăăăžăĺŠç¨ă§ăăžăăç§ăgoăć¸ăăŚăă1ĺš´ăçľăĄăžăăăăăłăăĽăăăŁăăăăéčŚă§ăăă¨ăžă čăăŚăăăăŠăăăŻăăăăžăăă
...ăăăŻčż˝ĺ ăăăžăăďź
@noypićąşĺŽăŻăăăŚăăžăăă ăăŽĺéĄăŻćŞč§ŁćąşăŽăžăžă§ăă
ç§ăŻăăŽććĄăćŻćăăăăŽćŠč˝ăă¸ă§ăăŞăăŻăšă¨çľăżĺăăăăă¨ă§ăGoăŽé˘ć°ĺăăă°ăŠăăłă°ăéçşč ăŤă¨ăŁăŚăă使ăăăăăŞăă¨ćăăžăă
ăăăç§ăčŚăăăăŽă§ăă大ăžăăŤďź
type F func(int, int) int
// function declaration
f := F (x, y) { return x * y}
// function passing
// g :: func(F)
g((x, y) { return x * y })
// returning function
func h() F {
return (x, y) { return x * y }
}
(a, b) => a * b
ă¨ĺ
ĽĺăăŚă揥ăŤé˛ăăă¨ăă§ăăăăăŤăăăă¨ćăăžăă
ç§ăŻç˘ĺ°ćŠč˝ăăžă Golangă§ĺŠç¨ă§ăăŞăă¨äżĄăăăă¨ăă§ăăžăăă
Javascriptă§ăŽä˝ćĽăăăăŤć確ă§ăˇăłăăŤăăŻéŠăăšăăă¨ă§ăă
JavaScriptăŻăĺŽéăŤä˝żç¨ăăăăžă§ăăŠăĄăźăżăźăăăŠăĄăźăżăźăŽć°ăĺ¤ăăžăăŻăżă¤ăăć°ăŤăăŞăăăăăăăç°ĄĺăŤĺŽčŁ ă§ăăžăă
é˘ć°ăŞăăŠăŤăŽĺăççĽă§ăăă¨ăGioăŹă¤ă˘ăŚăAPIă§ä˝żç¨ăăé˘ć°ăšăżă¤ăŤăŤĺ¤§ăăŤĺ˝šçŤăĄăžăă https://git.sr.ht/~eliasnaur/gio/tree/master/example/kitchen/kitchen.goďźăŤăăĺ¤ăăŽăfuncďźďź{...}ăăŞăăŠăŤăĺç §ăăŚăă ăăă 彟ăăŽĺŽéăŽç˝˛ĺăŻćŹĄăŽăăăŞăăŽă§ăŞăăă°ăŞăăžăăă§ăă
func(gtx layout.Context) layout.Dimensions
ăă ăăĺĺăéˇăăăă gtx
ăŻăĺé˘ć°ĺźăłĺşăăăăŽç俥ĺ¤ă¨çşäżĄĺ¤ăĺŤăĺ
ąćlayout.Context
ă¸ăŽăă¤ăłăżăźă§ăă
ć確ăă¨ćŁç˘şăăŽăăăŤăăăŽĺéĄăŤé˘äżăŞăăăăăăéˇă署ĺăŤĺăćżăăă¤ăăă§ăă ăăăŤăăăăăăăç§ăŽĺ ´ĺăŻăăăçăé˘ć°ăŞăăŠăŤăăľăăźăăăĺŞăăçľé¨ăŹăăźăă§ăăă¨ćăăžăă
PSç§ăéˇă署ĺăŤĺžĺăăŚăăççąăŽ1ă¤ăŻăăżă¤ăă¨ă¤ăŞă˘ăšăŤăăŁăŚç˝˛ĺăç縎ă§ăăăăă§ăă
type C = layout.Context
type D = layout.Dimensions
ăăăŤăăăăŞăăŠăŤăfunc(gtx C) D { ... }
ăŤç縎ăăăžăă
2çŞçŽăŽççąăŻăéˇă署ĺăăăŽĺéĄă解湺ăăăăŽă¨ä¸ä˝äşćć§ăăăăă¨ă§ăă
ç§ăŻă˘ă¤ăă˘ăćăŁăŚăăăŤćĽăžăăăă @ networkimprovăăă§ăŤăăăŤäźźăăăăŞăăŽăććĄăăŚăăăă¨ăăăăăžăăă
é˘ć°ăŞăăŠăŤăŽćĺŽĺă¨ăăŚé˘ć°ĺďźĺĺăŽăŞăé˘ć°ĺăžăăŻă¨ă¤ăŞă˘ăšăŽĺ ´ĺăăăăžăďźă使ç¨ăăă¨ăăă˘ă¤ăă˘ă弽ăă§ăăăăăŻăăăŠăĄăźăżăźă¨ćťăĺ¤ăŤé常ăŽĺć¨čŤăŤăźăŤă使ç¨ă§ăăăă¨ăćĺłăăžăăäşĺăŤćŁç˘şăŞăżă¤ăă ăăăŻăďźăă¨ăă°ďźăŞăźăăłăłăăŞăźăăé常ăŠăăćŠč˝ăăăăĄăłăăźăŞăăăăăŚăłĺć¨čŤčŚĺăĺ°ĺ Ľăăĺż čŚăăŞăăă¨ăćĺłăăžăă
ä¸ăăăăďź
type F func(a, b int) int
ç§ăŽćĺăŽčăăŻďź
F(a, b){return a + b}
ăăăăăăăŻé常ăŽé˘ć°ĺźăłĺşăăŤé常ăŤäźźăŚăăžă- a
ă¨b
ăăăă§ĺŽçžŠăăăŚăăăăăŤăŻčŚăăžăăă
äťăŽĺŻč˝ć§ăć¨ăŚăďźç§ăŻăăăăŽăŠăăçšăŤĺĽ˝ăă§ăŻăăăžăăďźďź
F->(a, b){return a + b}
F::(a, b){return a + b}
(a, b := F){ return a + b }
F{a, b}{return a + b}
F{a, b: return a + b}
F{a, b; return a + b}
ăăăăăăăŽăăăăŽăŠăăăŤăăă¤ăăŽç´ ć´ăăăć§ćăć˝ăă§ăăžă:)
č¤ĺăŞăăŠăŤć§ćăŽéčŚăŞăă¤ăłăăŻăăăźăľăźăŤĺć
ĺ ąăĺż
čŚă¨ăăŞăăă¨ă§ăă ć§é ä˝ăé
ĺăăšăŠă¤ăšăăăăłăăăăŽć§ćăŻĺăă§ăă ăăźăľăźăŻă T{...}
ăŽć§ćăăŞăźăçćăăăăăŤă T
ăŽăżă¤ăăçĽăĺż
čŚăŻăăăžăăă
ăă1ă¤ăŽăă¤ăłăăŻăć§ćăăăźăľăźă§ăŽăăăŻăăŠăăŻăĺż
čŚă¨ăăŞăăă¨ă§ăă {
ăč¤ĺăŞăăŠăŤăŽä¸é¨ă§ăăăăăăăŻăŽä¸é¨ă§ăăăăăăăžăăŞĺ ´ĺăăăŽăăăžăăăŻĺ¸¸ăŤĺžč
ăĺŞĺ
ăăŚč§Łćąşăăăžăă
func
ăăźăŻăźăăäżćăăăă¨ă§ăăźăľăźăŽăăăžăăăĺéżăăăăăŽĺˇăŽĺĺă§ććĄăăć§ćăăžă 弽ăă§ăă
func a, b { return a + b }
ďź-1ďźăĺé¤ăăžăăă ç§ăŻăžă ďź+ 1ďźă§ăŻăăăžăăăăčŞĺăŽçŤĺ ´ăĺčăăŚăăžăă ă¸ă§ăăŞăăŻăšăŻgenericSorter(slice, func(a, b T) bool { return a > b })
ăŽăăăŞçăé˘ć°ăŽĺ˘ĺ ăĺźă辡ăăăžăă ăžăă httpsďź //github.com/golang/go/issues/37739#issuecomment-624338848ăé
ĺçă§ăăăă¨ăăăăăžăăă
é˘ć°ăŞăăŠăŤăăăç°Ąć˝ăŤăăăăăŤč°čŤăăăŚăă2ă¤ăŽä¸ťčŚăŞćšćłăăăăžăă
严ćšăĺĽă ăŤćąăăšăă ă¨ćăăžăă
FunctionBody
ă揥ăŽăăăŤĺ¤ć´ăăăĺ ´ĺ
FunctionBody = Block | "->" ExpressionBody
ExpressionBody = Expression | "(" ExpressionList ")"
ăăăŻä¸ťăŤăĺăŽççĽăŽćçĄăŤăăăăăé˘ć°ăŞăăŠăŤăćŻć´ăăăăźă¸ä¸ă§é常ăŤĺç´ăŞé˘ć°ă¨ăĄă˝ăăăŽĺŽŁč¨ăčť˝ăăăăă¨ăă§ăăžăă
func (*T) Close() error -> nil
func (e *myErr) Unwrap() error -> e.err
func Alias(x int) -> anotherPackage.OriginalFunc(x)
func Id(type T)(x T) T -> x
func Swap(type T)(x, y T) -> (y, x)
ďźgodocă¨ĺéăŻăžă ä˝ăé ăăă¨ăă§ăăžăďź
ăăŽäžă§ăŻ@ianlancetaylorăŽć§ćă使ç¨ăăžăăăăăăŽä¸ťăŞćŹ çšăŻăć°ăăăăźăŻăłďźăăăłă func(c chan T) -> <-c
ă§ăŻĺĽĺŚăŤčŚăăăăźăŻăłďźăĺ°ĺ
Ľăăĺż
čŚăăăăă¨ă§ăăăăăăžăăăăŞăĺ ´ĺăŻăă=ăăŞăŠăŽć˘ĺăŽăăźăŻăłăĺĺŠç¨ăăžăă ăăŽć稿ăŽćŽăăŽé¨ĺă§ăŻă=ăă使ç¨ăăžăă
ăżă¤ăă¨ăŞă¸ăŞăłăŽĺ ´ĺă2ă¤ăŽăąăźăšăăăăžă
@griesemerăććĄăăăăăŞĺĺäťăăżă¤ăă使ç¨ăăă¨ă常ăŤćŠč˝ăăžăă ć§ćăŤĺéĄăăăăăă§ăă ç§ăŻăăăăăžăăăă¨ç˘şäżĄăăŚăăžăă ăă¨ăăăă ăŁăă¨ăăŚăăăăăĺéĄă解湺ăăăăŠăăăŻăăăăžăăă ĺĺäťăăżă¤ăăŽćĽĺ˘ăĺż čŚăŤăŞăăžăă ăăăăŻăăăăă使ç¨ăăăĺ ´ćăĺŽçžŠăăăăăąăźă¸ăŤĺŤăžăăăăăăăă使ç¨ăăăăšăŚăŽăăăąăźă¸ă§ĺŽçžŠăăăĺż čŚăăăăžăă
ĺč ă§ăŻă揥ăŽăăăŞăăŽăĺžăăăžă
slices.Map(s, slices.MapFunc(x) = math.Abs(x-y))
ĺžč ă§ăŻă揥ăŽăăăŞăăŽăĺžăăăžă
type mf func(float64) float64
slices.Map(s, mf(x) = math.Abs(x-y))
ăăăăŤăăăăăăăăŽĺĺăé ťçšăŤä˝żç¨ăăăŞăéăăăă¤ăŠăźăăŹăźăăăăžăĺć¸ăăŞăăťăŠăŽćˇˇäšąăăăăžăă
@neildăŽăăăŞć§ćăŻăĺăć¨ć¸Źă§ăăĺ ´ĺăŤăŽăżä˝żç¨ă§ăăžăă ç°ĄĺăŞćšćłăŻăďź12854ăŽăăăŤăăżă¤ăăăăăŁăŚăăăăšăŚăŽăłăłăăăšăďźé˘ć°ă¸ăŽăăŠăĄăźăżăźăăăŁăźăŤăă¸ăŽĺ˛ăĺ˝ăŚăăăŁăăŤă§ăŽé俥ăŞăŠďźăăŞăšăăăă ăă§ăă @neildăć辡ăăgo / deferăąăźăšăĺŤăăă¨äžżĺŠăŞăăă§ăă
ăăŽă˘ăăăźăă§ăŻăĺ ˇä˝çăŤćŹĄăŽăă¨ăŻă§ăăžăă
zero := func = 0
var f interface{} = func x, y = g(y, x)
ăăăăăăăăăŠăă§ăŠăŽăăăŤä˝żç¨ăăăŚăăăă調ăšăăă¨ăŤăăŁăŚă˘ăŤă´ăŞăşă çăŤăżă¤ăăć¨ć¸Źăăăă¨ăă§ăăă¨ăăŚăăăăăăŻăăć確ăŤăăăă¨ăćçă§ăăĺ ´ĺă§ăă
ăăăŻăćăćç¨ăŞ/čŚćąăăăăăŽăĺŤăĺ¤ăăŽćç¨ăŞăąăźăšăĺŻč˝ăŤăăžăďź
slices.Map(s, func x = math.Abs(x-y))
v := cond(useTls, FetchCertificate, func = nil)
ăŞăăŠăŤć§ćăŤé˘äżăŞăăăăăŻă使ç¨ăăăă¨ăé¸ćă§ăăăă¨ăŤăăă揥ăŽăă¨ăĺŻč˝ăŤăŞăăžăă
http.HandleFunc("/bar", func w, r {
// many lines ...
})
ăăăŻăç§ăďź+ 1ďźăŤĺăăŚăžăăžăćźăé˛ăăçšĺŽăŽăąăźăšă§ăă
ç§ăć辡ăăăăŽăčŚăăă¨ăăŞă1ă¤ăŽčłŞĺăŻă ...
ăăŠăĄăźăżăźăăŠăŽăăăŤĺŚçăăăă§ăă ăăŞăăŻăŠăĄăăăŤă¤ăăŚč°čŤăăăă¨ăă§ăăžă
f(func x, p = len(p))
f(func x, ...p = len(p))
ç§ăŤăŻăăŽçăăăăăžăăă
@jimmyfrasche
- é˘ć°ăŞăăŠăŤăŽĺăĺé¤ăăžăă
ăăăŻăé˘ć°ĺăŞăăŠăŤăčż˝ĺ ăăŚĺŚçăăĺż čŚăăăă¨ćăăžăă ăżă¤ăă 'func'ăŤç˝Žăćăăăĺźć°ăżă¤ăăçşčĄăăăĺ ´ĺďźăżă¤ăăŤăăŁăŚĺŽçžŠăăăăăďźă ăăăŤăăăčŞăżĺăĺŻč˝ć§ăçśćăăăäťăŽăżă¤ăăŽăŞăăŠăŤă¨ăăŞăä¸č´ăăžăă
http.Handle("/", http.HandlerFunc[w, r]{
fmt.Fprinf(w, "Hello World")
})
- ĺźăčżăăăăŁăŽç縎形
é˘ć°ăçŹčŞăŽăżă¤ăă¨ăăŚăŞăăĄăŻăżăŞăłă°ăăă¨ăçŠäşăăŻăăăŤăŻăŞăźăłăŤăŞăăžăă
type ComputeFunc func(float64, float64) float64
func compute(fn ComputeFunc) float64 {
return fn(3, 4)
}
compute(ComputeFunc[a,b]{return a + b})
ăăăĺéˇăăăĺ ´ĺăŻăăłăźăĺ ă§é˘ć°ĺăŽă¨ă¤ăŞă˘ăšăĺ Ľĺăăžăă
{
type f = ComputeFunc
compute(f[a,b]{return a + b})
}
ĺźć°ăŽăŞăé˘ć°ăŽçšćŽăŞăąăźăšă§ăŻăč§ăăŁăăŻççĽăăŚăă ăăă
type IntReturner func() int
fmt.Println(IntReturner{return 2}())
ĺĽç´ććĄă§ăŻăă§ăŤă¸ă§ăăŞăăŻé˘ć°ăŤčż˝ĺ ăŽć¨ćşăăŠăąăăă使ç¨ăăăŚăăăăăč§ćŹĺź§ăé¸ćăăžăă
@Splizardç§ăŻăăăăăŞăăŠăŤć§ćăăĺ¤ăăŽčż˝ĺ ăŽĺĺŽçžŠăŤćˇˇäšąăćźăăăă ăă ă¨ăăč°čŤăćŻćăăžăă ăăŽăăăŞĺĺŽçžŠăŻăăŞăăŠăŤăŤĺăć¸ăčžźăăăăçăăŞăĺăŤăĺ°ăŞăă¨ă2ĺ使ç¨ăăĺż čŚăăăăžăă
ăžăăăăšăŚăŽĺ ´ĺăŤă¸ă§ăăŞăăŻă¨ăăžăćŠč˝ăăăăŠăăăăăăăžăăă
ăăŞăĺĽĺŚăŞé˘ć°ăčăăŚăżăžăăă
func X(type T)(v T, func() T)
X
ă§ä˝żç¨ăăă¸ă§ăăŞăăŻĺăŤĺĺăäťăăăă¨ăă§ăăžăďź
type XFunc(type T) func() T
XFunc
ăŽĺŽçžŠăŽăżă使ç¨ăăŚăăŠăĄăźăżăźăŽăżă¤ăăĺ°ĺşăăĺ ´ĺă X
ăĺźăłĺşăă¨ăăŤă使ç¨ăăT
ăćĺŽăăĺż
čŚăăăăžăă v
ăŽăżă¤ăďź
X(v, XFunc(T)[] { /* ... */ })
ăăŽăăăŞăˇăăŞăŞă§ăŻă T
ăć¨ć¸Źă§ăăăăăŤăăçšćŽăŞăąăźăšăăăăžăăăăăŽĺ ´ĺăfuncăŞăăŠăŤăŽĺăŽççĽăŤĺż
čŚă¨ăŞăĺ¤ăăŽćŠć˘°ăĺż
čŚăŤăŞăăžăă
X
T
ăă¨ăŤć°ăăăżă¤ăăĺŽçžŠăăăă¨ăă§ăăžăăă T
ăă¨ăŤä˝ĺşŚăX
ăĺźăłĺşăăŞăéăăăăăťăŠçŻç´ăŤăŻăŞăăžăăă ă
ćăĺčăŤăŞăăłăĄăłă
ç§ăŻăăŽććĄăćŻćăăžăă ăżă¤ăăłă°ăçŻç´ăăčŞăżăăăăĺä¸ăăăžăăç§ăŽăŚăźăšăąăźăšă
čť˝éăŽçĄĺé˘ć°ć§ćăŞăďź
čť˝éăŽçĄĺé˘ć°ć§ćă使ç¨ďź