ăăăŻăčĺĽăăăĺ ąç¨ä˝ă¨ăăŚăçĽăăăĺč¨ăżă¤ăăŽććĄă§ăă GoăŽĺč¨ĺăŻă揥ăŽçšăé¤ăăŚăĺşćŹçăŤă¤ăłăżăźăă§ă¤ăšăŽăăăŤćŠč˝ăăĺż čŚăăăăžăă
ĺč¨ăżă¤ăăŻăswitchăšăăźăăĄăłăă¨ç §ĺă§ăăžăă ăłăłăă¤ăŠăŻăăăšăŚăŽăăŞă˘ăłăăä¸č´ăăăă¨ă確čŞăăžăă switchăšăăźăăĄăłăăŽĺ é¨ă§ăŻăĺ¤ăŻăä¸č´ăăăăŞă˘ăłăăŽăăŽă§ăăăăŽăăăŤä˝żç¨ă§ăăžăă
ăăăŻăăŞăźăăłă˝ăźăšăŽăŞăŞăźăšĺăăăéĺťăŤä˝ĺşŚăč°čŤăăăŚăăžăăă éĺťăŽăłăłăťăłăľăšăŻăĺč¨ĺăŻă¤ăłăżăźăă§ă¤ăšĺăŤăăžăčż˝ĺ ăăăŞăă¨ăăăăŽă§ăăă ăăšăŚăć´çăăă¨ăćçľçăŤĺžăăăăŽăŻăĺăšă¤ăăăŽăăšăŚăŽăąăźăšăŤĺ Ľĺăăăă¨ăăłăłăă¤ăŠăźăăă§ăăŻăăă¤ăłăżăźăă§ăźăšĺă§ăă ăăăŻăć°ăăč¨čŞăŽĺ¤ć´ăŤă¨ăŁăŚăŻăăŞăĺ°ăăŞăĄăŞăăă§ăă
ăăŽććĄăăăăŤć¨ăé˛ăăăĺ ´ĺăŻă揥ăŽăăăŞăăăĺŽĺ ¨ăŞććĄăăăĽăĄăłăăä˝ćăăĺż čŚăăăăžăăć§ćăŻä˝ă§ăăă ćŁç˘şăŤăŻăŠăŽăăăŤćŠč˝ăăžăăďź ďźăăŞăăŻăăăăăĺ¤ĺăă§ăăă¨č¨ăăžăăăă¤ăłăżăźăă§ăźăšĺăĺ¤ĺă§ăďźă ăăŹăźăăŞăăŻä˝ă§ăăďź
çĽăŁăŚăăăšăéĺťăŽč°čŤăŤă¤ăăŚăŻă httpsďź//www.reddit.com/r/golang/comments/46bd5h/ama_we_are_the_go_contributors_ask_us_anything/d03t6ji/ďźst = ixp2gf04ďźsh = 7d6920dbăĺç §ăăŚ
ăăăŻGo1ăŽĺăˇăšăă ăŽĺ¤ć´ă¨ăăŚăŻăăžăăŤăéčŚă§ăăă塎ă迍ăŁăĺż
čŚăŻăŞăă¨ćăăžăă
Go2ăŽăă大ăăŞćčă§ăăăĺć¤č¨ăăăă¨ăăĺ§ăăăžăă
ăăŽććĄăä˝ćăăŚăăă ăăăăă¨ăăăăăžăă ç§ăŻăăŽă˘ă¤ăă˘ă1ĺš´ăťăŠăăăŁăŚăăžăă
ĺ
ˇä˝çăŞććĄăŻäťĽä¸ăŽă¨ăăă§ăă ç§ăćăăŤ
ăé¸ćăżă¤ăăăŻĺŽéăŤăŻăĺč¨ăżă¤ăăăăăéŠĺăŞĺĺăăăăăžăăăăYMMVă§ăă
ĺč¨ăżă¤ăăŻăă|ăă¨çľăżĺăăă2ă¤äťĽä¸ăŽăżă¤ăă§čĄ¨ăăăžăă
ăŞăăŹăźăżăźă
type: type1 | type2 ...
çľćăŽăżă¤ăăŽĺ¤ăŻăćĺŽăăăăżă¤ăăŽ1ă¤ăŽăżăäżćă§ăăžăă NS
ăżă¤ăăŻă¤ăłăżăźăă§ă¤ăšăżă¤ăă¨ăăŚćąăăăžă-ăăŽĺçăżă¤ăăŻ
ăăăŤĺ˛ăĺ˝ăŚăăăŚăăĺ¤ă
çšĺĽăŞĺ ´ĺă¨ăăŚăănilăă使ç¨ăăŚăĺ¤ăĺŻč˝ăăŠăăă示ăăă¨ăă§ăăžă
ăźăăŤăŞăăžăă
äžăă°ďź
type maybeInt nil | int
ĺč¨ăżă¤ăăŽăĄă˝ăăăťăăăŻăăĄă˝ăăăťăăăŽĺ
ąéé¨ĺăäżćăăžă
ĺăăĄă˝ăăăé¤ăăăăšăŚăŽăłăłăăźăăłăăżă¤ăăŽ
ĺĺăç°ăŞă署ĺă
äťăŽă¤ăłăżăźăă§ă¤ăšăżă¤ăă¨ĺć§ăŤăĺč¨ăżă¤ăăŻĺçăŞĺŻžčąĄă¨ăŞăĺŻč˝ć§ăăăăžă
ĺĺ¤ćă ăżă¤ăăšă¤ăăă§ăŻăăšă¤ăăăŽćĺăŽă˘ăźă ăŻ
äżĺăăăŚăăăżă¤ăăŤä¸č´ăăăăŽăé¸ćăăăžăă
ĺč¨ăżă¤ăăŽăźăĺ¤ăŻăăŽćĺăŽăżă¤ăăŽăźăĺ¤ă§ăă
ĺč¨ă
ĺč¨ăżă¤ăăŤĺ¤ăĺ˛ăĺ˝ăŚăă¨ăăĺ¤ăăăĺ¤ăăŤĺăžăăăŠăă
ĺŻč˝ăŞăżă¤ăăŽ1ă¤ăăăăćĺăŽăżă¤ăăé¸ćăăăžăă
äžăă°ďź
var x int|float64 = 13
ĺçĺintăŽĺ¤ăŤăŞăăžăăă
var x int|float64 = 3.13
ĺçăżă¤ăfloat64ăŽĺ¤ăŤăŞăăžăă
ăă¤ăźăăŞĺŽčŁ
ă§ăŻăĺč¨ĺăă¤ăłăżăźăă§ă¤ăšă¨ăžăŁăăĺăăăăŤĺŽčŁ
ă§ăăžă
ĺ¤ă ăăć´çˇ´ăăăă˘ăăăźăă§ăŻă襨çžă使ç¨ă§ăăžă
ĺŻč˝ăŞĺ¤ăŽăťăăăŤéŠăăŚăăžăă
ăă¨ăă°ăăă¤ăłăżăŽăŞăĺ
ˇčąĄĺăŽăżă§ć§ćăăăĺč¨ĺ
čż˝ĺ ăŽĺ¤ă使ç¨ăăŚăéăă¤ăłăżĺă§ĺŽčŁ
ă§ăăžăă
ĺŽéăŽăżă¤ăăčŚăăŚăăăŚăă ăăă
ć§é ä˝ăżă¤ăăŽĺč¨ăŽĺ ´ĺăäşĺăŽăăăŁăłă°ă使ç¨ăăăă¨ăĺŻč˝ăăăăăžăă
ăăŽçŽçăŽăăăŽć§é ä˝ăŤĺ
ąéăŽăă¤ăă
@rogpeppeăăăŻăżă¤ăă˘ăľăźăˇă§ăłă¨ăżă¤ăăšă¤ăăă¨ăŠăŽăăăŤç¸äşä˝ç¨ăăžăăďź ăăăăăĺč¨ăŽăĄăłăăźă§ăŻăŞăĺďźăžăăŻĺă¸ăŽă˘ăľăźăˇă§ăłďźăŤcase
ăăăă¨ăăłăłăă¤ăŤćă¨ăŠăźăŤăŞăăžăă ăăŽăăăŞăżă¤ăă§é眲çž
çăŞăšă¤ăăă使ç¨ăăăă¨ăă¨ăŠăźăŤăŞăăžăăďź
ăżă¤ăăšă¤ăăăŽĺ ´ĺă
type T int | interface{}
ăăăŚăăŞăăŻăăďź
switch t := t.(type) {
case int:
// ...
tăŤăŻintăĺŤăinterface {}ăĺŤăžăăŚăăžăăăćĺăŽăąăźăšă¨ä¸č´ăăžăăďź ćĺăŽăąăźăšăcase interface{}
ĺ ´ĺăŻăŠăăŞăăžăăďź
ăžăăŻăĺč¨ăżă¤ăăŤĺ ˇčąĄăżă¤ăăŽăżăĺŤăăăă¨ăŻă§ăăžăăďź
type T interface{} | nil
ăŠăă§ăăďź ăăŞăăć¸ăăŞă
var t T = nil
tăŽăżă¤ăăŻä˝ă§ăăďź ăăă¨ăăăŽĺťşč¨ăŻçŚć˘ăăăŚăăžăăďź type T []int | nil
ăŤă¤ăăŚăĺć§ăŽčłŞĺăçşçăăăăăă¤ăłăżăźăă§ă¤ăšă ăă§ăŻăăăžăăă
ăŻăăăłăłăă¤ăŤćă¨ăŠăźăçşçăăăŽăŻĺççă ă¨ćăăžă
ä¸č´ăăăă¨ăă§ăăŞăăąăźăšăćăŁăŚăăăă¨ă ăăăăăă§ăăăăŠăăăăăăŞă
ăăŽăăăŞăżă¤ăă§é眲çž
çăŞăšă¤ăăă訹ĺŻăăăă¨ăăĺ§ăăăžă-ç§ăăĄăŻ
äťăŽĺ ´ćă§çś˛çž
ć§ăĺż
čŚă¨ăăŞăă§ăă ăăă ăăăăăŞă1ă¤ăŽăă¨
ăă ăăčŻăăă¨ă§ăăăšă¤ăăăĺŽĺ
¨ăŞĺ ´ĺăăăăŠăŤăăčŚćąăăăă¨ăŻă§ăăžăăă
ăăăçľäşăšăăźăăĄăłăăŤăăăăăŤă
ă¤ăžăă揥ăŽĺ ´ĺăŤăłăłăă¤ăŠă§ă¨ăŠăźăçşçăăĺŻč˝ć§ăăăăžăă
func addOne(x int|float64) int|float64 {
switch x := x.(type) {
case int:
return x + 1
case float64:
return x + 1
}
}
ĺč¨ăżă¤ăăĺ¤ć´ăăŚăăąăźăšăčż˝ĺ ăăžăă
ăżă¤ăăšă¤ăăăŽĺ ´ĺă
ăżă¤ăTint | ă¤ăłăżăźăă§ăźăš{}
ăăăŚăăŞăăŻăăďź
ăšă¤ăătďź= tăďźăżă¤ăďź{
ăąăźăšintďź
//..ă
tăŤăŻintăĺŤăinterface {}ăĺŤăžăăŚăăžăăăćĺăŽăąăźăšă¨ä¸č´ăăžăăďź ćĺăŽăąăźăšăăąăźăšă¤ăłăżăźăă§ă¤ăš{}ăŽĺ ´ĺăŻăŠăăŞăăžăăďź
tăŤăŻăintăĺŤăă¤ăłăżăźăă§ă¤ăš{}ăĺŤăăăă¨ăŻă§ăăžăăă tăŻă¤ăłăżăźăă§ăźăšă§ă
äťăŽă¤ăłăżăźăă§ă¤ăšăżă¤ăă¨ĺăăăăŤăżă¤ăăăžăăă
ĺćăăăăżă¤ăăŽăťăăăĺŤăžăăŚăăžăă
ă¤ăłăżăźăă§ă¤ăš{}ăintăĺŤăă¤ăłăżăźăă§ă¤ăš{}ăĺŤăăă¨ăă§ăăŞăăŽă¨ĺăăăăŤă
ĺč¨ĺăŻă¤ăłăżăźăă§ă¤ăšĺă¨ä¸č´ăăĺŻč˝ć§ăăăăžăăăăăă§ăĺ
ˇä˝çăŞăăŽăŤăŞăăžă
ĺçĺ¤ăŽăżă¤ăă ăă¨ăă°ă揥ăŽăăăŤăăă¨ĺéĄăăăžăăă
type R io.Reader | io.ReadCloser
ăżă¤ăTă¤ăłăżăźăă§ăźăšăŻăŠăă§ăă{} | ăŞăďź ăăŞăăć¸ăăŞă
var t T = nil
tăŽăżă¤ăăŻä˝ă§ăăďź ăăă¨ăăăŽĺťşč¨ăŻçŚć˘ăăăŚăăžăăďź ăżă¤ăT [] int |ăŤă¤ăăŚăĺć§ăŽčłŞĺăçşçăăžăă nilăŞăŽă§ăă¤ăłăżăźăă§ă¤ăšă ăă§ăŻăăăžăăă
ä¸č¨ăŽććĄăŤăăă¨ăăăŞăăŻćĺăŽă˘ă¤ăă ăćăŤĺ
Ľăăžă
ĺ¤ăĺ˛ăĺ˝ăŚăăă¨ăă§ăăĺč¨ă§ă
ăăŞăăŻnilă¤ăłăżăźăă§ăźăšăćăŤĺ
Ľăăă§ăăăă
ĺŽéăă¤ăłăżăźăă§ăźăš{} | nilăŻćčĄçăŤĺéˇă§ăăăăăŻăäťťćăŽă¤ăłăżăźăă§ă¤ăš{}
ăźăăŤăăăă¨ăă§ăăžăă
[] intăŽĺ ´ĺ| nilănil [] intăŻnilă¤ăłăżăźăă§ă¤ăšă¨ĺăă§ăŻăŞăăăă
ĺ
ˇä˝çăŞĺ¤ăŻ([]int|nil)(nil)
ăŞă[]int(nil)
ă§ăŻăŞăĺăŞănil
ă
[]int | nil
ĺ ´ĺăŻčĺłćˇąăă§ăă ĺ厣č¨ăŽnil
ăŻă常ăŤănilă¤ăłăżăźăă§ă¤ăšĺ¤ăăćĺłăăă¨ćăăžăăăăŽĺ ´ĺ
type T []int | nil
var x T = nil
x
ănilă¤ăłăżăźăă§ăźăšă§ăăănil []int
ă§ăŻăŞăăă¨ăćĺłăăžăă
ăăŽĺ¤ăŻăĺăăżă¤ăă§ă¨ăłăłăźăăăănil []int
ă¨ăŻç°ăŞăăžăă
var y T = []int(nil) // y != x
ĺč¨ăăăšăŚăŽĺ¤ĺă§ăăŁăŚăă常ăŤnilăŻĺż
čŚă§ăŻăŞăă§ăăăăă ăăă§ăŞăăă°ă var x int64 | float64
ăŻăŠăăŞăă§ăăăăďź äťăŽăŤăźăŤăăĺ¤ćżăăç§ăŽćĺăŽčăăŻăćĺăŽăżă¤ăăŽăźăĺ¤ă§ăăă var x interface{} | int
ăŠăă§ăăăăďź @bcmillsăććăăŚăăăăăŤăăăăŻć確ăŞĺč¨nilă§ăŞăăă°ăŞăăžăăă
垎ĺŚăăăăăă§ăă
眲çž
çăŞăżă¤ăăŽăšă¤ăăăăăă§ăăăă ćăžăăĺä˝ă§ăŞăĺ ´ĺăŻăăă¤ă§ă犺ăŽdefault:
čż˝ĺ ă§ăăžăă
ććĄăŤăŻăăĺč¨ăżă¤ăăŤĺ¤ăĺ˛ăĺ˝ăŚăă¨ăăŤăĺ¤ăăăĺ¤ăăŤĺăžăĺ ´ĺ
ĺŻč˝ăŞăżă¤ăăŽ1ă¤ăăăăćĺăŽăżă¤ăăé¸ćăăăžăăă
ă ăăăă¨ďź
type T []int | nil
var x T = nil
nilăŻ[] intăŤĺ˛ăĺ˝ăŚĺŻč˝ă§ăăă[] intăŻĺăŽćĺăŽčŚç´ ă§ăăăăăxăŻĺ ˇčąĄĺ[] intăŤăŞăăžăă äťăŽ[] intďźnilďźĺ¤ă¨ĺăăŤăŞăăžăă
ĺč¨ăăăšăŚăŽĺ¤ĺă§ăăŁăŚăă常ăŤnilăŻĺż čŚă§ăŻăŞăă§ăăăăă ăăă§ăŞăăă°ăvar x int64 | float64 beďź
ććĄăŤăŻăăĺč¨ăżă¤ăăŽăźăĺ¤ăŻăăŽćĺăŽăżă¤ăăŽăźăĺ¤ă§ăă
ĺč¨ăăăŞăŽă§ăçăăŻint64ďź0ďźă§ăă
äťăŽăŤăźăŤăăĺ¤ćżăăç§ăŽćĺăŽčăăŻăćĺăŽăżă¤ăăŽăźăĺ¤ă§ăăă揥ăŤvar x interface {} | intďź @bcmillsăććăăŚăăăăăŤăăăăŻć確ăŞĺč¨nilă§ăŞăăă°ăŞăăžăăă
ăăăăăăŽĺ ´ĺăŻé常ăŽă¤ăłăżăźăă§ă¤ăšăŽnilĺ¤ăŤăŞăăžăă ăăŽăżă¤ăďźinterface {} | nilďźăŻĺéˇă§ăă ăăăăăăăčŚç´ ăĺĽăŽčŚç´ ăŽăšăźăăźăťăăă§ăăĺč¨ĺăćĺŽăăăłăłăă¤ăŠăŤăăăă¨ăăĺ§ăăăžăăçžĺ¨ăăăŽăăăŞĺăĺŽçžŠăăćĺłăăăăăžăăă
ĺč¨ăżă¤ăăŽăźăĺ¤ăŻăĺč¨ăŽćĺăŽăżă¤ăăŽăźăĺ¤ă§ăă
ăăăŻčĺłćˇąăććĄă§ăăăsumăżă¤ăăŻçžĺ¨äżćăăŚăăĺ¤ăŽăżă¤ăăăŠăăăŤč¨é˛ăăĺż
čŚăăăăăăsumăżă¤ăăŽăźăĺ¤ăall-bytes-zeroă§ăŻăŞăăă¨ăćĺłăăă¨ćăăžăă GoăŽäťăŽăăšăŚăŽăżă¤ăă ăžăăŻăăżă¤ăć
ĺ ąăĺĺ¨ăăŞăĺ ´ĺăĺ¤ăŻăŞăšăăăăŚăăćĺăŽăżă¤ăăŽăźăĺ¤ă§ăăă¨ăăäžĺ¤ăčż˝ĺ ăăăă¨ăă§ăăžăăăăăă§ăŞăĺ ´ĺăŻnil
ă襨ăćšćłăăăăăžăăăŞăšăăăăŚăăćĺăŽăżă¤ăă
ăăăăŁăŚă (stuff) | nil
ăŻăďźăăŽďźăŽä˝ănilăŤă§ăăŞăĺ ´ĺăŤăŽăżćĺłăăăă nil | (stuff)
ăŻăăăŽăŽä˝ăănilăŤă§ăăăăŠăăăŤăăŁăŚç°ăŞăćĺłăćăĄăžăăďź nilăŻăŠăŽăăăŞäžĄĺ¤ăčż˝ĺ ăăžăăďź
@ianlancetaylorĺ¤ăăŽé˘ć°ĺč¨čŞăŻăĺşćŹçăŤCăŽĺ ´ĺă¨ĺăăăăŤďźéăăďźĺč¨ĺăĺŽčŁ ăăŚăăă¨ćăăžă
struct {
int which;
union {
A a;
B b;
C c;
} summands;
}
which
ăăŚăăŞăłăŽăăŁăźăŤăăŤé çŞăŤă¤ăłăăăŻăšăäťăăĺ ´ĺďź0 = aă1 = bă2 = cďźăăźăĺ¤ăŽĺŽçžŠăŻăăšăŚăŽăă¤ăăăźăăŤăŞăăăăŤćŠč˝ăăžăă ăžăăă¤ăłăżăźăă§ă¤ăšă¨ăŻç°ăŞăăăżă¤ăăĺĽăŽĺ ´ćăŤäżĺăăĺż
čŚăăăăžăă ăžăăăżă¤ăć
ĺ ąăäżĺăăĺ ´ćă§ăŻăăă税ăŽnilăżă°ăçšĺĽăŤĺŚçăăĺż
čŚăăăăžăă
ăăăŤăăăçšĺĽăŞă¤ăłăżăźăă§ă¤ăšă§ăŻăŞăăăŚăăŞăłăŽĺ¤ĺăä˝ćăăăžăăăăăčĺłćˇąăăă¨ă§ăă
ăżă¤ăăč¨é˛ăăăăŁăźăŤăăŤćĺăŽăżă¤ăă襨ăăźăĺ¤ăăăĺ ´ĺăăăšăŚăźăăŽĺ¤ăćŠč˝ăăăćšćłăŻăăăžăăďź ăăă襨çžăăăăăŽ1ă¤ăŽĺŻč˝ăŞćšćłăŻćŹĄăŽăăăŤăŞăă¨ćăăžăă
type A = B|C
struct A {
choice byte // value 0 or 1
value ?// (thing big enough to store B | C)
}
[硨é]
çłă訳ăăăžăăăă @ jimmyfrascheăŻç§ă掴ăăžăăă
nilăŤăăŁăŚčż˝ĺ ăăăăăŽă§ĺŽčĄă§ăăŞăăŁăăăŽăŻăăăžăă
type S int | string | struct{}
var None struct{}
ďź
ăăăŻďźĺ°ăŞăă¨ăç§ăćăŁăŚăăďźĺ¤ăăŽćˇˇäšąăĺéżăăăăă§ă
ăžăăŻăă䝼ä¸
type (
None struct{}
S int | string | None
)
ăăŞăăŻä¸ăŽăšă¤ăăăĺ
Ľĺăăăă¨ăă§ăăăăŽăăNone
ă¨ăăŚĺ˛ăĺ˝ăŚăNone{}
@jimmyfrasche struct{}
ăŻnil
ă¨çăăăăăžăăă ç´°ăăé¨ĺă§ăăăĺč¨ăŽăżă¤ăăšă¤ăăăäťăŽăżă¤ăăŽăżă¤ăăšă¤ăăă¨ä¸ĺż
čŚăŤďźďźďźĺĺ˛ăăăă¨ăŤăŞăăžăă
@bcmillsäťăŽăă¨ă丝埾ăăă¤ăăăŻăăăžăăă§ăăăă¤ăžăăĺč¨ăŽăŠăŽăżă¤ăă§ănilăŽćĺłă¨éč¤ăăăă¨ăŞăăĺ¤ăŽćŹ ĺŚăĺşĺĽăăăŽă¨ĺăçŽçă§ä˝żç¨ă§ăăă¨ăăăă¨ă§ăă
@rogpeppeăăăŻä˝ăĺ°ĺˇăăžăăďź
// r is an io.Reader interface value holding a type that also implements io.Closer
var v io.ReadCloser | io.Reader = r
switch v.(type) {
case io.ReadCloser: fmt.Println("ReadCloser")
case io.Reader: fmt.Println("Reader")
}
ç§ăŻăčŞč ăă ă¨ćăăžă
@jimmyfrascheäťăŽă¤ăłăżăźăă§ă¤ăšăŽăżă¤ăăšă¤ăăăăĺĺžăăăŽă¨ĺăăăăŤă ReadCloser
ăćłĺŽăăžăă
ďźăžăăă¤ăłăżăźăă§ă¤ăšăżă¤ăăŽăżăĺŤăĺč¨ă§ăŻăé常ăŽă¤ăłăżăźăă§ă¤ăšăăăĺ¤ăăŽăšăăźăšă使ç¨ăăŞăă¨äşćłăăăžăăăć示çăŞăżă°ă使ç¨ăăă¨ăăżă¤ăăšă¤ăăăŽăŤăăŻă˘ăăăŞăźăăźăăăăĺ°ăçŻç´ă§ăăă¨ćăăžăăďź
@bcmillsčĺłćˇąăăŽăŻĺ˛ăĺ˝ăŚă§ăăć¤č¨ăăŚăă ăăďź //play.golang.org/p/PzmWCYex6R
@ianlancetaylorăăăŻăć辡ăăăŽăŤćéŠăŞăă¤ăłăă§ăăăăăă¨ăă ç§ăŽăç´ ć´ăŞĺŽčŁ ăăŽććĄčŞä˝ăç´ ć´ăăăăă¨ăćĺłăăžăăăĺéżăăăŽăŻéŁăăă¨ăŻćăăžăăă ĺč¨ĺăŻăă¤ăłăżăźăă§ă¤ăšĺă¨ăăŚćąăăăžăăăĺŽéăŤăŻĺă¨ăăŽăĄă˝ăăăťăăă¸ăŽç´ćĽăă¤ăłăżăĺŤăĺż čŚăŻăăăžăăă䝣ăăăŤăĺż čŚăŤĺżăăŚăĺăć示ăăć´ć°ăżă°ăĺŤăăăă¨ăă§ăăžăă ăżă¤ăčŞä˝ănilăŽĺ ´ĺă§ăăăăŽăżă°ăŻăźă䝼ĺ¤ăŤăŞăĺŻč˝ć§ăăăăžăă
ä¸ăăăăďź
var x int | nil = nil
xăŽĺŽčĄćăŽĺ¤ăŻăăšăŚăźăă§ăăĺż
čŚăŻăăăžăăă xăŽăżă¤ăăăŞăłăŤăăă¨ăăăžăăŻĺ¤ćăăă¨ă
ĺĽăŽă¤ăłăżăźăă§ă¤ăšăżă¤ăăŤĺ¤ćăăă¨ăăżă°ăŻćŹĄăŽăăăŞĺ°ăăŞăăźăăŤăäťăăŚéćĽĺăăăĺŻč˝ć§ăăăăžăă
ĺŽéăŽĺăă¤ăłăżă
ĺĽăŽĺŻč˝ć§ăŻăăăăćĺăŽčŚç´ ă§ăăĺ ´ĺăŤăŽăżnilăżă¤ăă訹ĺŻăăăă¨ă§ăăă
ăăăŻćŹĄăŽăăăŞć§é ăćé¤ăăžăďź
var t nil | int
var u float64 | t
@jimmyfrascheäťăŽă¤ăłăżăźăă§ă¤ăšăŽăżă¤ăăšă¤ăăăăĺĺžăăăŽă¨ĺăăăăŤă
ăŻăă
@bcmillsčĺłćˇąăăŽăŻĺ˛ăĺ˝ăŚă§ăăć¤č¨ăăŚăă ăăďź //play.golang.org/p/PzmWCYex6R
ăăăăžăăă ăăżă¤ăăšă¤ăăăReadCloserăĺşĺăăăŤăŻăăăŽ[...]ăćĺšă§ăăĺż
čŚăăăăăŽăŻăŞăă§ăăă
äťăŽă¤ăłăżăźăă§ăźăšăżă¤ăă¨ĺć§ăŤăĺč¨ăżă¤ăăŻăăŽä¸ăŤăăăăŽăŽĺ
ˇä˝çăŞĺ¤ăăć źç´ăăžăăă
ĺč¨ăŤč¤ć°ăŽă¤ăłăżăźăă§ă¤ăšăżă¤ăăăăĺ ´ĺăăŠăłăżă¤ă 襨çžăŻĺăŞăă¤ăłăżăźăă§ă¤ăšĺ¤ă§ăăĺşăŤăŞăĺ¤ă厣č¨ăăăĺŻč˝ć§ăŽ1ă¤äťĽä¸ăĺŽčŁ ăăĺż čŚăăăăă¨ăăăăŁăŚăăă ăă§ăă
ă¤ăžăăI1ă¨I2ăŽä¸Ąćšăă¤ăłăżăźăă§ă¤ăšăżă¤ăă§ăăăżă¤ăďźI1 | I2ďźăŤä˝ăăĺ˛ăĺ˝ăŚăă¨ăĺ Ľĺăăĺ¤ăăăŽćçšă§I1ăžăăŻI2ăĺŽčŁ ăăăă¨ăăăăŁăŚăăăăŠăăăĺžă§ĺ¤ćăăăă¨ăŻă§ăăžăăă
io.ReadCloseră§ăăăżă¤ăăăăĺ ´ĺ| io.Reader io.Readeră§switchăžăăŻassertăĺ Ľĺăăă¨ăăŤăsumăżă¤ăă¸ăŽĺ˛ăĺ˝ăŚăŤăăŁăŚă¤ăłăżăźăă§ă¤ăšăŽăăăŻăšă解é¤ăăăĺăăăŻăšĺăăăŞăéăăio.ReadCloseră§ăŻăŞăăă¨ă確čŞă§ăăžăăă
io.Readeră使ç¨ăăŚăăĺ ´ĺăŻăéăŤăŞăăžăă io.ReadCloserăŻăĺłĺŻăŤĺłăă塌ăŤç§ťĺăăăăăio.ReadCloserăĺăĺ Ľăăăă¨ăŻăăăžăăăăžăăŻăĺŽčŁ ăŻăĺč¨ĺ ăŽăăšăŚăŽă¤ăłăżăźăă§ă¤ăšăăăćéŠăŞăă¤ăłăżăźăă§ă¤ăšăć¤ç´˘ăăĺż čŚăăăăžăăăăăăéŠĺăŤĺŽçžŠăăăă¨ăŻă§ăăžăăă
@rogpeppeććĄă§ăŻăĺŽčŁ ăŤăăăćéŠĺăŽĺŻč˝ć§ă¨ăźăĺ¤ăŽĺžŽĺŚăăçĄčŚăăŚăćĺă§ä˝ćăăăă¤ăłăżăźăă§ă¤ăšăżă¤ăďźé˘éŁăăăĄă˝ăăăŽĺ ąéé¨ĺăĺŤăďźăăăĺč¨ăżă¤ăă使ç¨ăă丝ăŞĺŠçšăŻăăżă¤ăăă§ăăŤăźăă¨ăŠăźăććă§ăăăă¨ă§ăăĺŽčĄćă§ăŻăŞăăłăłăă¤ăŤćăŤă 2çŞçŽăŽĺŠçšăŻăĺăŽĺ¤ăăăčĺĽăăăăăă°ăŠă ăŽĺŻčŞć§/ç解ăŤĺ˝šçŤă¤ĺŻč˝ć§ăăăăă¨ă§ăă äťăŤĺ¤§ăăŞăĄăŞăăăŻăăăžăăďź
ďźç§ăŻćąşăăŚććĄăć¸ăăăă¨ăŻăăŚăăžăăăç´ćăćŁăăăăăă¨ăăŚăăă ăă§ăăçšăŤăć§ćă¨ćĺłăŽč¤éăăăéŠĺşŚăŤĺ°ăăăĺ ´ĺăŻăăăăä˝ăćĺłăăăăŤăăăăăăăłăłăă¤ăŠă使ç¨ăăăă¨ăŽĺŠçšăć確ăŤç解ă§ăăžăăă¨ăŠăźăćŠćăŤăăŁăăăăžăăďź
@griesemerăŻăăăăŽéăă§ăă
çšăŤăăŁăăŤăăăăăŻăźăŻăäťăăŚăĄăăťăźă¸ăäźéăăĺ ´ĺăĺŠç¨ĺŻč˝ăŞĺŻč˝ć§ăćŁç˘şăŤčĄ¨çžăăăżă¤ăăćă¤ăă¨ăă§ăăă¨ăčŞăżăăăă¨ćŁç˘şăă彚çŤă¤ă¨ćăăžăă çžĺ¨ăă¤ăłăżăźăă§ă¤ăšăżă¤ăăŤă¨ăŻăšăăźăăăăŚăăŞăăĄă˝ăăăĺŤăăăă¨ă§ăăăčĄăăŽăŻä¸éĺ獯ăŞčŠŚăżă§ăăăăăăŻaďźĺăčžźăżăŤăăŁăŚĺéżĺŻč˝ă§ăăăbďźă¨ăŻăšăăźăăăăŚăăŞăăĄă˝ăăăé襨示ăŤăŞăŁăŚăăăăăčăăăăăăšăŚăŽăżă¤ăă確čŞăăăŽăŻĺ°éŁă§ăă
@jimmyfrasche
io.ReadCloseră§ăăăżă¤ăăăăĺ ´ĺ| io.Reader io.Readeră§switchăžăăŻassertăĺ Ľĺăăă¨ăăŤăsumăżă¤ăă¸ăŽĺ˛ăĺ˝ăŚăŤăăŁăŚă¤ăłăżăźăă§ă¤ăšăŽăăăŻăšă解é¤ăăăĺăăăŻăšĺăăăŞăéăăio.ReadCloseră§ăŻăŞăăă¨ă確čŞă§ăăžăăă
ăăŽăżă¤ăă使ç¨ăăŚăăĺ ´ĺăŻă常ăŤio.ReaderďźăžăăŻăäťťćăŽio.ReaderănilăŤăŞăĺŻč˝ć§ăăăăănilďźă§ăăăă¨ăăăăăžăă 2ă¤ăŽé¸ćč˘ăŻćäťçă§ăŻăăăžăăăććĄăăăŚăăĺč¨ĺăŻăăćäťçčŤçĺăă§ăŻăŞăăĺ ćŹçčŤçĺăă§ăă
io.Readeră使ç¨ăăŚăăĺ ´ĺăŻăéăŤăŞăăžăă io.ReadCloserăŻăĺłĺŻăŤĺłăă塌ăŤç§ťĺăăăăăio.ReadCloserăĺăĺ Ľăăăă¨ăŻăăăžăăăăžăăŻăĺŽčŁ ăŻăĺč¨ĺ ăŽăăšăŚăŽă¤ăłăżăźăă§ă¤ăšăăăćéŠăŞăă¤ăłăżăźăă§ă¤ăšăć¤ç´˘ăăĺż čŚăăăăžăăăăăăéŠĺăŤĺŽçžŠăăăă¨ăŻă§ăăžăăă
ăĺ寞ćšĺăŤé˛ăăă¨ăŻăăăŽăżă¤ăăŤĺ˛ăĺ˝ăŚăăă¨ăćĺłăăĺ ´ĺăććĄăŻćŹĄăŽăăăŤčż°ăšăŚăăžăă
ăĺč¨ăżă¤ăăŤĺ¤ăĺ˛ăĺ˝ăŚăă¨ăăĺ¤ăăăĺ¤ăăŤĺăžăăăŠăă
ĺŻč˝ăŞăżă¤ăăŽ1ă¤ăăăăćĺăŽăżă¤ăăé¸ćăăăžăăă
ăăŽĺ ´ĺăio.ReadCloserăŻio.Readeră¨io.ReadCloserăŽä¸ĄćšăŤĺăžăăăăio.Readerăé¸ćăăžăăăĺŽéăŤăŻĺžă§ĺ¤ćăăćšćłăŻăăăžăăă ăżă¤ăio.Readeră¨ăżă¤ăio.ReaderăŽéăŤć¤ĺşĺŻč˝ăŞéăăŻăăăžăăă io.ReaderăŻăio.ReaderăĺŽčŁ ăăăăšăŚăŽă¤ăłăżăźăă§ă¤ăšăżă¤ăăäżćă§ăăăăăio.ReadCloseră ăăŽăăăăłăłăă¤ăŠăŤăăŽăăăŞĺăćĺŚăăăăŽăŻčŻăčăăăăăăŞăă¨ç§ăŻćăăžăă ăă¨ăă°ăinterface {}ăŤăŻăă§ăŤäťťćăŽĺăĺŤăžăăŚăăĺŻč˝ć§ăăăăăăinterface {}ăŤé˘éŁăăăăšăŚăŽĺč¨ĺăćĺŚăăĺŻč˝ć§ăăăăžăăăăŽăăăčż˝ĺ ăŽćĄäťśăŤăăŁăŚć ĺ ąăčż˝ĺ ăăăăă¨ăŻăăăžăăă
@rogpeppeăăŞăăŽććĄăŤă¤ăăŚç§ă弽ăăŞăă¨ăăăăăăăăžăă 塌ăăĺłă¸ăŽĺ˛ăĺ˝ăŚăťăăłăăŁăŻăšă¨ăźăĺ¤ăŻă塌獯ăŽĺăŤăźăŤăŽăźăĺ¤ă§ăăăé常ăŤć確ă§ĺç´ă§ăă é常ăŤčĄăăžăă
ç§ăĺżé ăăŚăăăŽăŻăă¤ăłăżăźăă§ă¤ăšă§ăă§ăŤăăăŻăšĺăăăŚăăĺ¤ăăĺč¨ĺăŽĺ¤ć°ăŤĺ˛ăĺ˝ăŚăăă¨ă§ăă
ă¨ăăăăăĺăŽäžă使ç¨ăăŚăRCăŻio.ReadCloserăŤĺ˛ăĺ˝ăŚăăă¨ăă§ăăć§é ä˝ă§ăăă¨ăăžăăăă
ăăŞăăăăăăăăŞă
var v io.ReadCloser | io.Reader = RC{}
çľćăŻćç˝ă§ć確ă§ăă
ăă ăăăăăčĄăă¨
var r io.Reader = RC{}
var v io.ReadCloser | io.Reader = r
ĺŻä¸ăŽčł˘ćăŞăă¨ăŻăvăšăă˘răio.Readeră¨ăăŚä˝żç¨ăăăă¨ă§ăăăăšă¤ăăăăŞăłăŤăăă¨ăio.Readerăąăźăšăćźăăă¨ăăŤăĺŽéăŤăŻĺĺ¨ăăŞăăă¨ă確čŞă§ăăžăăă io.ReadCloseră ăăŞăăŻăăŽăăăŞăăŽăćăŁăŚăăĺż čŚăăăă§ăăăďź
switch v := v.(type) {
case io.ReadCloser: useReadCloser(v)
case io.Reader:
if rc, ok := v.(io.ReadCloser); ok {
useReadCloser(rc)
} else {
useReader(v)
}
}
ăăŚăio.ReadCloser <ďźio.Readeră¨ăăćčŚăăăăăăŞăăććĄăăăăăŤăăăăă訹ĺŻăăŞăăă¨ăă§ăăžăăăĺéĄăŻăăć šćŹçă§ăăăGoâ ăŽäťťćăŽĺč¨ăżă¤ăăŽććĄăŤĺ˝ăŚăŻăžăă¨ćăăžăă
ăăăăăĄă˝ăăAďźďźăBďźďźăăăăłCďźďźăćă¤3ă¤ăŽă¤ăłăżăźăă§ă¤ăšAăBăăăăłCă¨ă3ă¤ăŽăĄă˝ăăăăšăŚăćă¤ć§é ä˝ABCăăăă¨ăăžăă AăBăăăăłCăŻäşăăŤç´ ă§ăăăăăA | B | Că¨ăăŽé ĺăŻăăšăŚćĺšăŞăżă¤ăă§ăă ăăăăăăŞăăŻăžă 揥ăŽăăăŞăąăźăšăăăăžă
var c C = ABC{}
var v A | B | C = c
ăăăĺé 罎ăăćšćłăŻăăăăăăăžăăăă¤ăłăżăźăă§ă¤ăšăé˘äżăăŚăăă¨ăăŤvăä˝ă§ăăăăŤă¤ăăŚćĺłăŽăăäżč¨źăŻăžă ĺžăăăžăăă ĺč¨ă玹ăăĺşăăĺžăé ĺşăéčŚăŞĺ ´ĺăŻă¤ăłăżăźăă§ăźăšăŽçŽąăéăăĺż čŚăăăăžăă
ăăśăăĺśéăŻăăŠăŽč˘Ťĺ ć°ăă¤ăłăżăźăă§ăźăšăŤăŞăăă¨ăă§ăăŞăă¨ăăăă¨ă§ăăĺż čŚăăăăžăăďź
ç§ăčăăăă¨ăă§ăăäťăŽĺŻä¸ăŽč§ŁćąşçăŻăsumĺĺ¤ć°ă¸ăŽă¤ăłăżăźăă§ăźăšăŽĺ˛ăĺ˝ăŚăçŚć˘ăăăă¨ă§ăăăăăčŞä˝ăăăĺłăăăăăŤćăăăžăă
â ăăăŻćć§ăă解ćśăăăăăŤĺč¨ăŽĺăŽĺć§çŻĺăĺż čŚă¨ăăžăăďźĺ¤ĺĺăŽĺ¤ăć§çŻăăăăăŤJust vă¨č¨ăăŞăăă°ăŞăăŞăHaskellăŽăăăŤďźâăăăç§ăŻăăăăžăŁăăćŻćăăŚăăžăăă
@jimmyfrasche注ćăăăééăŽăŚăźăšăąăźăšăŻĺŽéăŤéčŚă§ăăďź ăăăŻç§ăŤăŻćăăă§ăŻăăăžăăăăăăăéčŚăŞĺ ´ĺăŽăăăŤăŻăć示çăŞăăăŻăšć§é ä˝ăĺéżăăăŽăŻç°Ąĺă§ăďź
type ReadCloser struct { io.ReadCloser }
type Reader struct { io.Reader }
var v ReadCloser | Reader = Reader{r}
@bcmillsçľćăćç˝ă§
ćäžăăć示çăŞăăăŻăšć§é ä˝ăŽäžăŻăĺč¨ăżă¤ăă§ă¤ăłăżăźăă§ăźăšăçŚć˘ăăŚăăĺč¨ăżă¤ăăŽč˝ĺăăžăŁăăĺśéăăăŞăăă¨ă示ăăŚăăžăă č注ă§čż°ăšăăăăŤăćć§ć§č§ŁćśăŽăăăŽĺć§çŻĺăĺšćçăŤä˝ćăăŚăăžăă 確ăăŤăăăăŻĺ°ăé˘ĺă§ä˝ĺăŞăšăăăă§ăăăăăăŻĺç´ă§ăăăč¨čŞć§é ăĺŻč˝ăŞéăç´äş¤ăăăă¨ăăGoăŽĺ˛ĺŚă¨é常ăŤä¸č´ăăŚăăăăăŤćăăžăă
ĺč¨ăżă¤ăă§ĺż čŚăŞăăšăŚăŽäżč¨ź
ăăăŻăăŞăăćĺž
ăăäżč¨źăŤäžĺăăžăă ĺč¨ăżă¤ăăŻćŹĄăŽăăăŤăŞăăă¨ăćĺž
ăăŚăăă¨ćăăžă
ĺłĺŻăŤăżă°äťăăăăĺ¤ăŞăŽă§ăäťťćăŽăżă¤ăA | B | Căä¸ăăăăă¨ăéçăŞăăŽăćŁç˘şăŤăăăăžă
ĺ˛ăĺ˝ăŚăăżă¤ăă ç§ăŻăăăăłăłăŻăŞăźăăŽĺä¸ăŽĺ¤ăŤĺŻžăăĺĺśéă¨ăăŚčŚăŚăăžă
type-ĺśéăŻăĺ¤ăďźĺ°ăŞăă¨ăďźAăBăăăăłCăŽăăăăă¨ĺäşćă§ăăă¨ăăăă¨ă§ăă
çľĺąăăăăŻăŽĺ¤ăćă¤ĺăŞăă¤ăłăżăźăă§ăźăšă§ăă
ă¤ăžăăĺ˛ăĺ˝ăŚă¨äşćć§ăăăăăăŤĺ¤ăĺč¨ĺăŤĺ˛ăĺ˝ăŚăăă¨ăă§ăăĺ ´ĺ
ĺč¨ăżă¤ăăŽăĄăłăăźăŽ1ă¤ă§ăŻăăăăăŽăĄăłăăźăŽăŠăăăăăăăŻč¨é˛ăăăžăăă
ăé¸ćć¸ăżă-ĺ¤čŞä˝ăč¨é˛ăăă ăă§ăă io.Readerăĺ˛ăĺ˝ăŚăĺ ´ĺă¨ĺă
ă¤ăłăżăźăă§ă¤ăš{}ăŤĺŻžăăŚăŻăéçio.Readerăżă¤ăă夹ăăăĺ¤čŞä˝ăĺŤăžăăă ăă§ăă
ăăăŻio.Readeră¨äşćć§ăăăăžăăăăăăçşçăăäťăŽă¤ăłăżăźăă§ă¤ăšăżă¤ăă¨ăäşćć§ăăăăžă
ĺŽčŁ
ăăă
ăăŞăăŽäžă§ăŻďź
var c C = ABC{}
var v A | B | C = c
AăBăăăăłCăŽăăăăăŤĺŻžăăvăŽĺă˘ăľăźăˇă§ăłăŻćĺăăžăă ăăăŻç§ăŤăŻçăŤăăŞăŁăŚăăăăă§ăă
@rogpeppeăăăăŽăťăăłăăŁăŻăšăŻăç§ăćłĺăăŚăăăăăçăŤăăŞăŁăŚăăžăă ă¤ăłăżăźăă§ăźăšă¨ĺč¨ăăăžă桡ăăĺăŁăŚăăă¨ăŻăžă ĺŽĺ ¨ăŤăŻç˘şäżĄăăŚăăžăăăăăăă§ăŞăăăŠăăăŻăăăăăăžăăă é˛ćďź
type U I | *T
ăăăă¨ăăžăăăăă§ă I
ăŻă¤ăłăżăźăă§ă¤ăšăżă¤ăă§ă *T
ăŻI
ăĺŽčŁ
ăăăżă¤ăă§ăă
ä¸ăăăă
var i I = new(T)
var u U = i
u
ăŽĺçăżă¤ăăŻ*T
ă§ăăă
var u U = new(T)
ăżă¤ăă˘ăľăźăˇă§ăłă使ç¨ăăŚăăăŽ*T
I
ă¨ăăŚă˘ăŻăťăšă§ăăžăă ăăăŻćŁăăă§ăăďź
ă¤ăžăăćĺšăŞă¤ăłăżăźăă§ă¤ăšĺ¤ăăĺč¨ă¸ăŽĺ˛ăĺ˝ăŚă§ăŻăĺč¨ă§ćĺăŤä¸č´ăăăżă¤ăăć¤ç´˘ăăĺż čŚăăăăžăă
ăžăăăŽăăăŞăăŽă¨ăŻĺ¤ĺ°ç°ăŞăă ăăvar v uint8 | int32 | int64 = i
ă ăă§ă常ăŤăăăăŽ3ă¤ăŽăżă¤ăăŽăăăăă§čĄăăç§ăŻćłĺăăăă¨ăŤăŞăi
ăăŁăŚăă§ăăi
ăăint64
uint8
ĺăžă
é˛ćďź
ăăźăďź
ăżă¤ăă˘ăľăźăˇă§ăłăćă¤Iă¨ăăŚăăŽ* TăŤă˘ăŻăťăšă§ăăžăă ăăăŻćŁăăă§ăăďź
ăŻăă
ă¤ăžăăćĺšăŞă¤ăłăżăźăă§ă¤ăšĺ¤ăăĺč¨ă¸ăŽĺ˛ăĺ˝ăŚă§ăŻăĺč¨ă§ćĺăŤä¸č´ăăăżă¤ăăć¤ç´˘ăăĺż čŚăăăăžăă
ăăăććĄăč¨ăăăăŤďźăăĄăăăăłăłăă¤ăŠăŻăŠăĄăăé¸ćăăăăéçăŤçĽăŁăŚăăăŽă§ăĺŽčĄćăŤć¤ç´˘ăăĺż čŚăŻăăăžăăďźă
ăžăăvar v uint8 |ăŽăăăŞăăŽă¨ăŻĺ¤ĺ°ç°ăŞăăžăă int32 | int64 = iăŻăç§ăuint8ăŤĺăžăint64ă§ăăŁăă¨ăăŚăăăăă3ă¤ăŽăżă¤ăăŽăăăăă¨ĺ¸¸ăŤä¸č´ăăă¨ćăăžăă
ăŻăăiăĺŽć°ă§ăŞăéăăăăăăŽé¸ćč˘ăŽ1ă¤ăŤăŽăżĺ˛ăĺ˝ăŚăăă¨ăă§ăăăăă§ăă
ăŻăăiăĺŽć°ă§ăŞăéăăăăăăŽé¸ćč˘ăŽ1ă¤ăŤăŽăżĺ˛ăĺ˝ăŚăăă¨ăă§ăăăăă§ăă
ĺĺăŽăŞăĺăĺĺăŽäťăăĺăŤĺ˛ăĺ˝ăŚăăă¨ă訹ĺŻăăčŚĺăăăăăăăăăŻĺŽĺ ¨ăŤăŻçĺŽă§ăŻăăăžăăă ăăăăăăăăăžăéăăçăă¨ăŻćăăžăăă ăŤăźăŤăŻĺăăžăžă§ăă
ăăăăŁăŚăĺĺăŽć稿ăŽI | *T
ăżă¤ăăŻăăżă¤ăI
ă¨ĺŽčłŞçăŤĺăă§ăăă io.ReadCloser | io.Reader
ăŻăĺŽčłŞçăŤio.Reader
ă¨ĺăăżă¤ăă§ăăďź
ăăăŻćŁăăă ăŠăĄăăŽĺăăăłăłăă¤ăŠăĺč¨ĺăćĺŚăăă¨ăăç§ăŽććĄăăăăŤăźăŤă§ăŤăăźăăăžăăăăŽĺ ´ĺă1ă¤ăŽĺăŻăĺĽăŽĺăŤăăŁăŚĺŽčŁ
ăăăă¤ăłăżăźăă§ă¤ăšă§ăă ĺăăžăăŻéĄäźźăŽăŤăźăŤă§ă int|int
ăăăŞéč¤ăżă¤ăăŽĺč¨ăżă¤ăăăŤăăźă§ăăžăă
1ă¤ăŽčăďź int|byte
ăbyte|int
ă¨ĺăă§ăŻăŞăăă¨ăŻăăăăç´ćçă§ăŻăăăžăăăăĺŽéăŤăŻăăăăĺéĄăăăžăăă
ă¤ăžăăćĺšăŞă¤ăłăżăźăă§ă¤ăšĺ¤ăăĺč¨ă¸ăŽĺ˛ăĺ˝ăŚă§ăŻăĺč¨ă§ćĺăŤä¸č´ăăăżă¤ăăć¤ç´˘ăăĺż čŚăăăăžăă
ăăăććĄăč¨ăăăăŤďźăăĄăăăăłăłăă¤ăŠăŻăŠăĄăăé¸ćăăăăéçăŤçĽăŁăŚăăăŽă§ăĺŽčĄćăŤć¤ç´˘ăăĺż čŚăŻăăăžăăďźă
ç§ăŻăăăăăŠăăźăăŚăăžăăă ç§ăăăăčŞăćšćłďźćĺłăăăăŽă¨ăŻç°ăŞăĺŻč˝ć§ăăăăžăďźăŤăŻăIă¨TĺŽčŁ ăŽăŚăăŞăłUăŤĺŻžĺŚăăćšćłăĺ°ăŞăă¨ă2ă¤ăăăžă-Iă
1aďź U u = t
ĺ˛ăĺ˝ăŚćăŤăăżă°ăŻTăŤč¨ĺŽăăăžăăăżă°ăTă§ăăăăăĺžă§é¸ćăăă¨TăŤăŞăăžăă
1bďź U u = i
ďźiăŻĺŽéăŤăŻTďźăŽĺ˛ăĺ˝ăŚćăŤăăżă°ăŻIăŤč¨ĺŽăăăžăăăżă°ăIă§ăăăăăĺžă§é¸ćăăă¨TăŤăŞăăžăăă2çŞçŽăŽăă§ăăŻďźTăŻIă¨TăĺŽčŁ
ăăăăĺŽčĄăăăžăďź UăŽăĄăłăăźă§ăďźTăçşčŚăăžăă
2aďź1aăŽăăăŤ
2bďź U u = i
ďźiăŻĺŽéăŤăŻTďźăŽĺ˛ăĺ˝ăŚćăŤăçćăăăăłăźăăŻĺ¤ďźiďźăăă§ăăŻăăŚăĺŽéăŤTă§ăăăăŠăăă確čŞăăžăăăăăŻăTăIăĺŽčŁ
ăăTăUăŽăĄăłăăźă§ăăăăă§ăăă¤ăžăăăżă°ăŻTăŤč¨ĺŽăăăžăăĺžă§é¸ćăăă¨ăç´ćĽTăŤăŞăăžăă
TăVăWăăăšăŚIă¨U = *T | *V | *W | I
ĺŽčŁ
ăăŚăăĺ ´ĺăĺ˛ăĺ˝ăŚU u = i
ăŻďźć大ďź3ă¤ăŽăżă¤ăăŽăăšăăĺż
čŚă§ăă
ăăăăă¤ăłăżăźăă§ăźăšă¨ăă¤ăłăżăźăŻăĺ ąç¨ä˝ĺăŽĺ ă ăŽăŚăźăšăąăźăšă§ăŻăăăžăăă§ăăăďź
ăç´ ćľăŞăĺŽčŁ ăăăăăăłăŽăłă°ăĺŽčĄăăçšĺŽăŽç¨ŽéĄăŽăăăŤăźăćłĺă§ăăžăăăă¨ăă°ăăăšăŚăŽć示寞蹥ă4ăă¤ăăŤć´ĺăăăŚăă4ă¤äťĽä¸ăŽăă¤ăłăżăźĺăŽĺéĺăăăĺ ´ĺăŻăăżă°ăä¸ăŽ2ăŤć źç´ăăžăăĺ¤ăŽăăăă ăăăŻăçľĺăŽăĄăłăăźăŽă˘ăăŹăšăĺĺžăăăŽăŻčŻăăŞăăă¨ăćĺłăăžăďźăăŽă˘ăăŹăšăŻăăżă°ă調ć´ăăăŤăĺ¤ăăăżă¤ăă垊ĺ ăăăăăŤä˝żç¨ă§ăăăăăă¨ăŤăăčŻăăăăžăăďźă
ăžăăŻă50ăăăăŽă˘ăăŹăšçŠşéăăăăNaNăčŞçąăŤä˝żç¨ă§ăăĺ ´ĺăŻăć´ć°ăăă¤ăłăżăźăăăăłĺ粞庌澎ĺĺ°ć°çšć°ăăăšăŚ64ăăăăŽĺéĺăŤăšăŠăăăăăă¨ăă§ăăžăă
ăŠăĄăăŽăľăććĄă大ăžăăŞăăŽă§ăăăăŠăĄăăçąççăŞćŻćč ăŽć°ăĺ°ăŞăďźďźďźă¨ç˘şäżĄăăŚăăžăă
ăăăŻăçľĺĺĄăŽä˝ćăĺăăŽăŻčŻăăŞăăă¨ăćĺłăăžă
ćŁăăă ăăăăăżă¤ăă˘ăľăźăˇă§ăłăŽçľćăŻăă¨ăŤăăäťćĽăŻĺŻžĺŚĺŻč˝ă§ăŻăŞăă¨ćăăžăăďź
U u = iďźiăŻĺŽéăŤăŻTďźăŽĺ˛ăĺ˝ăŚćăŤăăżă°ăŻIăŤč¨ĺŽăăăžăă
ăăăć ¸ĺżă ă¨ćăăžă-ăżă°IăŻăăăžăăă
ăŠăłăżă¤ă 襨çžăăă°ăăçĄčŚăăĺč¨ĺăă¤ăłăżăźăă§ăźăšă¨čŚăŞăăžăă äťăŽă¤ăłăżăźăă§ăźăšă¨ĺć§ăŤăĺçĺďźăăăŤć źç´ăăăŚăăĺďźăăăăžăă ăăŞăăĺç §ăăăăżă°ăăŻăžăăŤăăŽĺçăżă¤ăă§ăă
ăăŞăăććĄăăăăăŤďźăăăŚç§ăŻććĄăŽćĺžăŽćŽľč˝ă§ć示ăăăă¨ăăžăăďźăĺŽčĄćĺă¸ăŽăă¤ăłăżă使ç¨ăăăăăĺšççăŞćšćłă§ĺăżă°ăć źç´ăăćšćłăăăăăăăăžăăăăćçľçăŤăŻĺ¸¸ăŤĺçăă¨ăłăłăźăăăă ăă§ăĺč¨ăżă¤ăĺ¤ăŽăżă¤ăăä˝ććăŤăŠăŽé¸ćč˘ăăé¸ćăăăăăă§ăŻăăăžăăă
ăăăăă¤ăłăżăźăă§ăźăšă¨ăă¤ăłăżăźăŻăĺ ąç¨ä˝ĺăŽĺ ă ăŽăŚăźăšăąăźăšă§ăŻăăăžăăă§ăăăďź
ăăă§ăŻăăăžăăă§ăăăăç§ăŽčŚč§Łă§ăŻăććĄăŻäťăŽč¨čŞćŠč˝ăŤé˘ăăŚĺŻč˝ăŞéăç´äş¤ăăĺż čŚăăăăžăă
@ dr2chaseăăăžă§ăŽç§ăŽç解ă§ăŻăsumĺăŽĺŽçžŠăŤă¤ăłăżăźăă§ă¤ăšĺăĺŤăžăăŚăăĺ ´ĺăĺŽčĄćăŽĺŽčŁ ăŻă¤ăłăżăźăă§ă¤ăšďźăĄă˝ăăăťăăăŽĺ ąéé¨ĺăĺŤăďźă¨ĺăă§ăăă訹厚ăăăĺăŤé˘ăăăłăłăă¤ăŤćăŽä¸ĺ¤ćĄäťśăŻĺ¤ăăăžăăă埡ĺśă
ĺč¨ĺăŤĺ ˇčąĄĺăŽăżăĺŤăžăăCăšăżă¤ăŤăŽčĺĽăăăĺ ąç¨ä˝ăŽăăăŤĺŽčŁ ăăăĺ ´ĺă§ăăĺč¨ĺăŽĺ¤ăŻăĺĺžĺžăŤĺĽăŽĺďźăăăłăľă¤ăşďźăŤăŞăĺŻč˝ć§ăăăăăăă˘ăăŹăšćĺŽă§ăăžăăăä˝ćăťă˘ăăŹăšă ăă ăăĺ Ľĺăăăĺč¨ĺ¤čŞä˝ăŽă˘ăăŹăšăĺĺžăăăă¨ăă§ăăžăă
ĺč¨ĺăăăŽăăăŤĺä˝ăăăă¨ăćăžăăă§ăăďź é¸ć/ă˘ăľăźăăăăăżă¤ăăŻăĺ¤ăăŚăăŞăłăŤĺ˛ăĺ˝ăŚăăăă¨ăăŤăăă°ăŠăăźăč¨ăŁă/ć示ăăăăŽă¨ĺăă§ăăă¨ç°ĄĺăŤĺŽŁč¨ă§ăăžăă ăăăăŞăă¨ăint8寞int16寞int32ăŞăŠăŤé˘ăăŚčĺłćˇąăĺ ´ćăŤĺ°ăăăĺŻč˝ć§ăăăăžăăăžăăŻăăă¨ăă°ă int8 | uint8
ă
ĺč¨ĺăăăŽăăăŤĺä˝ăăăă¨ăćăžăăă§ăăďź
ăăăŻĺ¤ćăŽĺéĄă§ăă ç§ăăĄăŻăă§ăŤč¨čŞăŽă¤ăłăżăźăă§ăźăšăŽćŚĺżľăćăŁăŚăăăŽă§ăăăă ă¨ćăăžă-éçĺă¨ĺçĺăŽä¸ĄćšăŽĺ¤ă ććĄăăăŚăăĺč¨ĺăŻăĺ ´ĺăŤăăŁăŚăŻă¤ăłăżăźăă§ă¤ăšĺăćĺŽăăăăăŽăăćŁç˘şăŞćšćłăćäžăăă ăă§ăă ăžăăĺč¨ĺăŻäťăŽĺăŤĺśéăăăăă¨ăŞăćŠč˝ă§ăăăă¨ăćĺłăăžăă ăăăăŞăă¨ăă¤ăłăżăźăă§ăźăšăżă¤ăăé¤ĺ¤ăăĺż čŚăăăăăăŽĺ ´ĺăćŠč˝ăŻĺŽĺ ¨ăŤç´äş¤ăăžăăă
ăăăăŞăă¨ăint8寞int16寞int32ăŞăŠăŤé˘ăăŚčĺłćˇąăĺ ´ćăŤĺ°ăăăĺŻč˝ć§ăăăăžăăăžăăŻăăă¨ăă°ăint8 | uint8ă
ăăă§ăăŞăăŽć¸ĺżľăŻä˝ă§ăăďź
é˘ć°ăżă¤ăăăăăăŽăăźăżă¤ăă¨ăăŚä˝żç¨ăăăă¨ăŻă§ăăžăăă ăăăĺçă ă¨č¨ăŁăŚăăăŽă§ăŻăŞăăäťăŽç¨ŽéĄăŽĺăĺśéăăĺăŽĺäžăăăă¨ăăă ăă§ăă ă¤ăłăżăźăă§ăźăšă訹ĺŻăăăă¨ăŻăžă ĺŻč˝ă§ăăăăžă 貊売ăăăŚăăžăăă
äťăŽćšćłă§ăŻä˝ćă§ăăŞăă¤ăłăżăźăă§ă¤ăšăĺŤăĺč¨ĺă使ç¨ăăŚăăŠăŽăăăŞç¨ŽéĄăŽăăă°ăŠă ăä˝ćă§ăăžăăďź
寞ćĄă
ĺ ąç¨ä˝ĺăŻă0ĺ䝼ä¸ăŽĺăăŞăšăăăĺă§ăă
union {
T0
T1
//...
Tn
}
ăŚăăŞăłăŤăŞăšăăăăŚăăăăšăŚăŽăżă¤ăďźT0ăT1ă...ăTnďźăŻç°ăŞăŁăŚăăĺż čŚăăăăă¤ăłăżăźăă§ă¤ăšăżă¤ăăŤăăăă¨ăŻă§ăăžăăă
ăĄă˝ăăăŻăé常ăŽăŤăźăŤăŤăăŁăŚăĺŽçžŠăăăďźĺĺăŽäťăăďźĺ ąç¨ä˝ăżă¤ăă§ĺŽŁč¨ă§ăăžăă ăŞăšăăăăăżă¤ăăăăăă˘ăźăăăăăĄă˝ăăăŻăăăžăăă
ĺ
ąç¨ä˝ĺăŽĺăčžźăżăŻăăăžăăă ăăĺ
ąç¨ä˝ĺăĺĽăŽĺ
ąç¨ä˝ĺăŤăŞăšăăăăă¨ăŻăäťăŽćĺšăŞĺăăŞăšăăăăă¨ă¨ĺăă§ăă ăă ăă type S struct { S }
ăçĄĺšă§ăăăŽă¨ĺăççąă§ăăŚăăŞăłăŻčŞčşŤăŽĺăĺ帰çăŤăŞăšăăăăă¨ăŻă§ăăžăăă
ăŚăăŞăłăŻć§é ä˝ăŤĺăčžźăăă¨ăă§ăăžăă
ĺ ąç¨ä˝ĺăŽĺ¤ăŻĺçĺă§ăăăăŞăšăăăăĺăŽ1ă¤ăŤéĺŽăăăĺçĺăŽĺ¤ďźć źç´ăăăĺ¤ă¨ĺźă°ăăžăďźă§ăă ăŞăšăăăăŚăăăżă¤ăăŽ1ă¤ăŻă常ăŤĺçăżă¤ăă§ăă
犺ăŽĺ ąç¨ä˝ăŽăźăĺ¤ăŻä¸ćă§ăă 犺ă§ăŞăăŚăăŞăłăŽăźăĺ¤ăŻăăŚăăŞăłăŤăŞăšăăăăŚăăćĺăŽăżă¤ăăŽăźăĺ¤ă§ăă
ĺ
ąç¨ä˝ĺăŽĺ¤U
U{}
ăŻăăźăĺ¤ă¨ăăŚU
ăŤ1ă¤äťĽä¸ăŽĺăăăă v
ăăŞăšăăăăĺăŽ1ă¤ăŽĺ¤ă§ăăĺ ´ĺă T
ă U{v}
ăŻv
ć źç´ăăĺéĺĺ¤ăä˝ćăăžăT
ă v
ăU
ăŞăšăăăăŚăăŞăăżă¤ăă§ăăăăŞăšăăăăŚăăč¤ć°ăŽăżă¤ăăŤĺ˛ăĺ˝ăŚăăă¨ăă§ăăĺ ´ĺăŻăćć§ăă解ćśăăăăăŤć示çăŞĺ¤ćăĺż
čŚă§ăă
ĺ
ąç¨ä˝ĺU
ăŽĺ¤ăŻă U
ăŽĺăŽăťăăăăľăăťăăă§ăăĺ ´ĺă V(U{})
ăăăŤĺĽăŽĺ
ąç¨ä˝ĺV
ĺ¤ćă§ăăžăă V
ăŽĺăŽăťăăă ă¤ăžăăé ĺşăçĄčŚăăă¨ă U
ăŻV
ă¨ĺăăżă¤ăă§ăăĺż
čŚăăăă U
ăŻV
ăŞăV
ăżă¤ăăćă¤ăă¨ăŻă§ăăžăăă U
ăŞăăżă¤ăăćă¤ăă¨ăă§ăăžăă
ĺ ąç¨ä˝ăżă¤ăéăŽĺ˛ăĺ˝ăŚĺŻč˝ć§ăŻăĺ¤ăăŚă1ă¤ăŽĺ ąç¨ä˝ăżă¤ăăĺŽçžŠďźĺĺäťăďźăăăŚăăéăăĺ ćć§ă¨ăăŚĺŽçžŠăăăžăă
ĺ
ąç¨ä˝ĺU
ăŽăŞăšăăăăĺăŽ1ă¤T
ăŽĺ¤ăăĺ
ąç¨ä˝ĺU
ĺ¤ć°ăŤĺ˛ăĺ˝ăŚăăă¨ăă§ăăžăă ăăăŤăăăĺçăżă¤ăăT
ăŤč¨ĺŽăăăĺ¤ăć źç´ăăăžăă ĺ˛ăĺ˝ăŚäşćć§ăŽăăĺ¤ăŻä¸č¨ăŽăăăŤćŠč˝ăăžăă
ăŞăšăăăăŚăăăăšăŚăŽăżă¤ăăçĺźćźçŽĺăăľăăźăăăŚăăĺ ´ĺďź
==
ăŻfalseă§ăăă !=
ăŻtrueă§ăă ĺ˛ăĺ˝ăŚäşćć§ăŽăăĺ¤ăŻä¸č¨ăŽăăăŤćŠč˝ăăžăăĺ ąç¨ä˝ĺăŽĺ¤ă§ăŻăäťăŽćźçŽĺăŻăľăăźăăăăŚăăžăăă
ă˘ăľăźăăăăĺăĺçĺă§ăăĺ ´ĺăăŞăšăăăăĺăŽ1ă¤ăŽĺ ąç¨ä˝ĺăŤĺŻžăăĺă˘ăľăźăˇă§ăłăäżćăăăžăă
ĺçĺăăăŽă¤ăłăżăźăă§ă¤ăšăĺŽčŁ ăăŚăăĺ ´ĺăă¤ăłăżăźăă§ă¤ăšĺăŽĺ ąç¨ä˝ĺăŤĺŻžăăĺă˘ăľăźăˇă§ăłăäżćăăăžăă ďźçšăŤăăŞăšăăăăŚăăăăšăŚăŽăżă¤ăăăăŽă¤ăłăżăźăă§ăźăšăĺŽčŁ ăăŚăăĺ ´ĺăă˘ăľăźăˇă§ăłăŻĺ¸¸ăŤäżćăăăžăďźă
ăżă¤ăăšă¤ăăăŻăăŞăšăăăăŚăăăăšăŚăŽăżă¤ăăĺŤăăŚçś˛çž çă§ăăăăăăăŠăŤăăŽăąăźăšăĺŤăĺż čŚăăăăžăă
ăżă¤ăă˘ăľăźăˇă§ăłă¨ăżă¤ăăšă¤ăăăŻăäżĺăăăĺ¤ăŽăłăăźăčżăăžăă
ăăăąăźă¸reflectăŤăŻăĺć ăăăĺ ąç¨ä˝ĺ¤ăŽĺçĺă¨ć źç´ăăăĺ¤ăĺĺžăăćšćłă¨ăĺć ăăăĺ ąç¨ä˝ĺăŽăŞăšăăăăĺăĺĺžăăćšćłăĺż čŚă§ăă
ăăźăďź
union{...}
ć§ćăŻăăăŽăšăŹăăăŽĺč¨ĺăŽććĄă¨ĺşĺĽăăăăăŤă丝ăŤGoććłăŽĺŞăăăăăăăŁăäżćăăăăăŤăăăăŚĺśçśăŤăăăăčĺĽăăăĺ
ąç¨ä˝ă§ăăăă¨ă埡調ăăăăăŤé¨ĺçăŤé¸ćăăăžăăă çľćă¨ăăŚăăăăŤăăă union{}
ăunion{ int }
ăŞăŠăŽăăĺĽĺŚăŞçľĺăĺŻč˝ăŤăŞăăžăă 1ă¤çŽăŻăĺ¤ăăŽćĺłă§struct{}
ă¨ĺçă§ăăăăďźĺŽçžŠä¸ăŻç°ăŞăĺă§ăăďźăĺĽăŽçŠşăŽĺăčż˝ĺ ăă䝼ĺ¤ăŻč¨čŞăŤčż˝ĺ ăăăžăăă 2çŞçŽăŻăăăăăăŁă¨äžżĺŠă§ăă ăă¨ăă°ă type Id union { int }
ăŻtype Id struct { int }
type Id union { int }
ă¨é常ăŤăăäźźăŚăăžăăăăŚăăŞăłăăźă¸ă§ăłă§ăŻă idValue.int
ăćĺŽăăŞăăŚăç´ćĽĺ˛ăĺ˝ăŚă§ăăăăăçľăżčžźăżĺăŽăăăŤčŚăăžăă
ĺ˛ăĺ˝ăŚäşćăżă¤ăăĺŚçăăă¨ăăŤĺż čŚăŞăăăžăăă解ćśăăĺ¤ćăŻĺ°ăĺłăăă§ăăăăăŚăłăšăăŞăźă ăłăźăăćşĺăăăŚăăŞăăăăžăăăĺ°ĺ ĽăăăăăŤăŚăăŞăłăć´ć°ăăăă¨ăă¨ăŠăźăçşçăăžăă
ĺăčžźăżăŽćŹ ĺŚăŻăăŚăăŞăłă§ăĄă˝ăăă訹ĺŻăăăżă¤ăăšă¤ăăă§ĺžšĺşçăŞăăăăłă°ăĺż čŚă¨ăăçľćă§ăă
ăŞăšăăăăăżă¤ăăŽăĄă˝ăăăŽćĺšăŞĺ
ąéé¨ĺăĺĺžăăăŽă§ăŻăŞăăăŚăăŞăłčŞä˝ă§ăĄă˝ăăă訹ĺŻăăăă¨ă§ă誤ăŁăŚä¸čŚăŞăĄă˝ăăăĺĺžăăăă¨ăĺéżă§ăăžăă ć źç´ăăăĺ¤ăĺ
ąéăŽă¤ăłăżăźăă§ăźăšăŤă˘ăľăźăăăăżă¤ăăŤăăăćć źăĺż
čŚăŞĺ ´ĺăŤĺç´ă§ć示çăŞăŠăăăźăĄă˝ăăăĺŻč˝ăŤăŞăăžăă ăă¨ăă°ăĺ
ąç¨ä˝ĺU
ăăŞăšăăăăŚăăăăšăŚăŽĺăfmt.Stringer
ĺŽčŁ
ăăžăă
func (u U) String() string {
return u.(fmt.Stringer).String()
}
ăŞăłăŻăăăreddităšăŹăăă§ărscăŻćŹĄăŽăăăŤčż°ăšăŚăăžăă
sum {X;ăŽĺ¤ăăźăăŽĺ ´ĺăŻăĺĽĺŚăŤăŞăăžăă Y}ăŻsum {Y;ăŽăăă¨ăŻç°ăŞăăžăă NS }ă ăăăŻăĺč¨ăé常ăŠăŽăăăŤćŠč˝ăăăă§ăŻăăăžăăă
ăŠăăŞććĄăŤăĺ˝ăŚăŻăžăăŽă§ăăăŁă¨čăăŚăăžăăă
ăăăŻăă°ă§ăŻăăăžăăăćŠč˝ă§ăă
ć¤č¨
type (
Undefined = struct{}
UndefinedOrInt union { Undefined; int }
)
寞ă
type (
Illegal = struct{}
IntOrIllegal union { int; Illegal }
)
UndefinedOrInt
ăŻăăăăŠăŤăă§ăŻăžă ĺŽçžŠăăăŚăăŞăăă¨ă示ăăŚăăžăăăĺŽçžŠăăăŚăăĺ ´ĺăŻă int
ĺ¤ăŤăŞăăžăă ăăăŻ*int
éĄäźźăăŚăăăĺč¨ăżă¤ăďź1 + intďźăGo nowă§čĄ¨ăĺż
čŚăăăăăźăĺ¤ăéĄäźźăăŚăăžăă
ä¸ćšă IntOrIllegal
ăŻăăăăŠăŤăă§ăŻint 0ă§ăăă¨č¨ăăžăăăăăćçšă§éćłă¨ăăŚăăźăŻăăăĺŻč˝ć§ăăăăžăă ăăăŻăžă *int
äźźăŚăăžăăăăźăĺ¤ăŻăăăăŠăŤăă§new(int)
埡ĺśăăăŞăŠăćĺłăăă襨çžăăžăă
ăăăŻăć§é ä˝ăŽăăźăŤăăŁăźăŤăăč˛ ăŽĺ¤ă§čĄ¨çžă§ăăăăăŞăăŽăŞăŽă§ăăăăŠăŤăă¨ăăŚăźăĺ¤ăĺż čŚă§ăă
ĺč¨ăŽä¸ĄćšăŽăźăĺ¤ăŻăăăčŞä˝ăćç¨ă§ćĺłăăăăăăă°ăŠăăźăŻçśćłăŤćăéŠăăăăŽăé¸ćă§ăăžăă
ĺč¨ăććĽăŽĺćĺďźĺćĽăŻĺŽçžŠăăăstruct{}
ďźăŽĺ ´ĺăćĺăŤăŞăšăăăăŚăăćšăéąăŽćĺăŽćĽă§ăăă iota
ăšăżă¤ăŤăŽĺćĺă§ăĺăă§ăă
ăžăăăźăĺ¤ăŽćŚĺżľăćă¤ĺč¨ĺăžăăŻčĺĽ/ăżă°äťăĺ ąç¨ä˝ăćă¤č¨čŞăç§ăŻçĽăăžăăă Căćăčżăă§ăăăăźăĺ¤ăŻĺćĺăăăŚăăŞăăĄă˘ăŞă§ăăăĺžăăă¨ăŻăťă¨ăăŠăăăžăăă JavaăŽăăăŠăŤăăŻnullă ă¨ćăăžăăăăăăŻăăšăŚăĺç §ă§ăăăăă§ăă ç§ăçĽăŁăŚăăäťăŽăăšăŚăŽč¨čŞăŤăŻă袍ĺ ć°ăŽĺż é ăŽĺć§çŻĺăăăăăăĺŽéăŤăŻăźăĺ¤ăŽćŚĺżľăŻăăăžăăă ăăŽăăăŞč¨čŞăŻăăăžăăďź ăăăŻä˝ăăăăăăŽăăŽăďź
ăĺč¨ăă¨ăĺéĺăăŽć°ĺŚçćŚĺżľă¨ăŽéăăĺéĄă§ăăĺ ´ĺăăă¤ă§ăăăăăĺĽăŽä˝ăďźăă¨ăă°ăăăŞă˘ăłăăďźă¨ĺźăśăă¨ăă§ăăžăă
ĺĺăŽĺ ´ĺďźUnionăŻc / c ++ăŽç´ç˛ä¸ťçžŠč ă桡䚹ăăăžăă VariantăŻă丝ăŤCOBRAăăăłCOMăăă°ăŠăăźăŤăăçĽăăăŚăăžăăăé˘ć°ĺč¨čŞă§ăŻăčĺĽăăăĺ ąç¨ä˝ă弽ăžăăŚăăăăă§ăă ăťăăăŻĺčŠă¨ĺčŠă§ăă ăăźăŻăźă_pick_ă弽ăă§ăă LimboăŻ_pick_ă使ç¨ăăžăăă ăăăŻçăăćéăŽĺăŽăťăăăăé¸ćăăĺăŽćĺłă誏ćăăŚăăžăă
ĺĺ/ć§ćăŻăťă¨ăăŠé˘äżăăăžăăă ăăăŻăŻĺ¤§ä¸ĺ¤Ťă§ăăăă
ăăŽăšăŹăăăŽăŠăĄăăŽććĄăăč¨ĺŽăăăçčŤçĺŽçžŠăŤéŠĺăăžăă
ĺçčŤăŽĺč¨ăéĺ¤ăăăăăăźăĺ¤ăŤçšĺĽăŞćĺăŽĺăŻçĄé˘äżă§ăăăăăăŁăŚăé ĺşăŻçĄé˘äżă§ăďźA + B = B + Aďźă ç§ăŽććĄăŻăăŽçšć§ăçśćăăŚăăžăăă製ĺăżă¤ăăçčŤçăŤăŻéĺ¤ăăŚăăăăťă¨ăăŠăŽč¨čŞďźGoăĺŤăďźă§ăŻĺŽéăŤăŻç°ăŞăă¨čŚăŞăăăŚăăăăăăăăăĺż é ă§ăŻăăăžăăă
@jimmyfrasche
ç§ăŻĺäşşçăŤăăăăăŻăăĄăłăăźă¨ăăŚă¤ăłăżăźăă§ăźăšă訹ĺŻăăŞăăă¨ăŻé常ăŤĺ¤§ăăŞćŹ çšă§ăăă¨äżĄăăŚăăžăă ăžăăăpickăăżă¤ăăŽĺŞăăăŚăźăšăąăźăšăŽ1ă¤ăĺŽĺ ¨ăŤćăĄč˛ ăăăžăăă¨ăŠăźăçşçăăă¨ăăĄăłăăźăŽ1ă¤ăŤăŞăăžăă ăžăăŻăăŚăźăśăźăŤäşĺăŤStringReaderă使ç¨ăăăăăŞăĺ ´ĺăŻăio.ReaderăžăăŻćĺĺăŽăăăăăćă¤ăăăŻăżă¤ăăĺŚçăăĺż čŚăăăăžăă ăăăăĺ ¨ä˝ă¨ăăŚăă¤ăłăżăźăă§ăźăšăŻĺăŞăĺĽăŽăżă¤ăă§ăăăăpickăăĄăłăăźăŤăżă¤ăĺśéăăăăšăă§ăŻăŞăă¨ç§ăŻäżĄăăŚăăžăă ăăŽĺ ´ĺăăăăŻăżă¤ăăŤ2ă¤ăŽă¤ăłăżăźăă§ă¤ăšăĄăłăăźăăăăä¸ćšăäťćšă§ĺŽĺ ¨ăŤĺ˛ăžăăŚăăĺ ´ĺăĺčż°ăŽăăăŤăăłăłăă¤ăŤćă¨ăŠăźăŤăŞăăŻăă§ăă
ăăŞăăŽĺ寞ăŽććĄăăç§ă弽ăăŞăŽăŻăăĄă˝ăăăăăăŻăżă¤ăă§ĺŽçžŠă§ăăă¨ăăäşĺŽă§ăă ăĄă˝ăăăăăšăŚăŽăĄăłăăźăŤĺąăăĺ ´ĺăŻĺ¤ăăŞăă¨ćăăŽă§ăăĄăłăăźăŽăĄă˝ăăăŽćé˘ăćäžăăĺż čŚăŻăŞăă¨ćăăžăďźă¨ăŤăăăăŽăăăŽă¤ăłăżăźăă§ă¤ăšăăăăžăďźă ăăăŚăĺžšĺşçăŞăšă¤ăă+ăăăŠăŤăăŽăąăźăšăŻé常ăŤčŻăčăă§ăă
@rogpeppe @jimmyfrascheăăŞăăŽććĄăŤç§ăčŚăŞăä˝ăăăç§ăăĄăăăăăăŞăăă°ăŞăăŞăççąă§ăă ć°ăă税éĄăŽăżă¤ăăčż˝ĺ ăăăă¨ăŤăŻćăăăŞćŹ çšăăăăžăăăăăŻăGoăŤĺžĺăăăăšăŚăŽäşşăĺŚă°ăŞăăă°ăŞăăŞăć°ăăćŚĺżľă§ăă čŁĺăŽĺŠçšăŻä˝ă§ăăďź çšăŤăć°ăă税éĄăŽăżă¤ăăŻăă¤ăłăżăźăă§ă¤ăšăżă¤ăăăăŻĺžăăăŞăăăŽăç§ăăĄăŤä¸ăăžăăďź
@ianlancetaylor RobertăŻăăă§ăăăăăžăčŚç´ăăžăăďź https ďź
@ianlancetaylor
çľĺąăŽă¨ăăăăłăźăăčŞăżăăăăŞăăăăăGoăŽä¸ťčŚăŞăăŁăŹăŻăăŁăă§ăă json.TokenăŤă¤ăăŚčăăŚăżăžăăăăçžĺ¨ăă¤ăłăżăźăă§ăźăš{}ă¨ăăŚĺŽçžŠăăăŚăăžăăăăăăĽăĄăłăăŤăŻăĺŽéăŤăŻçšĺŽăŽć°ăŽăżă¤ăăŽ1ă¤ăŤăăă§ăăŞăă¨č¨čźăăăŚăăžăă ä¸ćšă揥ăŽăăăŤć¸ăăăŚăăĺ ´ĺ
type Token Delim | bool | float64 | Number | string | nil
ăŚăźăśăźăŻăăšăŚăŽĺŻč˝ć§ăăăăŤčŚăăă¨ăă§ăăăăźăŤăŻĺŽĺ ¨ăŞăšă¤ăăăčŞĺçăŤä˝ćăăăă¨ăă§ăăžăă ăăăŤăăłăłăă¤ăŠăźăŻăäşćăăŞăĺăăăăŤč˛źăäťăăăă¨ăé˛ăăžăă
çľĺąăŽă¨ăăăăłăźăăčŞăżăăăăŞăăăăăGoăŽä¸ťčŚăŞăăŁăŹăŻăăŁăă§ăă
ăăĺ¤ăăŽćŠč˝ăŻăăłăźăăç解ăăăăăŤăăŁă¨çĽăĺż čŚăăăăă¨ăćĺłăăžăă č¨čŞăŽĺšłĺçăŞçĽčăăćăăŞăäşşăŤă¨ăŁăŚăăăŽčŞăżăăăăŻĺż çśçăŤ[ć°ăăčż˝ĺ ăăă]ćŠč˝ăŽć°ăŤĺćŻäžăăžăă
@cznic
ăăĺ¤ăăŽćŠč˝ăŻăăłăźăăç解ăăăăăŤăăŁă¨çĽăĺż čŚăăăăă¨ăćĺłăăžăă
常ăŤă§ăŻăŞăă ăăłăźăĺ ăŽćć¸ĺăä¸ĺĺăžăăŻä¸č˛Ťć§ăŽăŞăä¸ĺ¤ćĄäťśăŤă¤ăăŚăăŁă¨çĽăăăŽäťŁăăăŤăč¨čŞăŤă¤ăăŚăăŁă¨çĽăăăă¨ăă§ăăă°ăăăă§ăćŁĺłăŽĺĺŠăŤăŞăĺŻč˝ć§ăăăăžăă ďźă¤ăžăăă°ăăźăăŤăŞçĽčăŻăăăźăŤăŤăŞçĽčăŽĺż čŚć§ăŤĺăŁăŚäťŁăăĺŻč˝ć§ăăăăžăăďź
ăăčŻăăłăłăă¤ăŤćăŽĺăă§ăăŻă確ăăŤĺŻä¸ăŽĺŠçšă§ăăĺ ´ĺăçŁĺťăŤăăŁăŚăă§ăăŻăăăăłăĄăłăăĺ°ĺ Ľăăăă¨ăŤăăăč¨čŞăĺ¤ć´ăăăŤé常ăŤéĄäźźăăĺŠçšăĺžăăă¨ăă§ăăžăă ä˝ăăŽăăăŞăăŽ
//vet:types Delim | bool | float64 | Number | string | nil
type Token interface{}
çžĺ¨ăçŁĺťăŽăłăĄăłăăŻăăăžăăăŽă§ăăăăŻĺŽĺ ¨ăŤćˇąĺťăŞććĄă§ăŻăăăžăăă ăăăăç§ăŻĺşćŹçăŞčăćšăŤçĺŁăŤĺăçľăă§ăăžăăéçĺćăăźăŤă§ĺŽĺ ¨ăŤĺŽčĄă§ăăĺŻä¸ăŽĺŠçšăăăĺ ´ĺăč¨čŞăŤč¤éăŞć°ăăćŚĺżľăčż˝ĺ ăă䞥ĺ¤ăŻćŹĺ˝ăŤăăăŽă§ăăăăă
cmd / vetăŤăăŁăŚĺŽčĄăăăăăšăăŽĺ¤ăăăăăăăăšăŚăŻăĺĺĽăŽéçĺćăăźăŤă§ăŻăŞăăłăłăă¤ăŠăźăŤăăŁăŚăă§ăăŻă§ăăă¨ăăćĺłă§ăč¨čŞăŤčż˝ĺ ă§ăăžăă ăăăăăăžăăžăŞççąăăăvetăăłăłăă¤ăŠăăĺé˘ăăă¨äžżĺŠă§ăă ăŞăăăŽćŚĺżľăŻçŁĺťĺ´ă§ăŻăŞăč¨čŞĺ´ăŤăăăŽă§ăăďź
@ianlancetaylorăŻăłăĄăłăăĺ確čŞăăžăăďź https ďź
@ianlancetaylorĺ¤ć´ăćŁĺ˝ĺăăăăăŠăăăŤé˘ăăŚăŻăç§ăŻçŠćĽľçăŤăăăçĄčŚăăŚăăžăăă čŚç´ă§ăăăŤă¤ăăŚčŠąăăă¨ăŻćć§ă§ăç§ăŤăŻĺ˝šăŤçŤăĄăžăăăăăăŻăăšăŚăç§ăŤăŻăčŻăăă¨ăŻčŻăăă¨ăćŞăăă¨ăŻćŞăăă¨ăăŽăăăŤčăăăžăă ăżă¤ăăĺŽéăŤăŠăŽăăăŞăăŽăŤăŞăăďźĺśéă¨ăŻä˝ăăăăăćă¤ćĺłăéˇćă¨ăŻä˝ăăçćăŻä˝ăďźăçĽăăăăŁăăŽă§ăč¨čŞăŤăŠăŽăăăŤéŠĺăăăďźăžăăŻéŠĺăăŞăăďźă確čŞă§ăăžăăă ďźăăăŚăç§ăăăăăăă°ăŠă ă§ăŠăŽăăăŤä˝żç¨ăăă/使ç¨ă§ăăăăŤă¤ăăŚăŽčăăćăŁăŚăăžăă ĺ°ăŞăă¨ăç§ăŽčŚłçšăăăŻăGoă§ĺč¨ăżă¤ăăä˝ăćĺłăăăŽăăŤă¤ăăŚăŻčŻăčăăăăă¨ćăăžăă ç§ăŻĺ˝źăăăăă ăăŽäžĄĺ¤ăăăă¨ĺŽĺ ¨ăŤç˘şäżĄăăŚăăăăă§ăŻăăăžăăăďźç§ăćŹĺ˝ăŤćŞăăă¨ăćăă§ăăă¨ăăŚăďźăäťă§ăŻç§ăć¨čŤă§ăăć確ăŤĺŽçžŠăăăăăăăăŁă§ĺćăăăăăŽç˘şăăŞăăŽăăăăžăă ăăčŞä˝ăŻĺŽéăŤăŻçăă§ăŻăŞăăă¨ăç§ăŻçĽăŁăŚăăžăăăĺ°ăŞăă¨ăç§ăăăăŤĺăçľăă§ăăă¨ăăă§ăă
ăăčŻăăłăłăă¤ăŤćăŽĺăă§ăăŻă確ăăŤĺŻä¸ăŽĺŠçšă§ăăĺ ´ĺăçŁĺťăŤăăŁăŚăă§ăăŻăăăăłăĄăłăăĺ°ĺ Ľăăăă¨ăŤăăăč¨čŞăĺ¤ć´ăăăŤé常ăŤéĄäźźăăĺŠçšăĺžăăă¨ăă§ăăžăă
ăăăŻăć°ăăăă¨ăĺŚăśĺż čŚăăăă¨ăăćšĺ¤ăŤĺŻžăăŚäžçśă¨ăăŚčĺźąă§ăă ăłăźăăăăăă°/ç解/使ç¨ăăăăăŤăăăăŽéćłăŽçŁĺťăŽăłăĄăłăăŤă¤ăăŚĺŚăśĺż čŚăăăĺ ´ĺăăăăGoč¨čŞăŽäşçŽăŤĺ˛ăĺ˝ăŚăăăćčĄçăŤGoč¨čŞă§ăŻăŞăäşçŽăŤĺ˛ăĺ˝ăŚăăăŤé˘äżăŞăăăăăŻç˛žçĽçăŞč˛ ć ă§ăă ăŠăĄăăă¨ăăă°ăç§ăč¨čŞăĺŚăă ă¨ćăŁăă¨ăăŤç§ăăăăăĺŚăśĺż čŚăăăăă¨ăçĽăăŞăăŁăăŽă§ăéćłăŽăłăĄăłăăŻăăéŤäžĄă§ăă
@cznic
ĺćăăžăăă ăăŞăăŽçžĺ¨ăŽäťŽĺŽă§ăŻăäşşăăăŁăăŤăä˝ă§ăăăăăăăăŻćŠč˝ăä˝ă§ăăăăăç解ăăă ăăă¨ç˘şäżĄăăăă¨ăŻă§ăăžăăă ăăăăăăăăŽăăŽăŻč¨čŞăŤĺĺ¨ăăžăă ăžăăć°ćŠč˝ăŻăč¨čŞăéŁăăăăăă¨ăčŞĺçăŤćĺłăăăăă§ăŻăăăžăăă ăăŽĺ ´ĺăăăŠăăŻăăăŻăšă¤ăłăżăźăă§ă¤ăš{}ăżă¤ăă使ç¨ăăăŽă§ăŻăŞăăăżă¤ăăä˝ă§ăăăăčŞč
ăŤăăăŤćăăăŤăŞăăăăĺŽéăŤăŻç解ăăăăăŞăă¨ç§ăŻä¸ťĺźľăăžăă
@ianlancetaylor
ĺäşşçăŤăŻăăăŽćŠč˝ăŻăłăźăăčŞăżăăăăăć¨čŤăăăă¨ă¨é˘äżăăăă¨ćăăžăă ăłăłăă¤ăŤćăŽĺŽĺ
¨ć§ăŻé常ăŤĺŞăăćŠč˝ă§ăăă丝čŚăŞćŠč˝ă§ăŻăăăžăăă ĺ署ĺăăăăŤăăăăăăăŞăă ăă§ăŞăăăăŽĺžăŽä˝żç¨ćłăç解ăăăăăć¸ăăăăăŞăăžăă äşćăăŞăăżă¤ăăĺăĺăŁăĺ ´ĺăäşşă
ăŻăăŻăăăăăŻăŤč¨´ăăĺż
čŚăŻăăăžăă-ăăăŻć¨ćşăŠă¤ăăŠăŞă§ăçžĺ¨ăŽĺä˝ă§ăăăćŞçĽăŽăăŽăŤéŞéăăăăă¨ăŞăă使ç¨ćłăŤă¤ăăŚčăăăŽăç°ĄĺăŤăŞăăžăă ăăăŚăăłăĄăłăăäťăŽăăźăŤďźăăĄăźăšăăăźăăŁă§ăăŁăŚăďźăŤé źăăŽăŻčŻăčăă§ăŻăŞăă¨ćăăžăăăŞăăŞăăăăŽăăăŞăłăĄăłăăăăăŻăŞăźăłăŞć§ćăŽćšăčŞăżăăăăăă§ăă ăžăăăłăĄăłăăŻć§é ăăŞăă桡䚹ăăăăăŞăŁăŚăăžăă
@ianlancetaylor
ăŞăăăŽćŚĺżľăŻçŁĺťĺ´ă§ăŻăŞăč¨čŞĺ´ăŤăăăŽă§ăăďź
ĺă質ĺăăăĽăźăŞăłă°ĺŽĺ ¨ăłă˘äťĽĺ¤ăŽćŠč˝ăŤéŠç¨ăăăă¨ăă§ăăžăăăééăăŞăăGoăăăăĽăźăŞăłă°éĽçŠˇăăŤăăăăŞăăŽă§ăă ä¸ćšăćă ăŻä¸čŹçăŞăćĄĺźľĺăć§ćăŤăŞăĺŽéăŽč¨čŞăŽéčŚăŞăľăăťăăăćźăčžźăă ăŚăăč¨čŞăŽäžăćăŁăŚăăžăă ďźăă¨ăă°ăRustăC ++ăăăăłGNU CăŽăĺąć§ăăďź
ćŠč˝ăăłă˘č¨čŞă§ăŻăŞăćĄĺźľćŠč˝ăžăăŻĺąć§ăŤé 罎ăă丝ăŞççąăŻăć°ćŠč˝ăčŞčăăŞăăăźăŤă¨ăŽäşćć§ăŞăŠăć§ćăŽäşćć§ăçśćăăăăă§ăă ďźăăăźăŤă¨ăŽäşćć§ăăĺŽéăŤćŠč˝ăăăăŠăăăŻăćŠč˝ăĺŽéăŤä˝ăăăăăŤĺ¤§ăăäžĺăăžăăďź
GoăŽăłăłăăăšăă§ăŻăćŠč˝ăvet
ăŤé
罎ăă丝ăŞççąăŻăč¨čŞčŞä˝ăŤéŠç¨ăăĺ ´ĺăŤGo1ăŽäşćć§ăçśćăăŞăĺ¤ć´ăĺŽčŁ
ăăăă¨ă§ăăăăăŤćăăăžăă ăăă§ăŻăăăĺéĄă¨ăŻčăăŚăăžăăă
ćŠč˝ăvet
ăŤĺ
ĽăăŞăççąăŽă˛ă¨ă¤ăŻăăłăłăă¤ăŤä¸ăŤăăăăäźćăăĺż
čŚăăăĺ ´ĺă§ăă ăă¨ăă°ăç§ăć¸ăĺ ´ĺďź
switch x := somepkg.SomeFunc().(type) {
âŚ
}
ăăăąăźă¸ăŽĺ˘çăčśăăŚăĺč¨ăŤĺŤăžăăŞăăżă¤ăăŤĺŻžăăŚéŠĺăŞčŚĺă襨示ăăăžăăďź vet
ăäťĺčŠăŽćˇąăĺćăĺŽčĄă§ăăăă¨ăŻç§ăŤăŻćăăă§ăŻăŞăăŽă§ăăăăăăăăăłă˘č¨čŞăŤĺ
Ľăĺż
čŚăăăççąă§ăă
@ dr2chaseä¸čŹçăŤăăăĄăăăăŞăăŻćŁăăă§ăăăăăŽçšĺŽăŽäžăŤă¤ăăŚăŻćŁăăă§ăăďź éćłăŽăłăĄăłăăä˝ăćĺłăăăŽăăçĽăăŞăăŚăăăłăźăăŻĺŽĺ ¨ăŤç解ă§ăăžăă éćłăŽăłăĄăłăăŻăăłăźăăŽĺä˝ăăžăŁăăĺ¤ć´ăăžăăă çŁĺťăăăŽă¨ăŠăźăĄăăťăźă¸ăŻć確ă§ăŞăăă°ăŞăăžăăă
@bcmills
ăŞăăăŽćŚĺżľăŻçŁĺťĺ´ă§ăŻăŞăč¨čŞĺ´ăŤăăăŽă§ăăďź
ĺă質ĺăăăĽăźăŞăłă°ĺŽĺ ¨ăłă˘äťĽĺ¤ăŽćŠč˝ăŤéŠç¨ă§ăăžăă
ĺćăăžăăă č°čŤä¸ăŽćŠč˝ăăłăłăă¤ăŤăăăăłăźăăŤĺ˝ąéżăä¸ăăĺ ´ĺăăăăćŻćăăčŞĺĺźć°ăăăăžăă ăăŽĺ ´ĺăăăŽćŠč˝ăŻăłăłăă¤ăŤăăăăłăźăăŤĺ˝ąéżăä¸ăăŞăăăă§ăă
ďźăăăŚăăŻăăvetăŻă¤ăłăăźăăăăăăăąăźă¸ăŽă˝ăźăšă解ćă§ăăžăăďź
ç§ăŻçŁĺťăŤă¤ăăŚăŽç§ăŽč°čŤăćąşĺŽçă§ăăă¨ä¸ťĺźľăăăă¨ăŻăăŚăăžăăă ăăăăăăšăŚăŽč¨čŞăŽĺ¤ć´ăŻĺŚĺŽçăŞçŤĺ ´ăăĺ§ăžăăžăăĺç´ăŞč¨čŞăé常ăŤćăžăăăăăŽăăăŞéčŚăŞć°ćŠč˝ăŤăăăĺż çśçăŤč¨čŞăăăč¤éăŤăŞăăžăă č¨čŞăŽĺ¤ć´ăćŻćăă埡ĺăŞč°čŤăĺż čŚă§ăă ăăăŚăç§ăŽčŚłçšăăăŻăăăăăŽĺźˇĺăŞč°čŤăŻăžă çžăăŚăăžăăă çľĺąăŽă¨ăăăç§ăăĄăŻăăŽĺéĄăŤă¤ăăŚéˇăéčăăŚăăžăăăăăăŚăăăŻFAQďźhttps://golang.org/doc/faq#variant_typesďźă§ăă
@ianlancetaylor
ăăŽĺ ´ĺăăăŽćŠč˝ăŻăłăłăă¤ăŤăăăăłăźăăŤĺ˝ąéżăä¸ăăŞăăăă§ăă
ăăăŻĺ ˇä˝çăŞčŠłç´°ăŤäžĺăăă¨ćăăžăăďź ä¸č¨ăŽ@jimmyfrasche ďźhttps://github.com/golang/go/issues/19412#issuecomment-289319916ďźă確ăăŤčĄăăĺč¨ăŽăźăĺ¤ăŻăćĺăŽăżă¤ăăŽăźăĺ¤ăăŽĺä˝ă§ăă
@urandomć示çăŞĺăłăłăšăăŠăŻăżăźăŞăă§ă¤ăłăżăźăă§ă¤ăšĺă¨ĺ ąç¨ä˝ĺă桡ĺ¨ăăŞăççąăŤă¤ăăŚéˇă誏ćăć¸ăăŚăăžăăăăăăăčĄăăăăŽăă税ăŽčł˘ćăŞćšćłăăăăă¨ăŤć°ăĽăăžăăă
ç§ăŽĺ寞ććĄăŤĺŻžăăčż éă§ćąăĺ寞ććĄă ďźć示çăŤč¨ĺăăăŚăăŞăăăŽăŻăăšăŚăç§ăŽäťĽĺăŽććĄă¨ĺăă§ăďźă ăăććĄăäťăŽććĄăăăĺŞăăŚăăăăŠăăăŻăăăăžăăăăăăăŻă¤ăłăżăźăă§ăźăšă訹ĺŻăăăăć確ă§ăă
ăŚăăŞăłăŤăŻă䝼éăăżă°ĺăă¨ĺźă°ăăć示çăŞăăăŁăźăŤăĺăăăăăžăă
union { //or whatever
None, invalid struct{} //None is zero value
Good, Bad int
Err error //okay because it's explicitly named
}
ăžă ĺăčžźăżăŻăăăžăăă ăżă°ĺăŽăŞăĺăăăă¨ĺ¸¸ăŤă¨ăŠăźăŤăŞăăžăă
ăŚăăŞăłĺ¤ăŤăŻăĺçăżă¤ăă§ăŻăŞăĺçăżă°ăăăăžăă
ăŞăăŠăŤĺ¤ăŽä˝ćďź U{v}
ăŻăĺŽĺ
¨ăŤć確ăŞĺ ´ĺăŤăŽăżćĺšă§ăăăă䝼ĺ¤ăŽĺ ´ĺăŻă U{Tag: v}
ăžăă
ĺ¤ćĺŻč˝ć§ă¨ĺ˛ăĺ˝ăŚăŽäşćć§ă§ăŻăăżă°ĺăčć Žăăăžăă
çľĺă¸ăŽĺ˛ăĺ˝ăŚăŻéćłă§ăŻăăăžăăă ăăăŻĺ¸¸ăŤăäşćć§ăŽăăăŚăăŞăłĺ¤ăĺ˛ăĺ˝ăŚăăă¨ăćĺłăăžăă äżĺăăăĺ¤ăč¨ĺŽăăăŤăŻăçŽçăŽăżă°ĺăć示çăŤä˝żç¨ăăĺż
čŚăăăăžăă v.Good = 1
ăŻăĺçăżă°ăGoodăŤč¨ĺŽăăäżĺăăăĺ¤ă1ăŤč¨ĺŽăăžăă
äżĺăăăĺ¤ăŤă˘ăŻăťăšăăăŤăŻăăżă¤ăă˘ăľăźăˇă§ăłă§ăŻăŞăăżă°ă˘ăľăźăˇă§ăłă使ç¨ăăžăă
g := v.[Tag] //may panic
g, ok := v.[Tag] //no panic but could return zero-value, false
v.TagăŻăăăžăăŞăăărhsăŽă¨ăŠăźă§ăă
ăżă°ăšă¤ăăăŻăăąăźăšăăŚăăŞăłăŽăżă°ă§ăăăă¨ăé¤ăăŚă switch v.[type]
ă¨ć¸ăăăăżă¤ăăšă¤ăăăŤäźźăŚăăžăă
ăżă¤ăă˘ăľăźăˇă§ăłăŻăĺçăżă°ăŽăżă¤ăăŤé˘ăăŚäżćăăăžăă ăżă¤ăăšă¤ăăăĺć§ăŤćŠč˝ăăžăă
ăăĺ ąç¨ä˝ăżă¤ăăŽĺ¤aăbăä¸ăăăăĺ ´ĺăăăăăŽĺçăżă°ăĺăă§ăăăć źç´ăăăŚăăĺ¤ăĺăă§ăăĺ ´ĺăa == bă§ăă
äżĺăăăĺ¤ăçšĺŽăŽĺ¤ă§ăăăăŠăăă確čŞăăăŤăŻăăżă°ă˘ăľăźăˇă§ăłăĺż čŚă§ăă
ăżă°ĺăă¨ăŻăšăăźăăăăŚăăŞăĺ ´ĺăăŚăăŞăłăĺŽçžŠăăăăăąăźă¸ă§ăŽăżč¨ĺŽăăăłă˘ăŻăťăšă§ăăžăă ăăăŻăă¨ăŻăšăăźăăăăăżă°ă¨ă¨ăŻăšăăźăăăăŚăăŞăăżă°ă桡ĺ¨ăăăŚăăŞăłăŽăżă°ăšă¤ăăăăăăăŠăŤăăŽăąăźăšăŞăă§ĺŽçžŠăăăąăźă¸ăŽĺ¤ă§çś˛çž çăŤăŞăăă¨ăŻćąşăăŚăŞăăă¨ăćĺłăăžăă ăăšăŚăŽăżă°ăă¨ăŻăšăăźăăăăŚăăŞăĺ ´ĺăăăăŻăăŠăăŻăăăŻăšă§ăă
ăŞăăŹăŻăˇă§ăłă§ăŻăăżă°ĺăĺŚçăăĺż čŚăăăăžăă
eďźăăšăăăăĺ ąç¨ä˝ăŽć確ĺă ä¸ăăăă
type U union {
A union {
A1 T1
A2 T2
}
B union {
B1 T3
B2 T4
}
}
var u U
uăŽĺ¤ăŻĺçăżă°Aă§ăăăć źç´ăăăĺ¤ăŻĺçăżă°A1ă¨ăŽĺżĺĺ ąç¨ä˝ă§ăăăăăŽć źç´ăăăĺ¤ăŻT1ăŽăźăĺ¤ă§ăă
u.B.B2 = returnsSomeT3()
uăŻăăšăŚ1ă¤ăŽăĄă˘ăŞä˝ç˝ŽăŤć źç´ăăăŚăăăăăăăšăăăăăŚăăŞăłăŽ1ă¤ăăĺĽăŽăŚăăŞăłăŤç§ťĺăăŚăăuăăźăĺ¤ăăĺăćżăăăăăŤĺż čŚăŞăŽăŻăăă ăă§ăă ăăă
v := u.[A].[A2]
2ă¤ăŽăŚăăŞăłĺ¤ă§ăżă°ă˘ăľăźăˇă§ăłăĺŽčĄăăč¤ć°čĄăŤĺĺ˛ăăŞăă¨2ĺ¤ăăźă¸ă§ăłăŽăżă°ă˘ăľăźăˇă§ăłă使ç¨ă§ăăŞăăăăăăăăŻăŤăŞăĺŻč˝ć§ă2ă¤ăăăžăă ăăŽĺ ´ĺăăăšăăăăăżă°ăšă¤ăăăŻăăăŻăŞăźăłăŤăŞăăžăă
edit2ďźăżă¤ăassertăŽć確ĺă
ä¸ăăăă
type U union {
Exported, unexported int
}
var u U
u.(int)
ăăăŞăżă¤ăă˘ăľăźăˇă§ăłăŻĺŽĺ
¨ăŤĺççă§ăă ĺŽçžŠăăăąăźă¸ĺ
ă§ăŻăăăăŻĺ¸¸ăŤćăçŤăĄăžăă ăă ăă u
ăĺŽçžŠăăăąăźă¸ăŽĺ¤ăŤăăĺ ´ĺăĺçăżă°ăunexported
ă¨ăăŤu.(int)
ăŻăăăăŻăŤăŞăăĺŽčŁ
ăŽčŠłç´°ăćźć´ŠăăăŽăé˛ăăžăă ă¤ăłăżăźăă§ă¤ăšăżă¤ăă¸ăŽă˘ăľăźăˇă§ăłăŤă¤ăăŚăĺć§ă§ăă
@ianlancetaylorăăŽćŠč˝ăăŠăŽăăăŤĺ˝šçŤă¤ăăŽăăă¤ăăŽäžă揥ăŤç¤şăăžăă
ä¸é¨ăŽăăăąăźă¸ďźăă¨ăă°go/ast
ďźăŽä¸ĺżăŤăŻă1ă¤äťĽä¸ăŽĺ¤§ăăŞĺč¨ĺăăăăžăă ăăăăŽăżă¤ăăç解ăăăŤăăăăŽăăăąăźă¸ăăăă˛ăźăăăăă¨ăŻĺ°éŁă§ăă ăăăŤç´ăăăăăă¨ăŤăĺč¨ĺăăĄă˝ăăăćă¤ă¤ăłăżăźăă§ăźăšďź go/ast.Node
ďźă§čĄ¨ăăăĺ ´ĺăăăă°ă犺ăŽă¤ăłăżăźăă§ăźăšďź go/ast.Object.Decl
ďźă§čĄ¨ăăăĺ ´ĺăăăăžăă
protobuf oneof
ćŠč˝ăGoăŤăłăłăă¤ăŤăăă¨ăă¨ăŻăšăăźăăăăŚăăŞăă¤ăłăżăźăă§ă¤ăšăżă¤ăăçćăăăžăăăăŽă¤ăłăżăźăă§ă¤ăšăżă¤ăăŽĺŻä¸ăŽçŽçăŻăoneofăăŁăźăŤăă¸ăŽĺ˛ăĺ˝ăŚăăżă¤ăăťăźăă§ăăăă¨ă確čŞăăăă¨ă§ăă ăăŽăăăŤăŻăoneofăŽăăŠăłăăă¨ăŤăżă¤ăăçćăăĺż
čŚăăăăžăă ćçľčŁ˝ĺăŽĺăŞăăŠăŤăŻăčŞăżĺăă¨ć¸ăčžźăżăĺ°éŁă§ăă
&sppb.Mutation{
Operation: &sppb.Mutation_Delete_{
Delete: &sppb.Mutation_Delete{
Table: m.table,
KeySet: keySetProto,
},
},
}
ä¸é¨ăŽďźăăšăŚă§ăŻăăăžăăăďźoneofăŻăĺč¨ĺă§čĄ¨ăăă¨ăă§ăăžăă
ăăăśăăăżă¤ăăăžăăŤĺż čŚăŞăăŽă§ăăĺ ´ĺăăăăžăă ăă¨ăă°ăĺ¤ăăŽGoogle APIăŞă˝ăźăšć´ć°ćä˝ă§ăŻăăŞă˝ăźăšăŽăăŁăźăŤăăŽăľăăťăăăĺ¤ć´ă§ăăžăă Goă§ăăă襨çžăăčŞçśăŞćšćłăŽ1ă¤ăŻăĺăăŁăźăŤăăŤăĺ¤ĺăăżă¤ăăćă¤ăŞă˝ăźăšć§é ä˝ăŽăăŞă˘ăłăăŤăăăăŽă§ăă ăă¨ăă°ăGoogle Cloud StorageObjectAttrsăŞă˝ăźăšăŻćŹĄăŽăăăŤăŞăăžăă
type ObjectAttrs struct {
ContentType string
...
}
é¨ĺçăŞć´ć°ăăľăăźăăăăăăŤăăăăąăźă¸ăŻ
type ObjectAttrsToUpdate struct {
ContentType optional.String
...
}
optional.String
ăŻćŹĄăŽăăăŤăŞăăžăďź godoc ďźďź
// String is either a string or nil.
type String interface{}
ăăăŻčŞŹćăéŁăăăăżă¤ăăĺŽĺ
¨ă§ăŻăăăžăăăăăăŹăźăłăšăă¨ăłăłăźăăăŚăăéă ObjectAttrsToUpdate
ăŞăăŠăŤăŻObjectAttrs
ăŞăăŠăŤă¨ăžăŁăăĺăăăăŤčŚăăăăăĺŽéăŤăŻäžżĺŠă§ăăăă¨ăăăăăžăă ć¸ăăăăăăŁăăŽăŤ
type ObjectAttrsToUpdate struct {
ContentType string | nil
...
}
ĺ¤ăăŽé˘ć°(T, error)
ăxorăťăăłăăŁăŻăšă§T | error
ă¨ć¸ăă¨ăăťăăłăăŁăŻăšăć確ăŤăŞăăĺŽĺ
¨ć§ăéŤăžăăć§ćăŽćŠäźăĺ˘ăăžăă ďźäşćć§ăŽççąă§ďźé˘ć°ăŽćťăĺ¤ăĺ¤ć´ă§ăăŞăăăžăăŻĺ¤ć´ăăăăŞăĺ ´ĺă§ăăsumĺăŻăăăŁăăŤă¸ăŽć¸ăčžźăżăŞăŠăăăŽĺ¤ăćăĄéăśăŽăŤĺ˝šçŤăĄăžăă
go vet
ă˘ăăăźăˇă§ăłăŻç˘şăăŤăăăăŽăąăźăšăŽĺ¤ăăŤĺ˝šçŤăĄăžăăăĺżĺăżă¤ăăćĺłăăŞăăąăźăšăŤăŻĺ˝šçŤăĄăžăăă ĺč¨ĺăăăă°ăăăăăčŚăăăă¨ćăăžă
chan *Response | error
ăăŽăżă¤ăăŻăč¤ć°ĺć¸ăĺşăăŽăŤĺĺçăă§ăă
@ianlancetaylorăăăŻăăăăç´ ć´ăăăăšăżăźăă§ăŻăăăžăăăăăăăăŽč°čŤăčŞăăŚčŚç´ăăăă¨ăŻĺ ŹćŁă§ăăă¨ç§ăčăăăŽă§ăGo1ă§ăă§ăŤĺŽčĄă§ăăăŚăăŞăłă§ĺŽčĄă§ăăăăšăŚăăăăŤăăăžăă
ďźäťĽä¸ăŽć§ć/ăťăăłăăŁăŻăšăŽăżă°ă使ç¨ăăćć°ăŽććĄă使ç¨ăăžăăăžăăçşčĄăăăăłăźăăŻĺşćŹçăŤăăšăŹăăăŽăăŞăĺăŤć稿ăăCăłăźăăŽăăă§ăăă¨ćłĺŽăăŚăăžăăďź
ĺč¨ĺăŻăiotaăăă¤ăłăżăźăăăăłă¤ăłăżăźăă§ăźăšă¨éč¤ăăŚăăžăă
ăăăăŽ2ă¤ăŽăżă¤ăăŻăťăźĺçă§ăă
type Stoplight union {
Green, Yellow, Red struct {}
}
func (s Stoplight) String() string {
switch s.[type] {
case Green: return "green" //etc
}
}
ă¨
type Stoplight int
const (
Green Stoplight = iota
Yellow
Red
)
func (s Stoplight) String() string {
switch s {
case Green: return "green" //etc
}
}
ăłăłăă¤ăŠăźăŻă严ćšăŤĺŻžăăŚăžăŁăăĺăăłăźăăĺşĺăăĺŻč˝ć§ăăăăžăă
ăŚăăŞăłăăźă¸ă§ăłă§ăŻăintăŻé襨示ăŽĺŽčŁ 芳細ăŤĺ¤ćăăăžăă iotaăăźă¸ă§ăłă§ăŻăYellow / Redă¨ăŻä˝ăăĺ°ăăăăStoplightĺ¤ă-42ăŤč¨ĺŽăăăă§ăăžăăăunionăăźă¸ă§ăłă§ăŻă§ăăžăăăăăăăŻăăšăŚăłăłăă¤ăŠă¨ăŠăźă§ăăăćéŠĺä¸ăŤčć Žăăăă¨ăă§ăăä¸ĺ¤ćĄäťśă§ăă ĺć§ăŤăéťč˛ăŽăŠă¤ăăčć ŽăăŞăďźĺ¤ďźăšă¤ăăăä˝ćă§ăăžăăăăżă°ăšă¤ăăă使ç¨ăăă¨ăăăăć示çăŤăăăăăŤăăăŠăŤăăŽăąăźăšăĺż čŚăŤăŞăăžăă
ăăĄăăăiotaă§ă§ăăăă¨ă¨ăĺ ąç¨ä˝ăżă¤ăă§ăŻă§ăăŞăăă¨ăăăăžăă
ăăăăŽ2ă¤ăŽăżă¤ăăŻăťăźĺçă§ă
type MaybeInt64 union {
None struct{}
Int64 int64
}
ă¨
type MaybeInt64 *int64
ăă¤ăłăżăăźă¸ă§ăłăŻăăăłăłăăŻăă§ăă ăŚăăŞăłăăźă¸ă§ăłă§ăŻăĺçăżă°ăć źç´ăăăăăŤčż˝ĺ ăŽăăăăĺż čŚăŤăŞăăăďźăŻăźăăľă¤ăşăŤăŞăĺŻč˝ć§ăăăăžăďźăĺ¤ăŽăľă¤ăşăŻhttps://golang.org/pkg/database/sql/ă¨ĺăăŤăŞăĺŻč˝ć§ăăă
ăŚăăŞăłăăźă¸ă§ăłăŻăăăŽćĺłăăăć確ăŤćć¸ĺăăŚăăžăă
ăăĄăăăĺ ąç¨ä˝ĺă§ăŻĺŽčĄă§ăăŞăăă¤ăłăżă§ĺŽčĄă§ăăăă¨ăăăăžăă
ăăăăŽ2ă¤ăŽăżă¤ăăŻăťăźĺçă§ă
type AB union {
A A
B B
}
ă¨
type AB interface {
secret()
}
func (A) secret() {}
func (B) secret() {}
ăŚăăŞăłăăźă¸ă§ăłăŻăĺăčžźăżă§ĺéżăăăă¨ăŻă§ăăžăăă Aă¨BăŻĺ ąéăŽăĄă˝ăăăĺż čŚă¨ăăžăăăĺŽéăŤăŻăăăŞăăăŁăĺă§ăăăăjson.TokenăŽäž@urandomăć稿ăăăăăŤĺŽĺ ¨ăŤäşăăŤç´ ăŞăĄă˝ăăăťăăăćăŁăŚăăĺŻč˝ć§ăăăăžăă
ABăŚăăŞăłă¨ABă¤ăłăżăźăă§ăźăšăŤä˝ăĺ Ľăăăă¨ăă§ăăăă確čŞăăăŽăŻćŹĺ˝ăŤç°Ąĺă§ăăĺŽçžŠăŻăăăĽăĄăłăă§ăďźä˝ăăä˝ă§ăăăăç解ăăăăăŤăgo / astă˝ăźăšăä˝ĺşŚăčŞăĺż čŚăăăăžăăďźă
ABăŚăăŞăłăăźăăŤăăăă¨ăŻă§ăăăăăŽć§ćčŚç´ ăŽĺ ąéé¨ĺăŽĺ¤ĺ´ăŤăĄă˝ăăăä¸ăăăă¨ăă§ăăžăďźăăăŻăć§é ä˝ăŤă¤ăłăżăźăă§ă¤ăšăĺăčžźăăă¨ă§ăˇăăĽăŹăźăă§ăăžăăăć§é ä˝ăŻăăçšç´°ă§ă¨ăŠăźăçşçăăăăăŞăăžăďźă
ăăĄăăăĺ ąç¨ä˝ĺă§ăŻĺŽčĄă§ăăŞăă¤ăłăżăźăă§ăźăšă§ĺŽčĄă§ăăăă¨ăăăăžăă
ĺ¤ĺăăŽăŞăźăăźăŠăăăŻăăžăăŤăĺ¤ăăŽăŞăźăăźăŠăăă§ăă
ăăăăŽĺ ´ĺăăăŚăăŞăłăăźă¸ă§ăłăŽä¸ťăŞĺŠçšăŻăăłăłăă¤ăŤćăŽăă§ăăŻăăăĺłĺŻăŤăŞăăă¨ă§ăă ă§ăăŞăăă¨ăŻăă§ăăăă¨ăăăéčŚă§ăă ăă埡ĺăŞä¸ĺ¤ćĄäťśăŤĺ¤ćăăăłăłăă¤ăŠăźăŽĺ ´ĺăăłăźăăćéŠĺăăăăăŤä˝żç¨ă§ăăžăă ĺĽăŽăă¨ăŤĺ¤ćăăăăă°ăŠăăźăŤă¨ăŁăŚăŻăăłăłăă¤ăŠăźăŤĺżé ăăăăă¨ăă§ăăžăăăăăŻăăăŞăăééăŁăŚăăăăŠăăăćăăŚăăăă ăă§ăă ă¤ăłăżăźăă§ă¤ăšăăźă¸ă§ăłă§ăŻăĺ°ăŞăă¨ăăăăăĽăĄăłăăŤé˘ăăéčŚăŞĺŠçšăăăăžăă
ä¸ć źĺĽ˝ăŞăăźă¸ă§ăłăŽiotaă¨ăă¤ăłăżăźăŽäžăŻăăă¨ăŻăšăăźăăăăŚăăŞăăĄă˝ăăă¨ăŽă¤ăłăżăźăă§ăźăšăćŚçĽă使ç¨ăăŚć§çŻă§ăăžăă ăă ăăăăŽăă¨ăŤă¤ăăŚăŻăć§é ä˝ăŻmap[string]interface{}
ă¨ăé˘ć°ĺă¨ăĄă˝ăăĺ¤ăćă¤ďźçŠşă§ăŞăďźă¤ăłăżăźăă§ă¤ăšă使ç¨ăăŚăˇăăĽăŹăźăă§ăăžăă ăăăŻăăéŁăăăĺŽĺ
¨ć§ăä˝ăăăă誰ăăăăăžăăă
ăăăăŽćŠč˝ăŻăăšăŚč¨čŞăŤä˝ăăčż˝ĺ ăăžăăăăăăăŽćŹ ĺŚăŻĺéżăăăĺŻč˝ć§ăăăăžăďźçă ăăăťăŠăăăăŚćč°ä¸ďźă
ăăăăŁăŚăăăŽĺşćşăŻăGoă§čżäźźăăăă¨ăăă§ăăŞăăăă°ăŠă ă示ăăă¨ă§ăŻăŞăăGoă§ăŚăăŞăłă使ç¨ăăŞăĺ ´ĺăăăăŻăăăŤç°Ąĺăă¤ăŻăŞăźăłăŤč¨čż°ă§ăăăăă°ăŠă ă示ăăă¨ă§ăăă¨ćłĺŽăăŚăăžăă ă§ăăăăăžă 示ăăăŚăăŞăăŽăŻăăă§ăă
@jimmyfrasche
ĺ ąç¨ä˝ĺăŤĺĺäťăăăŁăźăŤăăĺż čŚăŞççąăŻăăăăžăăă ĺĺăŻăĺăăżă¤ăăŽç°ăŞăăăŁăźăŤăăĺşĺĽăăĺ ´ĺăŤăŽăżĺ˝šçŤăĄăžăă ăă ăăăŚăăŞăłăŤĺăăżă¤ăăŽč¤ć°ăŽăăŁăźăŤăăĺŤăăăă¨ăŻă§ăăžăăăăăăŻăžăŁăăćĺłăăŞăăăă§ăă ăăăăŁăŚăĺĺăćă¤ăă¨ăŻĺéˇă§ăăă桡䚹ă¨ăăĺ¤ăăŽĺ ĽĺăŤă¤ăŞăăăžăă
ćŹčłŞçăŤăĺ ąç¨ä˝ăŽăżă¤ăăŻćŹĄăŽăăăŤăŞăăžăă
union {
struct{}
int
err
}
ĺčŞä˝ăŻăć§é ä˝ăŤĺăčžźăžăăĺăčĺĽĺă¨ăăŚä˝żç¨ăăăćšćłă¨é常ăŤăăäźźăăĺ ąç¨ä˝ăŤĺ˛ăĺ˝ăŚăăăăŤä˝żç¨ă§ăăä¸ćăŽčĺĽĺăćäžăăžăă
ăă ăăć示çăŞĺ˛ăĺ˝ăŚăćŠč˝ăăăăăŤăŻăĺĺăŽăŞăĺăăĄăłăăźă¨ăăŚćĺŽăăŚĺ
ąç¨ä˝ĺăä˝ćăăăă¨ăŻă§ăăžăăăăăăŻăć§ćă§ăăŽăăăŞĺźă訹ĺŻăăăăăă§ăă äžďź v.struct{} = struct{}
ăăăăŁăŚăraw structăunionsăfuncsăŞăŠăŽĺăŻăunionăŽä¸é¨ăŤăŞăăĺ˛ăĺ˝ăŚĺŻč˝ăŤăŞăăăăŤăäşĺăŤĺĺăäťăăĺż čŚăăăăžăă ăăăĺżľé ăŤç˝ŽăăŚăăăšăăăăĺ ąç¨ä˝ăŻçšĺĽăŞăăŽă§ăŻăăăžăăăĺ é¨ăŽĺ ąç¨ä˝ăŻĺĽăŽăĄăłăăźăżă¤ăăŤăăăŞăăăă§ăă
ăăŚăăŠăĄăăŽć§ćăčŻăăăăăăžăăă
[union|sum|pick|oneof] {
type1
package1.type2
....
}
ä¸č¨ăŻăăŁă¨äźźăŚăăăăăŤčŚăăžăăăăăŽăăăŞăżă¤ăăŤăŻĺ°ăĺéˇă§ăă
ä¸ćšă type1 | package1.type2
ăŻăé常ăŽgoăżă¤ăăŽăăăŤăŻčŚăăŞăĺ ´ĺăăăăžăăăă|ăă使ç¨ăăĺŠçšăăăăžăă 丝ăŤORă¨ăăŚčŞčăăăč¨ĺˇă ăăăŚăăăăŻä¸ĺŻč§ŁăŤăŞăăă¨ăŞăĺéˇć§ăć¸ăăăžăă
@urandomăŻăăăżă°ĺăăăŞăăă¤ăłăżăźăă§ăźăšă訹ĺŻăăŚăăĺ ´ĺăčż˝ĺ ăŽăă§ăăŻă§ĺč¨ăinterface{}
ćăăăăžăăžăă 1ă¤ăŽăăŽăĺ
Ľăăăă¨ăă§ăăăăč¤ć°ăŽćšćłă§ăăăĺăĺşăăă¨ăă§ăăăŽă§ăăăăăŻĺč¨ĺă§ăŻăŞăăŞăăžăă ăżă°ĺă使ç¨ăăă¨ăăăăăŻĺč¨ĺăŤăŞăăăăăžăăăŽăŞăă¤ăłăżăźăă§ă¤ăšăäżćă§ăăžăă
ăă ăăăżă°ĺăŻăă¤ăłăżăźăă§ă¤ăš{}ăŽĺéĄă ăă§ăŞăĺ¤ăăŽĺéĄă俎垊ăăžăă ăăăăŻăżă¤ăăăŻăăăŤéćłăŽăăăŤĺ°ăŞăăăĺşĺĽăăăăă ăăŤăżă¤ăăŽćăçşćăăĺż čŚăŞăăŤăăšăŚăčŻăăăŤć示çăŤăăžăă ăććăŽă¨ăăăć示çăŞĺ˛ăĺ˝ăŚă¨ĺăŞăăŠăŤă使ç¨ă§ăăžăă
1ă¤ăŽăżă¤ăăŤč¤ć°ăŽăżă°ăäťăăăă¨ăă§ăăăŽăçšĺž´ă§ăă éŁçśăăŚçşçăăćĺăžăăŻĺ¤ąćăŽć°ă渏ĺŽăăăżă¤ăăć¤č¨ăăŚăă ăăďź1ĺăŽćĺă§NĺăŽĺ¤ąćăăăŁăłăťăŤăăăăăŽéăĺć§ă§ăďźă
type Counter union {
Successes, Failures uint
}
ĺż čŚăŞăżă°ĺăŞă
type (
Success uint
Failures uint
Counter Successes | Failures
)
ăăăŚĺ˛ăĺ˝ăŚăŻćŹĄăŽăăăŤăŞăăžăc = Successes(1)
ăŽäťŁăăăŤc.Successes = 1
ă ăăŞăăŻăăžăĺžăžăăă
ĺĽăŽäžăŻăăăźăŤăŤăžăăŻăŞă˘ăźăăŽé厳ă襨ăăżă¤ăă§ăă ăżă°ĺă使ç¨ăăă¨ăăăăă˘ăăŤĺăăăŽăŻç°Ąĺă§ăă
type Failure union {
Local, Remote error
}
ă¨ăŠăźăŽćçăŻăĺŽéăŽă¨ăŠăźăä˝ă§ăăăăŤé˘äżăŞăăăżă°ĺă§ćĺŽă§ăăžăă ăżă°ĺăăŞăă¨ăĺč¨ă§ç´ćĽă¤ăłăżăźăă§ăźăšă訹ĺŻăăĺ ´ĺă§ăăăŞă˘ăźăă§ăĺătype Local { error }
ĺż
čŚăŤăŞăăžăă
ăżă°ĺăŻăăŚăăŞăłĺ ă§ăăźăŤăŤăŤă¨ă¤ăŞă˘ăšăżă¤ăăĺĺäťăăżă¤ăăä˝ćăăŞăăăăŞăăŽă§ăă ĺăăżă¤ăăŽč¤ć°ăŽăăżă°ăăćă¤ăă¨ăŻăç§ăŽććĄăŤĺşćăŽăăŽă§ăŻăăăžăăăăăăŻăďźç§ăçĽăŁăŚăăďźăăšăŚăŽé˘ć°ĺč¨čŞăčĄăăă¨ă§ăă
ă¨ăŻăšăăźăăăăăżă¤ăăŤĺŻžăăŚă¨ăŻăšăăźăăăăŚăăŞăăżă°ăä˝ćăăćŠč˝ăăăăłăăŽéăŽćŠč˝ăčĺłćˇąă塼复ă§ăă
ăžăăăżă°ă¨ăżă¤ăăŽă˘ăľăźăˇă§ăłăĺĺĽăŤč¨ĺŽăăă¨ă1čĄăŽăŠăăăźă使ç¨ăăŚĺ ąćăĄă˝ăăăăŚăăŞăłăŤăăă˘ăźăă§ăăăŞăŠăăăă¤ăăŽčĺłćˇąăăłăźăăĺŻč˝ăŤăŞăăžăă
ăăăĺźă辡ăăăăăĺ¤ăăŽĺéĄă解湺ăăăăšăŚăăăăăžăçľăżĺăăăăăăŤćăăăžăă ćŁç´ăŞă¨ăăăăăăć¸ăăă¨ăăŻăăăăăăžăăă§ăăăăĺč¨ăGoăŤçľąĺăăéăŽăăšăŚăŽĺéĄă解湺ăăĺŻä¸ăŽćšćłă§ăăă¨ăžăăžă確俥ăăăăăŤăŞăăžăăă
ăăăăăăăćĄĺźľăăăăăŤăç§ăŤă¨ăŁăŚăŽăăć°ă辡ăăăăäžăŻio.Reader | io.ReadCloser
ă ăżă°ăŽăŞăă¤ăłăżăźăă§ăźăšă訹ĺŻăăžăăăăăŻio.Reader
ă¨ĺăăżă¤ăă§ăă
ReadCloserăćżĺ ĽăăăŞăźăăźă¨ăăŚĺźăĺşăăă¨ăă§ăăžăă ăăŞăăŻAă夹ăăžă| BăŻăĺč¨ăżă¤ăăŽAăžăăŻBăăăăăŁăćĺłăăžăă
ăăŞăăŻćă
ĺăćąăăŤă¤ăăŚçšĺŽăăĺż
čŚăăăĺ ´ĺăŻio.ReadCloser
ă¨io.Reader
ăŠăăăźć§é ä˝@bcmillsăććăăăăăŤăä˝ćăăĺż
čŚăăăăžătype Reader struct { io.Reader }
ăŞăŠă¨ç¨ŽéĄăăăăă¨ćăŁăŚăăžăReader | ReadCloser
ă
ĺč¨ăäşăăŤç´ ăŞăĄă˝ăăăťăăăćă¤ă¤ăłăżăźăă§ă¤ăšăŤĺśéăăĺ ´ĺă§ăă1ă¤ăŽăżă¤ăă§č¤ć°ăŽă¤ăłăżăźăă§ă¤ăšăĺŽčŁ ă§ăăăăăăăŽĺéĄăçşçăăžăă ĺč¨ăżă¤ăăŽć示ć§ă夹ăăăžăăăAăžăăŻBăă§ăŻăăăžăăăăAăžăăŻBăăžăăŻĺ ´ĺăŤăăŁăŚăŻăŠăĄăă弽ăăŞćšăă§ăă
ăăăŤćŞăăă¨ăŤăăăăăŽăżă¤ăăäťăŽăăăąăźă¸ăăăŽăăŽă§ăăĺ ´ĺăAăBă¨ĺăăăăŤćąăăăŞăăăăŤăăă°ăŠă ăé常ăŤćł¨ć桹ăć§çŻăăă¨ăăŚăăć´ć°ĺžăŤçŞçśç°ăŞăĺä˝ăăăĺŻč˝ć§ăăăăžăă
ăă¨ăă¨ç§ăŻĺéĄă解湺ăăăăăŤă¤ăłăżăźăă§ăźăšăçŚć˘ăăăă¨ăć¤č¨ăăžăăă 誰ăăăăŤćşčśłăăŚăăžăăă§ăăďź ăăăăăăăŻăžăă a = b
ăăăŞĺéĄăĺăé¤ăăă¨ăŻă§ăăžăăă§ăăăăăăŻăaă¨băŽăżă¤ăăŤăăŁăŚç°ăŞăăă¨ăćĺłăăžăă ăžăăăżă¤ăăŽĺ˛ăĺ˝ăŚĺŻč˝ć§ăćŠč˝ăăă¨ăăŤăăăăŻă§ăŠăŽăżă¤ăăé¸ćăăăăŤă¤ăăŚĺ¤ăăŽăŤăźăŤăĺż
čŚă§ăăă ăăăŻăăăăăŽéćłă§ăă
ăżă°ăčż˝ĺ ăăă¨ăăăăŻăăšăŚăŞăăŞăăžăă
union { R io.Reader | RC io.ReadCloser }
ă使ç¨ăăă¨ăăăăçăŤăăŞăŁăŚăăĺ ´ĺăŻăăăŽReadCloserăăŞăźăăźă¨čŚăŞăăŚăťăăă¨ć示çăŤč¨ăăă¨ăă§ăăžăă ăŠăăăźăżă¤ăăŻĺż
čŚăăăžăăă ăăăŻĺŽçžŠăŤćéťăŽăăĄăŤĺŤăžăăŚăăžăă ăżă°ăŽăżă¤ăăŤé˘äżăŞăăăŠăĄăăăŽăżă°ă§ăă
ćŹ çšăŻăäťăŽĺ ´ćăăio.Readerăĺĺžăăĺ ´ĺăchan receiveăžăăŻfuncĺźăłĺşăăč¨ăă¨ăăăăio.ReadCloseră§ăăĺŻč˝ć§ăăăăioă§assertă¨ĺ Ľĺăăĺż čŚăăăéŠĺăŞăżă°ăŤĺ˛ăĺ˝ăŚăĺż čŚăăăăă¨ă§ăă ReadCloseră¨ăăšăă ăăăăăăăŤăăŁăŚăăă°ăŠă ăŽćĺłăăŻăăăŤć確ăŤăŞăăžăăă¤ăžăăćŁç˘şăŤč¨ăă¨ăăłăźăăŤăăăžăă
ăžăăăżă°ă˘ăľăźăˇă§ăłăŻăżă¤ăă˘ăľăźăˇă§ăłă¨ăŻç°ăŞăăăăćŹĺ˝ăŤć°ăŤăăăio.Readerăĺż čŚăŞĺ ´ĺăŻăăżă°ăŤé˘äżăŞăăăżă¤ăă˘ăľăźăˇă§ăłă使ç¨ăăŚăăăĺźăĺşăăă¨ăă§ăăžăă
ăăăŻăăăăĄăăŽäžăăŚăăŞăł/ĺč¨ăŞăŠăŞăă§GoăŤéłč¨łăăăăăŽăăšăă¨ăăŠăźăă§ăă ăăăŻăăăăćčŻăŽäžă§ăŻăăăžăăăăăăăăŠăŽăăăŤčŚăăăă確čŞăăăăăŤä˝żç¨ăăăăŽă§ăă
ăăăŻăăăéç¨çăŞćšćłă§ăťăăłăăŁăŻăšă示ăăžăăăăăŻăććĄăŽç°Ąć˝ăŞçŽćĄć¸ăăăăç解ăăăăă§ăăăă
ćĺĺ¤ćăŤăŻăăŞăăŽĺŽĺćăăăăŽă§ăç§ăŻé常ăçš°ăčżăăŤă¤ăăŚăŽăĄă˘ăäťăăŚăăăă¤ăăŽăĄă˝ăăăŽćĺăŽă¤ăłăšăżăłăšăŽăżăč¨čż°ăăžăăă
çľĺććĄă¨ä¸çˇăŤčĄăďź
type fail union { //zero value: (Local, nil)
Local, Remote error
}
func (f fail) Error() string {
//Could panic if local/remote nil, but assuming
//it will be constructed purposefully
return f.(error).Error()
}
type U union { //zero value: (A, "")
A, B, C string
D, E int
F fail
}
//in a different package
func create() pkg.U {
return pkg.U{D: 7}
}
func process(u pkg.U) {
switch u := u.[type] {
case A:
handleA(u) //undefined here, just doing something with unboxed value
case B:
handleB(u)
case C:
handleC(u)
case D:
handleD(u)
case E:
handleE(u)
case F:
switch u := u.[type] {
case Local:
log.Fatal(u)
case Remote:
log.Printf("remote error %s", u)
retry()
}
}
}
çžĺ¨ăŽGoăŤéłč¨łďź
ďźéłč¨łă¨ä¸č¨ăŽéăăŤă¤ăăŚăŽćł¨č¨ăĺŤăžăăŚăăžăďź
const ( //simulates tags, namespaced so other packages can see them without overlap
Fail_Local = iota
Fail_Remote
)
//since there are only two tags with a single type this can
//be represented precisely and safely
//the error method on the full version of fail can be
//put more succinctly with type embedding in this case
type fail struct { //zero value (Fail_Local, nil) :)
remote bool
error
}
// e, ok := f.[Local]
func (f *fail) TagAssertLocal2() (error, bool) { //same for TagAssertRemote2
if !f.remote {
return nil, false
}
return f.error, true
}
// e := f.[Local]
func (f *fail) TagAssertLocal() error { //same for TagAssertRemote
if !f.remote {
panic("invalid tag assert")
}
return f.error
}
// f.Local = err
func (f *fail) SetLocal(err error) { //same for SetRemote
f.remote = false
f.error = err
}
// simulate tag switch
func (f *fail) TagSwitch() int {
if f.remote {
return Fail_Remote
}
return Fail_Local
}
// f.(someType) needs to be written as f.TypeAssert().(someType)
func (f *fail) TypeAssert() interface{} {
return f.error
}
const (
U_A = iota
U_B
// ...
U_F
)
type U struct { //zero value (U_A, "", 0, fail{}) :(
kind int //more than two types, need an int
s string //these would all occupy the same space
i int
f fail
}
//s, ok := u.[A]
func (u *U) TagAssertA2() (string, bool) { //similar for B, etc.
if u.kind == U_A {
return u.s, true
}
return "", false
}
//s := u.[A]
func (u *U) TagAssertA() string { //similar for B, etc.
if u.kind != U_A {
panic("invalid tag assert")
}
return u.s
}
// u.A = s
func (u *U) SetA(s string) { //similar for B, etc.
//if there were any pointers or reference types
//in the union, they'd have to be nil'd out here,
//since the space isn't shared
u.kind = U_A
u.s = s
}
// special case of u.F.Local = err
func (u *U) SetF_Local(err error) { //same for SetF_Remote
u.kind = U_F
u.f.SetLocal(err)
}
func (u *U) TagSwitch() int {
return u.kind
}
func (u *U) TypeAssert() interface{} {
switch u.kind {
case U_A, U_B, U_C:
return u.s
case U_D, U_E:
return u.i
}
return u.f
}
//in a different package
func create() pkg.U {
var u pkg.U
u.SetD(7)
return u
}
func process(u pkg.U) {
switch u.TagSwitch() {
case U_A:
handleA(u.TagAssertA())
case U_B:
handleB(u.TagAssertB())
case U_C:
handleC(u.TagAssertC())
case U_D:
handleD(u.TagAssertD())
case U_E:
handleE(u.TagAssertE())
case U_F:
switch u := u.TagAssertF(); u.TagSwitch() {
case Fail_Local:
log.Fatal(u.TagAssertLocal())
case Fail_Remote:
log.Printf("remote error %s", u.TagAssertRemote())
}
}
}
@jimmyfrasche
ăŚăăŞăłăŤăŻĺăăżă¤ăăŽăżă°ăĺŤăžăăŚăăăăă揥ăŽć§ćăŽćšăéŠăăŚăăă¨ăŻéăăžăăă
func process(u pkg.U) {
switch v := u {
case A:
handleA(v) //undefined here, just doing something with unboxed value
case B:
handleB(v)
case C:
handleC(v)
case D:
handleD(v)
case E:
handleE(v)
case F:
switch w := v {
case Local:
log.Fatal(w)
case Remote:
log.Printf("remote error %s", w)
retry()
}
}
}
ç§ăŽčŚćšă§ăŻăăšă¤ăăă¨ä¸çˇăŤä˝żç¨ăăă¨ăĺ ąç¨ä˝ăŻintăstringăŞăŠăŽĺă¨é常ăŤăăäźźăŚăăžăă 丝ăŞéăăŻăĺč ăŽăżă¤ăă¨ăŻĺŻžç §çăŤăăăăŤĺ˛ăĺ˝ăŚăăă¨ăă§ăăăŽăŻćéăŽăĺ¤ăăŽăżă§ăăăăšă¤ăăčŞä˝ăçś˛çž çă§ăăă¨ăăăă¨ă§ăă ăăăăŁăŚăăăŽĺ ´ĺăçšĺĽăŞć§ćăŽĺż čŚć§ăŻĺŽéăŤăŻăăăăžăăăăăăŤăăăéçşč ăŽç˛žçĽçăŞä˝ćĽăčť˝ć¸ăăăžăă
ăžăăăăŽććĄăŽä¸ă§ăŻăăăŽăăăŞăłăźăăŻćĺšă§ăăăăďź
type Foo union {
// Completely different types, no ambiguity
A string
B int
}
func Bar(f Foo) {
switch v := f {
....
}
}
....
func main() {
// No need for Bar(Foo{A: "hello world"})
Bar("hello world")
Bar(1)
}
@urandomĺŻč˝ăŞéăăć˘ĺăŽGoć§ćă¨ăŽéĄäźźć§ă使ç¨ăăŚăťăăłăăŁăŻăšăĺć ăăć§ćăé¸ćăăžăăă
ăăŞăăăăăă¨ăă§ăăă¤ăłăżăźăă§ăźăšăżă¤ăă§
var i someInterface = someValue //where someValue implements someInterface.
var j someInterface = i //this assignment is different from the last one.
ĺĽç´ăćşăăăăŚăăéăă someValue
ăŽăżă¤ăăŻé˘äżăŞăăŽă§ăăăăŻĺéĄăŞăć確ă§ăă
ăŚăăŞăłăŤăżă°â ăĺ°ĺ Ľăăă¨ăăăăžăăŤăŞăăă¨ă
çšăŤăłăźăăŽĺ¤ć´ăŤăăŁăŚăăŽçšćŽăŞăąăźăšăç°ĄĺăŤçĄĺšăŤăŞăăă¨ăŤăăćťăŁăŚăăšăŚăŽăłăźăăć´ć°ăăĺż
čŚăăăĺ ´ĺăŻçšăŤăăšăăăăăšăăăă§ăăăă¨ăŤăŻćĺłăăăăžăăă C int
ăFoo
čż˝ĺ ăăăĺ ´ĺăFoo / BarăŽäžă使ç¨ăăăŤăŻă Bar(1)
ăĺ¤ć´ăăĺż
čŚăăăăžăăă Bar("hello world")
ăŻĺ¤ć´ăăžăăă ăăăťăŠä¸čŹçă§ăŻăŞăçśćłă§ăăă¤ăăŽăăźăšăăăźăŻăçŻç´ăăăăăŤăăšăŚăč¤éăŤăŞăăćŚĺżľăăăŽăăăŤčŚăăăă¨ăăăă°ăăăŽăăăŤčŚăăăă¨ăăăăăăćŚĺżľăç解ăăŤăăăŞăăžăăăăŽäžżĺŠăŞăăăźăăŁăźăăĺç
§ăăŚăăŠăĄăăĺ˝ăŚăŻăžăăă確čŞăăŚăă ăăă
â ç§ăŻăăăăŽăăčŻăĺĺăăăă°ăăăŽăŤă¨ćăăžăă ăă§ăŤstructăżă°ăăăăžăă ç§ăŻăăăăăŠăăŤă¨ĺźăă§ăăă§ăăăăăGoăŤăăăăăăăăžăă ăăăăăăŁăźăŤăă¨ĺźăśăă¨ăŻăăăéŠĺă§ăăăćă桡䚹ăăŚăăăăăŤćăăăžăă 誰ăăăă¤ăŻăˇă§ăăăăăăăŞăăăăăŻćŹĺ˝ăŤć°éŽŽăŞăłăźăă使ăăă¨ăă§ăăžăă
ăăćĺłă§ăăżă°äťăĺ ąç¨ä˝ăŻă¤ăłăżăźăă§ăźăšă¨ăăăăăć§é ä˝ăŤäźźăŚăăžăă ăăăăŻăä¸ĺşŚăŤ1ă¤ăŽăăŁăźăŤăăăč¨ĺŽă§ăăŞăçšĺĽăŞç¨ŽéĄăŽć§é ä˝ă§ăă ăăŽčŚłçšăăčŚăă¨ăFoo / BarăŽäžăŻćŹĄăŽăăăŤăŞăăžăă
type Foo struct {
A string
B int
}
func Bar(f Foo) {...}
func main() {
Bar("hello world") //same as Bar(Foo{A: "hello world", B: 0})
Bar(1) //same as Bar(Foo{A: "", B: 1})
}
ăăŽĺ ´ĺăŻć確ă§ăăăăăăŻčŻăčăă§ăŻăŞăă¨ćăăžăă
ăžăăććĄă§ăŻăćŹĺ˝ăŤăăźăšăăăźăŻăäżĺăăăĺ ´ĺăŻăć確ăŞĺ ´ĺăŤBar(Foo{1})
ă訹ĺŻăăăžăă ăŚăăŞăłă¸ăŽăă¤ăłăżăćă¤ăă¨ăă§ăăăŽă§ă &Foo{"hello world"}
ăŻč¤ĺăŞăăŠăŤć§ćăĺźăçśăĺż
čŚă§ăă
ă¨ăŻč¨ăăăŽăŽăăŚăăŞăłăŻăăăăŁăźăŤăăăçžĺ¨č¨ĺŽăăăŚăăĺçăżă°ăćăŁăŚăăă¨ăăçšă§ăă¤ăłăżăźăă§ăźăšă¨éĄäźźăăŚăăžăă
switch v := u.[type] {...
switch v := i.(type) {...
ăă¤ăłăżăźăă§ă¤ăšăŽu.[union]
ăŤăăĺż
čŚăăăăăăăăžăăăăăŠăĄăăŽćšćłă§ăć§ćăŻăăăťăŠéăăŞăăćĺłăć確ă§ăă
.(type)
ăŻä¸čŚă§ăăă¨ăăĺăč°čŤăăăăă¨ăă§ăăžăăăç§ăŽćčŚă§ăŻăä˝ă辡ăăŁăŚăăăŽăă常ăŤćŁç˘şăŤććĄăăŚăăăăăăĺŽĺ
¨ăŤćŁĺ˝ĺăăăŚăăăă¨ăăăăăžăă
ăăăăăăăŽé¸ćăŽčĺžăŤăăç§ăŽççąă§ăăă
@jimmyfrasche
ăăŞăăŽčŞŹćăŽĺžă§ăăswitchć§ćăŻç§ăŤăŻĺ°ăç´ćăŤĺăăŚăăăăă§ăă ă¤ăłăżăźăă§ă¤ăšă使ç¨ăăă¨ă switch v := i.(type) {...
ăŻăăšă¤ăăăąăźăšă§ăŞăšăăăă .(type)
示ăăăăăăŤăĺŻč˝ăŞăżă¤ăăĺăćżăăžăă
ăă ăăăŚăăŞăłă使ç¨ăăă¨ăăšă¤ăăăŻĺŻč˝ăŞăżă¤ăă§ăŻăŞăĺ¤ăĺăćżăăžăă ăăăăăŽăąăźăšăŻç°ăŞăĺŻč˝ăŞĺ¤ă襨ăăŚăăăĺ¤ăŻĺŽéăŤăŻĺăăżă¤ăăĺ
ąćăăŚăăĺŻč˝ć§ăăăăžăă ăăăŻćĺĺăintăšă¤ăăăŤäźźăŚăăăăąăźăšăŤăĺ¤ăăŞăšăăăăăăăăŽć§ćăŻĺç´ăŞswitch v := u {...
ă§ăă ăăŽăă¨ăăăintăstringăŽĺ ´ĺăăăăąăźăšăŻäźźăŚăăžăăăăăĺśéçă§ăăăăăăŚăăŞăłăŽĺ¤ăĺăćżăăăŽăswitch v := u { ...
ăŤăŞăăŽăŻčŞçśăŞăă¨ăŽăăăŤćăăžăă
@urandomăŻăć§ćăŽé常ăŤčŻăçšă§ăă çĺŽăŻăăăăăŠăăŤăŽăŞăç§ăŽäťĽĺăŽććĄăăăŽĺźăçśăă§ăăă¨ăăăă¨ă§ăăăăă§ăăăŻĺ˝ćăŽăżă¤ăă§ăăă ä˝ăčăăăŤăăżăăăŤăłăăźăăžăăă ăććăăă ăăăăă¨ăăăăăžăă
switch u {...
ĺăă ăăăăă¨ăŽĺéĄswitch v := u {...
ăăăăŻăăžăăŤăĺ¤ăăŽăăăŤčŚăăă§switch v := f(); v {...
ďźă¨ăŠăźĺ ąĺăăăĺ°éŁ-ăŞăć確ăŞćĺłăăăä˝ăăă¨ăŤăŞăăžăďźă
@asăŤăăŁăŚććĄăăăŚăăăăăŤunion
ăăźăŻăźăăŽĺĺăpick
ăŤĺ¤ć´ăăăĺ ´ĺăăżă°ăšă¤ăăăŻswitch u.[pick] {...
ăžăăŻswitch v := u.[pick] {...
ă¨č¨čż°ă§ăă寞称ć§ăäżăăăžăăăżă¤ăăšă¤ăăäťăă§ăăă桡䚹ă夹ăăăăŞăčŚć ăăăăžăă
ĺŽčŁ ăintăăŞăłăŤĺăćżăăŚăăĺ ´ĺă§ăăĺçăżă°ă¨ăăŞăă¤ăă¸ăŽăăăŻăŽćéťçăŞĺ解ăăăăžăăăăăŻăććłčŚĺăŤé˘äżăŞăăć示çă§ăăĺż čŚăăăă¨ćăăžăă
ăĺçĽăŽă¨ăăăăżă°ăăŁăźăŤăăĺźăłĺşăăŚăăăŁăźăŤăă˘ăľăźăă¨ăăŁăźăŤăăšă¤ăăăŤăăă ăă§ăé常ăŤçăŤăăŞăŁăŚăăžăă
硨éďźăăăŻăăăŻă§ăŞăăŹăŻăă使ç¨ăăăŽăŻĺäťă§ăă
[ĺżçăé ăăŚăăżăžăă-ç§ăŻäźćă§ä¸ĺ¨ă§ăă]
@ianlancetaylorăŻć¸ăăďź
ç§ăăăŞăăŽććĄăŤčŚăŞăä˝ăăăç§ăăĄăăăăăăŞăăă°ăŞăăŞăççąă§ăă ć°ăă税éĄăŽăżă¤ăăčż˝ĺ ăăăă¨ăŤăŻćăăăŞćŹ çšăăăăžăăăăăŻăGoăŤĺžĺăăăăšăŚăŽäşşăĺŚă°ăŞăăă°ăŞăăŞăć°ăăćŚĺżľă§ăă čŁĺăŽĺŠçšăŻä˝ă§ăăďź çšăŤăć°ăă税éĄăŽăżă¤ăăŻăă¤ăłăżăźăă§ă¤ăšăżă¤ăăăăŻĺžăăăŞăăăŽăç§ăăĄăŤä¸ăăžăăďź
ç§ăčŚă2ă¤ăŽä¸ťăŞĺŠçšăăăăžăă 1ă¤çŽăŻăč¨čŞăŽĺŠçšă§ăă 2ă¤çŽăŻăăăăŠăźăăłăšä¸ăŽĺŠçšă§ăă
ăĄăăťăźă¸ăĺŚçăăă¨ăăçšăŤä¸ŚčĄăăăťăšăăčŞăżĺăĺ ´ĺăĺăĄăăťăźă¸ăŤăŻé˘éŁăăăăăăłăŤčŚäťśăäź´ăĺŻč˝ć§ăăăăăăĺ俥ă§ăăăĄăăťăźă¸ăŽĺŽĺ ¨ăŞăťăăăçĽăăă¨ăă§ăăă¨é常ăŤäžżĺŠă§ăă çšĺŽăŽăăăăłăŤă§ăŻăĺŻč˝ăŞăĄăăťăźă¸ăżă¤ăăŽć°ăŻé常ăŤĺ°ăŞăĺ ´ĺăăăăžăăăăĄăăťăźă¸ă襨ăăăăŤăŞăźăăłă¨ăłăă¤ăłăżăźăă§ă¤ăšă使ç¨ăăĺ ´ĺăăăŽä¸ĺ¤ćĄäťśăŻć確ă§ăŻăăăžăăă ĺ¤ăăŽĺ ´ĺăăăăĺéżăăăăăŤăĄăăťăźă¸ăżă¤ăăă¨ăŤç°ăŞăăăŁăăŤă使ç¨ăăžăăăăăăŤăŻçŹčŞăŽăłăšăăäź´ăăžăă
čăăăăć˘çĽăŽăĄăăťăźă¸ăżă¤ăăĺ°ć°ăăăăăăăŤăăă¤ăłăżăĺŤăžăăŚăăŞăĺ ´ĺăăăăžăă ăŞăźăăłă¨ăłăăŽă¤ăłăżăźăă§ăźăšă使ç¨ăăŚăăăă襨ăĺ ´ĺăă¤ăłăżăźăă§ăźăšĺ¤ăä˝ćăăăăăŽĺ˛ăĺ˝ăŚăčĄăĺż čŚăăăăžăă ĺŻč˝ăŞăĄăăťăźă¸ăżă¤ăăĺśéăăăżă¤ăă使ç¨ăăăă¨ăŻăĺéżă§ăăăă¨ăćĺłăăGCăŽăăŹăăˇăŁăźăčť˝ć¸ăăăăŁăăˇăĽăŽĺąćć§ăéŤăăžăă
ĺč¨ăżă¤ăă解湺ă§ăăç§ăŤă¨ăŁăŚăŽçšĺŽăŽčŚçăŻgodocă§ăă ast.Spec
ăäžăŤă¨ăŁăŚăżăžăăăďź //golang.org/pkg/go/ast/#Spec
ĺ¤ăăŽăăăąăźă¸ăŻăĺĺäťăă¤ăłăżăźăă§ă¤ăšăżă¤ăăŽĺŻč˝ăŞĺşăŤăŞăăżă¤ăăćĺă§ăŞăšăăăăăăăŚăźăśăźăŻăłăźăăčŚăăăĺĺăŽăľăăŁăăŻăšăăăŹăăŁăăŻăšăŤäžĺăăăăăăă¨ăŞăăăă°ăăă˘ă¤ăă˘ăĺžăăă¨ăă§ăăžăă
č¨čŞăăăšăŚăŽĺŻč˝ăŞĺ¤ăăă§ăŤçĽăŁăŚăăĺ ´ĺăăăăŻiotasă使ç¨ăăĺćĺăŽăăăŤgodoc
ă§čŞĺĺă§ăăžăă ăžăăĺăŞăĺšłćă§ăŻăŞăăĺŽéăŤĺăŤăŞăłăŻăăăă¨ăă§ăăžăă
硨éďźĺĽăŽäžďź https ďź
@mvdanăŻăč¨čŞăĺ¤ć´ăăăŤGo1ăŽăšăăźăŞăźăćšĺăăăăăŽĺŞăăĺŽç¨çăŞăă¤ăłăă§ăă ăăŽăăăŤĺĽăŽĺéĄăćĺşăăăăăĺç §ă§ăăžăăďź
çłă訳ăăăžăăăăgodocăăźă¸ĺ ăŽäťăŽĺĺă¸ăŽăŞăłăŻă ăăĺç §ăăŚăăžăăăăăă§ăćĺă§ăŞăšăăăŚăăžăăďź
çłă訳ăăăžăăăăăăŁă¨ć確ăŤăăšăă§ăăă
godocăŽçžĺ¨ăŽăăăąăźă¸ă§ĺŽçžŠăăăŚăăă¤ăłăżăźăă§ăźăšăĺŽčŁ ăăăżă¤ăăčŞĺçăŤĺŚçăăăăăŽćŠč˝ăŞăŻă¨ăšăăćĺłăăžăăă
ďźćĺă§ăŞăšăăăăĺĺăăŞăłăŻăăăăăŽćŠč˝čŚćąăăŠăăăŤăăă¨ćăăžăăăçžćçšă§ăŻăăăć˘ăćéăăăăžăăďźă
ăăŽďźăă§ăŤé常ăŤéˇăďźăšăŹăăăĺźăçśăăă¨ăŻćăžăŞăăŽă§ăĺĽăŽĺéĄăä˝ćăăžăă-ä¸č¨ăĺç §ăăŚăă ăăă
@Merovius ASTăŽăăŽăŻĺćĺăăăĺč¨ăżă¤ăăŤĺ¤ăéŠç¨ăăăăăăăăŽĺˇă§ăŻhttps://github.com/golang/go/issues/19814#issuecomment-298833986ăŤčżäżĄăăŚă
ăžăăĺč¨ăżă¤ăăGoăŤĺąăăŚăăăăŠăăăăăăŞăăă¨ăçš°ăčżăčż°ăšăăă¨ćăăžăă ç§ăŻăžă 彟ăă羜寞ăŤĺąăăŚăăŞăăă¨ăčŞĺčŞčşŤăŤç´ĺžăăăŚăăžăăă ç§ăŻă彟ăăă˘ă¤ăă˘ăć˘ćąăăăăăăéŠĺăăăăŠăăă確čŞăăăăăŤăăăăă¨ăă䝎ĺŽăŽä¸ă§ĺăăŚăăžăă ăăăăç§ăŻăŠăĄăăŽćšćłă§ă確俥ăăă¤ăăă§ăă
揥ăŤăăłăĄăłăă§ćŽľéçăŞăłăźă俎垊ăŤă¤ăăŚč¨ĺăăžăăă ĺč¨ăżă¤ăăŤć°ăăç¨čŞăčż˝ĺ ăăăă¨ăŻăĺŽçžŠä¸ăă¤ăłăżăźăă§ă¤ăšăŤć°ăăăĄă˝ăăăčż˝ĺ ăăăăć§é ä˝ăăăăŁăźăŤăăĺé¤ăăăăăăŽă¨ĺăăăăŤăé大ăŞĺ¤ć´ă§ăă ăăăăăăăŻćŁăăăŚćăžăăĺä˝ă§ăă
ć°ăă税éĄăŽăăźăăčż˝ĺ ăăăăăźăă¤ăłăżăźăă§ă¤ăšă§ĺŽčŁ ăăăASTăŽäžăčăăŚăżăžăăăă ASTăĺ¤é¨ăăă¸ă§ăŻăă§ĺŽçžŠăăăŚăăăăăăăăă¸ă§ăŻăĺ ăŽăăăąăźă¸ăŤă¤ăłăăźăăăă¨ăăžăăăăăŤăăăASTăăŚăŠăźăŻăăăžăă
ăăă¤ăăŽăąăźăšăăăăžăďź
ă¤ăłăżăźăă§ă¤ăšăăźăšăŽASTă§ăŻăăąăźăš2.1.1ăŽăżăćŁăăćŠč˝ăăžăă ăăăŻä˝ăăăĺśçśă§ăă 掾éçăŞăłăźă俎垊ăŻćŠč˝ăăžăăă ASTăŻăăŽăăźă¸ă§ăłăăăłăăăĺż čŚăăăăăłăźăăŻăăŽăăźă¸ă§ăłăăăłăăăĺż čŚăăăăžăă
ĺžšĺşçăŞăŞăłăżăźăŻĺ˝šăŤçŤăĄăžăăăăŞăłăżăźăŻăăšăŚăŽă¤ăłăżăźăă§ă¤ăšăżă¤ăăć¤ćťă§ăăăăă§ăŻăŞăăăăçšĺŽăŽă¤ăłăżăźăă§ă¤ăšăăă§ăăŻăăĺż čŚăăăăă¨ăä˝ăăăŽćšćłă§äźăăĺż čŚăăăăžăă ăăăŻăă˝ăźăšĺ ăŽăłăĄăłăăžăăŻăŞăă¸ăăŞĺ ăŽăă税ăŽč¨ĺŽăăĄă¤ăŤăćĺłăăžăă ă˝ăźăšĺ ăŽăłăĄăłăăŽĺ ´ĺăĺŽçžŠä¸ăASTăŻĺĽăŽăăă¸ă§ăŻăă§ĺŽçžŠăăăŚăăăăăçś˛çž ć§ăă§ăăŻăŽăăăŤă¤ăłăżăźăă§ă¤ăšăŤăżă°ăäťăăăŽăŻăăŽăăă¸ă§ăŻăăŤçżťĺźăăăžăă ăăăŻăăłăăĽăăăŁĺ ¨ä˝ăĺćăă常ăŤä˝żç¨ăăĺä¸ăŽçś˛çž ć§ăŞăłăżăźăăăĺ ´ĺăŤăŽăżĺ¤§čŚć¨ĄăŤćŠč˝ăăžăă
ĺč¨ăăźăšăŽASTă§ăŻăăăźă¸ă§ăłçŽĄçă使ç¨ăăĺż čŚăăăăžăă ăăŽĺ ´ĺăŽĺŻä¸ăŽéăăŻăçś˛çž ć§ăŞăłăżăźăăłăłăă¤ăŠăźăŤçľăżčžźăžăăŚăăăă¨ă§ăă
ăŠăĄăă2.2ăŤăŻĺ˝šçŤăĄăžăăăăä˝ăă§ăăă§ăăăăďź
ĺč¨ăżă¤ăă彚çŤă¤ăăăĺç´ăŞASTéŁćĽăŽăąăźăšăăăăžăďźăăźăŻăłă ăăĺç´ăŞéťĺç¨ăŽĺĺĽč§Łćăăă°ăŠă ăä˝ćăăŚăăă¨ăăžăă ĺ¤ăé˘éŁäťăăăăŚăăŞă*
ăăăŞăăźăŻăłă¨ăĺĺă襨ăćĺĺăćă¤Var
ăăăŞăăźăŻăłăăăăłfloat64ăäżćăăVal
ăăăŞăăźăŻăłăăăăžăă ă
ăăăŻă¤ăłăżăźăă§ăźăšă§ĺŽčŁ ă§ăăžăăăé˘ĺă§ăă ăă ăăăăăă揥ăŽăăăŞăă¨ăăăžăă
package token
type Type int
const (
Times Type = iota
// ...
Var
Val
)
type Value struct {
Type
Name string // only valid if Type == Var
Number float64 // only valid if Type == Val
}
iotaăăźăšăŽĺćĺăŽĺžšĺşçăŞăŞăłăżăźăŻăä¸ćŁăŞTypeă使ç¨ăăăŞăăăăŤăăăă¨ăă§ăăžăăăType == TimesăŽĺ ´ĺăŻNameăŤĺ˛ăĺ˝ăŚăType == VarăŽĺ ´ĺăŻNumberă使ç¨ăăäşşăŤĺŻžăăŚăŻăăžăăăžăćŠč˝ăăžăăă ăăźăŻăłăŽć°ă¨ç¨ŽéĄăĺ˘ăăăŤă¤ăăŚăăăăŻćŞĺăăă ăă§ăă ăăă§ă§ăăćĺăŽăă¨ăŻăăăšăŚăŽĺśç´ăăă§ăăŻăăăĄă˝ăăValid() error
ă¨ăăă¤ä˝ăă§ăăăă誏ćăăä¸éŁăŽăăăĽăĄăłăăčż˝ĺ ăăăă¨ă§ăă
ĺč¨ăżă¤ăăŻăăăăăšăŚăŽĺśç´ăç°ĄĺăŤă¨ăłăłăźăăăĺŽçžŠăŻĺż čŚăŞăăšăŚăŽăăăĽăĄăłăăŤăŞăăžăă ć°ăă税éĄăŽăăźăŻăłăčż˝ĺ ăăăă¨ăŻé大ăŞĺ¤ć´ăŤăŞăăžăăăASTăŤă¤ăăŚç§ăč¨ăŁăăă¨ăŻăăšăŚăăă§ăĺ˝ăŚăŻăžăăžăă
ăăŁă¨ĺˇĽĺ ˇăĺż čŚă ă¨ćăăžăă ç§ăŻăăă§ĺĺă ă¨ăŻç˘şäżĄăăŚăăžăăă
@jimmyfrasche
揥ăŤăăłăĄăłăă§ćŽľéçăŞăłăźă俎垊ăŤă¤ăăŚč¨ĺăăžăăă ĺč¨ăżă¤ăăŤć°ăăç¨čŞăčż˝ĺ ăăăă¨ăŻăĺŽçžŠä¸ăă¤ăłăżăźăă§ă¤ăšăŤć°ăăăĄă˝ăăăčż˝ĺ ăăăăć§é ä˝ăăăăŁăźăŤăăĺé¤ăăăăăăŽă¨ĺăăăăŤăé大ăŞĺ¤ć´ă§ăă
ăăăăĺçă§ăŻăăăžăăă 掾éç俎垊ă˘ăăŤă§ăăăăŽĺ¤ć´ăŽä¸ĄćšăčĄăăă¨ăă§ăăžăďźă¤ăłăżăźăă§ă¤ăšăŽĺ ´ĺďź1ăăăšăŚăŽĺŽčŁ ăŤć°ăăăĄă˝ăăăčż˝ĺ ăăžăă2ăă¤ăłăżăźăă§ă¤ăšăŤăĄă˝ăăăčż˝ĺ ăăžăăć§é ä˝ăăŁăźăŤăăŽĺ ´ĺďź1ăăăŁăźăŤăăŽăăšăŚăŽä˝żç¨ćłăĺé¤ăăžăă2ăăăŁăźăŤăăĺé¤ăăžăďźă ĺč¨ăżă¤ăă§ăąăźăšăčż˝ĺ ăăăă¨ăŻă掾éç俎垊ă˘ăăŤă§ăžăăă ćĺăŤlibăčż˝ĺ ăăă¨ăăăšăŚăŽăŚăźăśăźăĺŽĺ ¨ăŤăă§ăăŻăăŞăăŞăăăăăăšăŚăŽăŚăźăśăźăç ´ćăăžăăăć°ăăăąăźăšăăžă ĺĺ¨ăăŞăăăăćĺăŤăŚăźăśăźăŤčż˝ĺ ăăăă¨ăŻă§ăăžăăă ĺăĺ¤ăăŤă¤ăăŚăĺăăă¨ăč¨ăăžăă
ăăăé大ăŞĺ¤ć´ă§ăăăăŠăăă§ăŻăŞăăćĺ°éăŽä¸ćă§čŞżć´ă§ăăé大ăŞĺ¤ć´ă§ăăăăŠăăă§ăă
ăăăăăăăŻćŁăăăŚćăžăăĺä˝ă§ăă
ä¸ĺşŚă ĺč¨ăżă¤ăăŻăăăŽĺŽçžŠă¨äşşă ăăăăăĺż čŚă¨ăăăăšăŚăŽççąăŤăăă掾éçăŞăłăźă俎垊ăŽă˘ă¤ăă˘ă¨ć šćŹçăŤäşćć§ăăăăžăăă
ă¤ăłăżăźăă§ă¤ăšăăźăšăŽASTă§ăŻăăąăźăš2.1.1ăŽăżăćŁăăćŠč˝ăăžăă
ăăăăăăăŻăąăźăš1.2ďźčŞčăăăŞăććłăŽăăăŤĺŽčĄćăŤĺ¤ąćăăăă¨ăŻĺŽĺ ¨ăŤĺéĄăăăžăăăç§ăŻćăăăăăăŻăŤăŞăăăăŞăă§ăăăăăă¨ăŠăźăčżăă ăă§ăďźă¨2.1ăŽĺ¤ăăŽăąăźăšă§ăćŁăăćŠč˝ăăžăă ćŽăăŻăă˝ăăăŚă§ă˘ăŽă˘ăăă°ăŹăźăăŤé˘ăăĺşćŹçăŞĺéĄă§ăă ăŠă¤ăăŠăŞăŤć°ăăćŠč˝ăčż˝ĺ ăăĺ ´ĺăăŠă¤ăăŠăŞăŽăŚăźăśăźăŻăăăĺŠç¨ăăăăăŤăłăźăăĺ¤ć´ăăĺż čŚăăăăžăă ăă ăăă˝ăăăŚă§ă˘ăćŁăăăŞăă¨ăăćĺłă§ăŻăăăžăăă
ASTăŻăăŽăăźă¸ă§ăłăăăłăăăĺż čŚăăăăăłăźăăŻăăŽăăźă¸ă§ăłăăăłăăăĺż čŚăăăăžăă
ăăŞăăč¨ăŁăŚăăăă¨ăăăăăăăŠăŽăăăŤçśăăŽăăç§ăŤăŻăžăŁăăăăăăžăăă ç§ăŤă¨ăŁăŚăăăăŽć°ăăććłăŻăžă ăăšăŚăŽăăźăŤă§ćŠč˝ăăăăă§ăŻăăăžăăăăăłăłăă¤ăŠăźăŻĺŠç¨ă§ăăžăăă¨č¨ăŁăŚăĺéĄăăăžăăă ăăăŽć°ăăććłă§ăăŽăăźăŤăĺŽčĄăăă¨ăĺŽčĄćăŤĺ¤ąćăăăăŽă¨ĺăăăăŤĺéĄăăăžăăă ććŞăŽĺ ´ĺăăăăŻćŽľéçăŞäżŽĺžŠăăăťăšăŤĺĽăŽăšăăăăčż˝ĺ ăăă ăă§ăăaďźć°ăăăăźăăASTăăăąăźă¸ă¨ăăźăľăźăŤčż˝ĺ ăăžăă bďźASTăăăąăźă¸ă使ç¨ăăŚăăźăŤă俎ćŁăăć°ăăăăźăăĺŠç¨ăăžăă cďźć°ăăăăźăă使ç¨ăăăăăŤăłăźăăć´ć°ăăžăă ăŻăăć°ăăăăźăăŻăaďźă¨bďźăĺŽäşăăĺžăŤăŽăżä˝żç¨ĺŻč˝ăŤăŞăăžăă ăă ăăăăŽăăăťăšăŽăăšăŚăŽăšăăăă§ăç ´ćăăăă¨ăŞăăăăšăŚăćŁĺ¸¸ăŤăłăłăă¤ăŤăăăłĺä˝ăăžăă
柸é˛çăŞăłăźă俎垊ă¨ĺžšĺşçăŞăłăłăă¤ăŠăă§ăăŻăŽăŞăä¸çă§ăăăŞăăčŞĺçăŤĺ ć°ăŤăŞăă¨č¨ăŁăŚăăăŽă§ăŻăăăžăăă ăăă§ă注ć桹ăč¨çťă¨ĺŽčĄăĺż čŚă§ăăăăăăăçśćăăăŚăăŞăéäžĺé˘äżăĺŁăăăžăŁăăă§ăăŞăĺ¤ć´ăăăăăăăăžăăďźç§ăŻä˝ăčăăăăžăăăďźă ăă ăăĺ°ăŞăă¨ăaďźćŽľéçăŞă˘ăăă°ăŹăźăăăšăăăăbďźăăăŤăăŁăŚĺŽčĄćăŤăăźăŤăç ´ćăăăăŠăăăŽćąşĺŽăŻăăăźăŤăŽä˝ćč ăŤäťťăăăŚăăžăă 彟ăăŻćŞçĽăŽĺ ´ĺăŤä˝ăăăšăăăćąşăăăă¨ăă§ăăžăă
ĺžšĺşçăŞăŞăłăżăźăŻĺ˝šăŤçŤăĄăžăăăăŞăłăżăźăŻăăšăŚăŽă¤ăłăżăźăă§ă¤ăšăżă¤ăăć¤ćťă§ăăăăă§ăŻăŞăăăăçšĺŽăŽă¤ăłăżăźăă§ă¤ăšăăă§ăăŻăăĺż čŚăăăăă¨ăä˝ăăăŽćšćłă§äźăăĺż čŚăăăăžăă
ăŠăăăŚďź ç§ăŻswitchlintâ˘ăŽăăăŽăăăŽç˝°éăŻăăăăŠăŤăăťăąăźăšăŞăăŽăăăăăŽăżă¤ăăŽăšă¤ăăćĺĽăč¨ăăă¨ă丝埾ăăă ăăă çľĺąăŽă¨ăăăăłăźăăŻăŠăŽă¤ăłăżăźăă§ă¤ăšĺŽçžŠă§ăćŠč˝ăăăă¨ăćĺž ăăăăăăćŞçĽăŽĺŽčŁ ă§ćŠč˝ăăăłăźăăăŞăăă¨ăŻăă¨ăŤăăĺéĄăŤăŞăĺŻč˝ć§ăăăăžăă ăŻăăăăŽăŤăźăŤăŤăŻäžĺ¤ăăăăžăăăäžĺ¤ăŻăă§ăŤćĺă§çĄčŚă§ăăžăă
ç§ăŻăăăăăĺŽéăŽĺč¨ĺăăăăăłăłăă¤ăŠăźă§ăăăšăŚăŽĺăšă¤ăăăŻăăăŠăŤăăŽăąăźăšăĺż čŚă¨ăăăŻăă§ăăăăłăłăă¤ăŠăźă§ĺźˇĺśăăăă¨ăŤăăŁă¨äšăčžźăă§ăăă§ăăăă ăăăŻäşşă ăćŞçĽăŽé¸ćăŤç´é˘ăăă¨ăăŤĺ˝źăăŽăłăźăăä˝ăăăšăăăćąşĺŽăăăă¨ăĺŻč˝ăŤăăăăŚĺźˇĺśăăă§ăăăă
ăăăŻă¤ăłăżăźăă§ăźăšă§ĺŽčŁ ă§ăăžăăăé˘ĺă§ăă
čŠăăăăăăŽăŻăăăŁăăŤčľˇăăăŞăĺ ´ĺăŽ1ĺéăăŽä˝ćĽă§ăă ç§ăŤăŻĺéĄăŞăăăă§ăă
ăăăŚFWIWăç§ăŻçžĺ¨ăĺč¨ĺăŽĺžšĺşçăŞăă§ăăŻăŽćŚĺżľăŤĺ寞ăăŚăăă ăă§ăă ăăăăăŽć§é çăŤĺŽçžŠăăăăżă¤ăăŽăăăăăă¨č¨ăăă¨ăŽčż˝ĺ ăăăäžżĺŠăăŤă¤ăăŚăç§ăŻăžă 埡ăćčŚăćăŁăŚăăžăăă
@Merovius掾éçăŞăłăźă俎垊ăŤă¤ăăŚăŽăăŞăăŽĺŞăăçšăŤă¤ăăŚăăăŤčăăĺż čŚăăăăžăă ăăŽéďź
ç§ăŻçžĺ¨ăĺč¨ĺăŽĺžšĺşçăŞăă§ăăŻăŽćŚĺżľăŤĺ寞ăăŚăăă ăă§ăă
ăăăŠăŤăăŽăąăźăšă使ç¨ăăŚăçś˛çž ć§ăă§ăăŻăć示çăŤăŞăăă˘ăŚăă§ăăžăďźăžăăäşĺŽä¸ăăăăŠăŤăă§ăŻăăăăŽäťăăšăŚăăăăä˝ă§ăăăăăŤăăźăăăąăźăšăčż˝ĺ ăăăă¨ă§ăçś˛çž çăă§ăăŻăŤăŞăăžăďźă ăžă é¸ćč˘ăŻăăăžăăăć示çăŤčĄăĺż čŚăăăăžăă
switchlintâ˘ăăăăŠăŤăăąăźăšăŽăŞăăżă¤ăăšă¤ăăăŤă¤ăăŚćĺĽăč¨ăăŽăŻĺéĄăŞăă¨ç§ăŻä¸ťĺźľăăžăă çľĺąăŽă¨ăăăăłăźăăŻăŠăŽă¤ăłăżăźăă§ă¤ăšĺŽçžŠă§ăćŠč˝ăăăă¨ăćĺž ăăăăăăćŞçĽăŽĺŽčŁ ă§ćŠč˝ăăăłăźăăăŞăăă¨ăŻăă¨ăŤăăĺéĄăŤăŞăĺŻč˝ć§ăăăăžăă ăŻăăăăŽăŤăźăŤăŤăŻäžĺ¤ăăăăžăăăäžĺ¤ăŻăă§ăŤćĺă§çĄčŚă§ăăžăă
ăăăŻčĺłćˇąăčăă§ăă ă¤ăłăżăźăă§ă¤ăšă§ăˇăăĽăŹăźăăăăĺč¨ĺă¨const / iotaă§ăˇăăĽăŹăźăăăăĺćĺăŤăăăăăžăăăć˘çĽăŽăąăźăšăčŚéăăăă¨ăŻăăăăžăăăćŞçĽăŽăąăźăšăĺŚçăăŞăăŁăă ăă§ăă ă¨ăŤăăăăăăăăăă§ăă ć¤č¨ďź
switch {
case n < 0:
case n == 0:
case n > 0:
}
năć´ć°ăŽĺ ´ĺďźfloatăŽĺ ´ĺăŻn != n
ăćŹ č˝ăăŚăăžăďźăăăăŻçś˛çž
çă§ăăăĺăŤé˘ăăĺ¤ăăŽć
ĺ ąăă¨ăłăłăźăăăŞăă¨ăăăăŠăŤăăćŹ č˝ăăŚăăăă¨ă示ăăăŠă°ăçŤăŚăćšăç°Ąĺă§ăă 揥ăŽăăăŞĺ ´ĺďź
switch {
case p[0](a, b):
case p[1](a, b):
//...
case p[N](a, b):
}
p[i]
ăa
ă¨b
ăŽăżă¤ăă§ĺĺ¤é˘äżă形ćăăŚăăĺ ´ĺă§ăăăăă訟ćăăăă¨ăŻă§ăăŞăăăăăšă¤ăăăŤăăăŠăŤăăăŞăăă¨ă示ăăăŠă°ăçŤăŚăĺż
čŚăăăăžăăăąăźăšăăăăŻăăăăă§ăšăăă˝ăźăšĺ
ăŽćł¨éăăăŻă¤ăăŞăšăăăegrep -v
é¤ĺ¤ăăăŠăăăźăšăŻăŞăăăăžăăŻp[i]
ă誤ăŁăŚć示ăăăšă¤ăăăŽä¸čŚăŞăăăŠăŤăă§ăăăć˛éťăăăćšćłăćĺłăăžăă
ăăăăŤăăăăăăšăŚăŽçśćłă§ăăăŠăŤăăăŞăăă¨ăŤă¤ăăŚĺ¸¸ăŤä¸ĺšłăč¨ăăăŤăźăăĺăăăĺ ´ĺăĺŽčŁ ăăăŽăŻç°ĄĺăŞăŞăłăżăźă§ăă ăăăăŚgo-corpusă§ĺŽčĄăăĺŽéăŤăŠăăťăŠăă¤ăşăĺ¤ăăăăăăł/ăžăăŻćç¨ă§ăăăă確čŞăăăŽăŻčĺłćˇąăăă¨ă§ăă
䝣ćżăăźăŻăłăŽĺŽčŁ ďź
//Type defined as before
type SimpleToken { Type }
type StringToken { Type; Value string }
type NumberToken { Type; Value float64 }
type Interface interface {
//some method common to all these types, maybe just token() Interface
}
ăăăŤăăăćĺĺă¨ć°ĺ¤ăŽä¸Ąćšăćă¤ăăŽăă SimpleToken
ăžăăŻăăŽéăŽĺă§StringToken
ăä˝ćăăăă¨ă訹ĺŻăăŞăăä¸ćŁăŞăăźăŻăłçść
ăĺŽçžŠăăĺŻč˝ć§ăăŞăăŞăăžăăéăăžăĺć§ă§ăă
ă¤ăłăżăźăă§ă¤ăšă§ăăăčĄăăŤăŻăăăźăŻăłăă¨ăŤ1ă¤ăŽăżă¤ăďź type Plus struct{}
ă type Mul struct{}
ăŞăŠďźăĺŽçžŠăăĺż
čŚăăăăăťă¨ăăŠăŽĺŽçžŠăŻăżă¤ăĺă¨ăžăŁăăĺăă§ăă ä¸ĺşŚăŽĺŞĺă§ăăăă¨ăŞăăăă¨ăăăăŻĺ¤ăăŽä˝ćĽă§ăďźăă ăăăăŽĺ ´ĺăŽăłăźăçćăŤăŻéŠăăŚăăžăďźă
ăăźăŻăłă¤ăłăżăźăă§ă¤ăšăŽăé幤ăă使ç¨ăăŚă訹厚ĺ¤ăŤĺşăĽăăŚăăźăŻăłăŽç¨ŽéĄăĺĺ˛ă§ăăă¨ćăăžăďźăăŽäžă§ăŻăć°ĺ¤ăćĺĺăŞăŠăĺŤăăă¨ăă§ăăăăźăŻăłăŽç¨ŽéĄăč¤ć°ăăă¨ćłĺŽăăŚăăžăďźă
type SimpleToken int //implements token.Interface
const (
Plus SimpleToken = iota
// ...
}
type NumericToken interface {
Interface
Value() float64
nt() NumericToken
}
type IntToken struct { //implements NumericToken, and a FloatToken
type StringToken interface { // for Var and Func and Const, etc.
Interface
Value() string
st() StringToken
}
ă¨ăŤăăăćĺĺăĺŤăžăăĺ ´ĺăŤăŽăżăă¤ăłăżăĺż čŚă¨ăăć§é ä˝ăžăăŻĺč¨ĺă¨ăŻç°ăŞăăĺăăźăŻăłăŻăăŽĺ¤ăŤă˘ăŻăťăšăăăăăŤăă¤ăłăżăŽéăăĺż čŚă¨ăăăă¨ăćĺłăăžăă ăăăăŁăŚăéŠĺăŞăŞăłăżăźă¨godocăŽćšĺăŤăăăăăŽĺ ´ĺăŽĺč¨ăżă¤ăăŽĺ¤§ăăŞăĄăŞăăăŻăéćłăŞçść ă¨ďźăăźăăźăăŽćĺłă§ăŽďźĺ ĽĺăŽéăçŚć˘ăăŞăăĺ˛ăĺ˝ăŚăćĺ°éăŤćăăăă¨ăŤé˘éŁăăŚăăžăăăăăăŻéčŚă§ăŻăŞăăăă§ăă
ăăăŠăŤăăŽăąăźăšă使ç¨ăăŚăçś˛çž ć§ăă§ăăŻăć示çăŤăŞăăă˘ăŚăă§ăăžăďźăžăăäşĺŽä¸ăăăăŠăŤăă§ăŻăăăăŽäťăăšăŚăăăăä˝ă§ăăăăăŤăăźăăăąăźăšăčż˝ĺ ăăăă¨ă§ăçś˛çž çăă§ăăŻăŤăŞăăžăďźă ăžă é¸ćč˘ăŻăăăžăăăć示çăŤčĄăĺż čŚăăăăžăă
ăăăăŁăŚăăŠăĄăăŽćšćłă§ăăĺžšĺşçăŞăă§ăăŻăăŞăăă¤ăłăžăăŻăŞăăă˘ăŚăăăăăé¸ćă§ăăžă:)
ć˘çĽăŽăąăźăšăčŚéăăăă¨ă示ăăŽă§ăŻăŞăăćŞçĽăŽăąăźăšăĺŚçăăŞăăŁăă ăă§ăă
äşĺŽä¸ăăłăłăă¤ăŠăŻăă§ăŤăăă°ăŠă ĺ
¨ä˝ăŽĺćăčĄăŁăŚăăŠăŽă¤ăłăżăźăă§ă¤ăšă§ăŠăŽĺ
ˇčąĄăżă¤ăă使ç¨ăăăŚăăăăĺ¤ćăăŚăăă¨ćăăžăăďź ĺ°ăŞăă¨ăăĺ°ăŞăă¨ăéă¤ăłăżăźăă§ăźăšĺă˘ăľăźăˇă§ăłďźă¤ăžăăă¤ăłăżăźăă§ăźăšĺă§ăŻăŞăĺ
ˇčąĄĺă襨ćăăĺă˘ăľăźăˇă§ăłďźăŽĺ ´ĺăăłăłăă¤ăŤćăŤă¤ăłăżăźăă§ăźăšă§ä˝żç¨ăăăé˘ć°ăăźăăŤăçćăăăă¨ăćĺž
ăăžăă
ăăăăćŁç´ăŞă¨ăăăăăăŻçŹŹä¸ĺçăăč°čŤăăăŚăăăĺŽéăŽĺŽčŁ
ăŤă¤ăăŚăŻăăăăžăăă
ăăăăŤăăăaďźăăă°ăŠă ĺ ¨ä˝ă§ĺŽçžŠăăăĺ ˇä˝çăŞĺăăŞăšăăăbďźĺăšă¤ăăăŤă¤ăăŚăăăŽă¤ăłăżăźăă§ă¤ăšăĺŽčŁ ăăŚăăăăŠăăă§ăăŁăŤăżăŞăłă°ăăăŽăŻé常ăŤç°Ąĺă§ăă ăăŽăăăŞăăŽă使ç¨ăăă¨ăäżĄé źă§ăăăŞăšăăŤăŞăăžăă ç§ăćăăŤă
ç§ăŻĺŽéăŤć示çăŤăŞăăˇă§ăłăč¨čż°ă¨ăăŚäżĄé źć§ăŽéŤăăăă§ăăăăźăŤăć¸ăčžźăăă¨ăă§ăăă¨ç˘şäżĄăăŚ100ďź ă§ăŻăŞăăă ăăŠăç§ăŻăăŞăăäžăŽ90ďź ăăŤăăźăăăă¨ăă§ăăă¨ç˘şäżĄăăŚăăă¨ăăŞăăŻééăăŞăăăăŽĺ¤ăčĄăăăźăŤăć¸ăăă¨ăă§ăăžăćŁăă注éăä¸ăăăăăłăłăă¤ăŠăźďźă¤ăžăăsum-typesăĺŽéăŽĺă§ăŻăŞăăăăŠă°ăăŽăăăŞăłăĄăłăăŤăăžăďźă 確ăăŤăç´ ć´ăăă解湺çă§ăŻăăăžăăă
ă¨ăŤăăăăăăăăăă§ăă ć¤č¨ďź
ăăăŻä¸ĺ Źĺšłă ă¨ćăăžăă ăăŞăăč¨ĺăăŚăăăąăźăšăŻăĺč¨ĺă¨ăŻăžăŁăăé˘äżăăăăžăăă ăăŽăăăŞăăźăŤăăŠăăŤć¸ăăă¨ăăă¨ăăżă¤ăăšă¤ăăă¨ĺźäťăăŽăšă¤ăăăŤĺśéăăžăăăăăăŻĺč¨ăżă¤ăăĺŚçăăăćšćłăŽăăă§ăă
䝣ćżăăźăŻăłăŽĺŽčŁ ďź
ăŞăăăźăŤăźćłă§ăŻăŞăăŽă§ăăďź ăżă¤ăăăŁăźăŤăăŻĺż čŚăăăžăăăă¤ăłăżăźăă§ă¤ăščĄ¨çžăăçĄćă§ĺĺžă§ăăžăă ăăźăŤăźăĄă˝ăăăä˝ĺşŚăçš°ăčżăăă¨ăĺżé ăăŚăăĺ ´ĺ; ă¨ăŻăšăăźăăăăŚăăŞăć§é ä˝{}ăĺŽçžŠăăăăŽăăźăŤăźăĄă˝ăăăćĺŽăăŚĺĺŽčŁ ăŤĺăčžźăżăžăăčż˝ĺ ăłăšăăăźăă§ăăŞăăˇă§ăłăă¨ăŽĺ ĽĺăăĄă˝ăăăăăĺ°ăŞăăŞăăžăă
ă¨ăŤăăăăăăŻĺăăźăŻăłăăăŽĺ¤ăŤă˘ăŻăťăšăăăăăŤăă¤ăłăżăŽéăăĺż čŚă¨ăăăă¨ăćĺłăăžă
ăŻăă ăăăŻćŹĺ˝ăŽăłăšăă ăăç§ăŻăăăĺşćŹçăŤäťăŽĺźć°ăä¸ĺăă¨ăŻćăăžăăă
ăăăŻä¸ĺ Źĺšłă ă¨ćăăžăă
ăăăŻćŹĺ˝ă ă
ç§ăŻćăŁĺăćŠăăăźă¸ă§ăłăä˝ćăăăăăstdlibă§ĺŽčĄăăžăăă switchăšăăźăăĄăłăăăă§ăăŻăăă¨1956ăăăăçşçăă switch {
ăăŠăźă ăăšăăăăăăăăŤĺśéăăă¨ăăăŽăŤăŚăłăăŻ1677ăŤć¸ĺ°ăăžăăăçľćăćĺłăăăăăŠăăă確čŞăăăăăŤăăăăŽĺ ´ćă調ăšăŚăăžăăă
https://github.com/jimmyfrasche/switchlint
確ăăŤćšĺăŽä˝ĺ°ăŻăăăăăăăžăă ăăăťăŠć´çˇ´ăăăŚăăžăăă ăăŤăŞăŻă¨ăšăăŻĺ¤§ćčżă§ăă
ďźćŽăăŻĺžă§čżäżĄăăžăďź
硨éďźééăŁăăăźăŻă˘ăă形ĺź
ăăăŻăăăžă§ăŽăăšăŚăŽďźăăŞăĺăŁăďźčŚç´ă ă¨ćăăžăďźăăăŚç§ăŽ2çŞçŽăŽććĄăéşťčŹçăŤäťŽĺŽăăžăďź
éˇć
çć
1 + 1 + ⯠+ 1
形ĺźăŽĺč¨ăŤăŻćąăăŤăă䝣ćżćĄ
1 + 1 + ⯠+ 1
形ĺźăŽĺč¨ăŽiotaăĺćĺăé˘äżăŞă
掾éçăŞäżŽçăŽĺ ´ĺăăăăŻĺ¤§ăăŞĺéĄă§ăăăĺŻä¸ăŽé¸ćč˘ăŻăĺ¤é¨ăăăąăźă¸ăçś˛çž ć§ăă§ăăŻăăŞăăă˘ăŚăăăăă¨ă ă¨ćăăžăă ăăăŻăäťăŽăăšăŚăŤä¸č´ăăĺ ´ĺă§ăăĺ°ćĽăŽć ĄćŁăŽăżăŤé˘äżăăăä¸čŚăŞăăăăŠăŤăăŽăąăźăšăćă¤ăă¨ăĺćłă§ăŞăăă°ăŞăăŞăăă¨ăćĺłăăžăă ç§ăŻăăăäťćéťăŽăăĄăŤçĺŽă§ăăă¨äżĄăăŚăăžăăăăăŚçšĺŽăăăŽăŤĺĺç°Ąĺă§ăŻăŞăăŤăăŚăă
ăăăąăźă¸ăĄăłăăăăăă揥ăŽăăźă¸ă§ăłă§ăăŽĺč¨ăżă¤ăăŤć°ăăăĄăłăăźăčż˝ĺ ăăäşĺŽă§ăăĺŚçă§ăăăă¨ă確čŞăăŚăă ăăăă¨ăăă˘ăăŚăłăšăăăăswitchlintăăźăŤăĺż čŚăŞăąăźăšăčŚă¤ăăăă¨ăă§ăăžăăăŞăăă˘ăŚăăăăžăă
äťăŽĺ ´ĺăťăŠĺç´ă§ăŻăăăžăăăăăăă§ăăăŞăĺŽčĄĺŻč˝ă§ăă
ĺ¤é¨ă§ĺŽçžŠăăăĺč¨ĺă使ç¨ăăăăă°ăŠă ăä˝ćăăĺ ´ĺăăăăŠăŤăăăłăĄăłăă˘ăŚăăăŚć˘çĽăŽăąăźăšăčŚéăăŚăăŞăăă¨ă確čŞăăăłăăăăăĺăŤăłăĄăłăăĺ¤ăăă¨ăă§ăăžăă ăžăăŻăăăăŠăŤăăăä¸čŚăă§ăăăă¨ăéçĽăăăăźăŤăăăĺŻč˝ć§ăăăăžăăăăăŤăăăăăšăŚăć˘çĽăŤăŞăăćŞçĽăŽăăŽăŤĺŻžăăŚĺ°ćĽăŤăăăŁăŚä˝żç¨ă§ăăăăăŤăŞăăžăă
ĺč¨ĺăăˇăăĽăŹăźăăăă¤ăłăżăźăă§ă¤ăšĺă使ç¨ăăă¨ăăŤăăăăăĺŽçžŠăăăŚăăăăăąăźă¸ăŤé˘äżăŞăăăŞăłăżăźăŤăăçś˛çž ć§ăă§ăăŻăăŞăăă¤ăłăăăă¨ăăžăă
@MeroviusăăŞăăŽbetterSumType() BetterSumType
ăăŞăăŻăŻă¨ăŚăăŻăźăŤă§ăăăăăăŻĺăćżăăĺŽçžŠăăăąăźă¸ă§čĄăăăŞăăă°ăŞăăŞăăă¨ăćĺłăăžăďźăžăăŻăăŞăăŻćŹĄăŽăăăŞăăŽăĺ
Źéăăžă
func CallBeforeSwitches(b BetterSumType) (BetterSumType, bool) {
if b == nil {
return nil, false
}
b = b.betterSumType()
if b == nil {
return nil, false
}
return b, true
}
ăžăăćŻĺĺźăłĺşăăăăŞăłăďźă
ăăă°ăŠă ĺ ăŽăăšăŚăŽăšă¤ăăăçś˛çž çă§ăăăă¨ă確čŞăăăăăŤĺż čŚăŞĺşćşăŻä˝ă§ăăďź
ăăăŻä˝ă§ăă˛ăźă ăŞăŽă§ă犺ăŽă¤ăłăżăźăă§ăźăšăŤăăăă¨ăŻă§ăăžăăă ăăăăŁăŚăĺ°ăŞăă¨ă1ă¤ăŽăĄă˝ăăăĺż čŚă§ăă
ă¤ăłăżăźăă§ă¤ăšăŤă¨ăŻăšăăźăăăăŚăăŞăăĄă˝ăăăăŞăĺ ´ĺăŻăăŠăŽăżă¤ăă§ăĺŽčŁ ă§ăăăăăçś˛çž ć§ăŻĺăšă¤ăăăŽăłăźăŤă°ăŠăăžă§ăŽăăšăŚăŽăăăąăźă¸ăŤäžĺăăžăă ăăăąăźă¸ăă¤ăłăăźăăăăăŽă¤ăłăżăźăă§ă¤ăšăĺŽčŁ ăăŚăăăăăŽĺ¤ăăăăąăźă¸ăŽé˘ć°ăŽ1ă¤ăŤé俥ăăăă¨ăă§ăăžăă ăăŽăăăăăŽé˘ć°ăŽăšă¤ăăăŻăă¤ăłăăźăăľă¤ăŻăŤăä˝ćăăăŤçś˛çž ăăăă¨ăŻă§ăăžăăă ăăăăŁăŚăĺ°ăŞăă¨ă1ă¤ăŽă¨ăŻăšăăźăăăăŚăăŞăăĄă˝ăăăĺż čŚă§ăă ďźăăăŤăŻĺăŽĺşćşăĺŤăžăăžăďźă
ĺăčžźăă¨ăć˘ăăŚăăăăăăăŁăĺ°çĄăăŤăŞăăăăăăăąăźă¸ăŽă¤ăłăăźăżăźăă¤ăłăżăźăă§ă¤ăšăăăăĺŽčŁ ăăăżă¤ăăĺăčžźăžăŞăăăăŤăăĺż čŚăăăăžăă ćŹĺ˝ăŤć´žćăŞăŞăłăżăźăŻăă¨ăłăăăŁăăăăŞăĽăźăä˝ćăăçšĺŽăŽé˘ć°ăĺźăłĺşăăŞăĺ ´ĺăăžăăŻă¨ăłăăăŁăăă¤ăłăżăźăă§ă¤ăšăăăăąăźă¸ăŽAPIĺ˘çăăă¨ăšăąăźăăăăŞăĺ ´ĺăĺăčžźăżăĺéĄăŞăĺ ´ĺăăăăă¨ăčŞčă§ăăĺ ´ĺăăăăžăă
ĺžšĺşçăŤčĄăăŤăŻăă¤ăłăżăźăă§ă¤ăšăŽăźăĺ¤ă渥ăăăŞăăă¨ă確čŞăăăăĺžšĺşçăŞăšă¤ăăă§case nil
ă確čŞăăĺż
čŚăăăăžăă ďźĺžč
ăŽćšăç°Ąĺă§ăăănilăĺŤăăă¨ăăăżă¤ăAăžăăŻăżă¤ăBăžăăŻăżă¤ăCăăŽĺč¨ăănilăžăăŻăżă¤ăAăžăăŻăżă¤ăBăžăăŻăżă¤ăCăăŽĺč¨ăŤĺ¤ăăăăăĺč
ăć¨ĺĽ¨ăăăžăďźă
ă¤ăłăăźăăŽăăŞăźă¨ăăŽăăŞăźĺ ăŽçšĺŽăŽă¤ăłăżăźăă§ă¤ăšăŤĺŻžăăŚăăăăŽăťăăłăăŁăŻăšăć¤č¨źă§ăăăăŞăăˇă§ăłăŽćŠč˝ăĺŤăăăăšăŚăŽćŠč˝ăĺăăăŞăłăżăźăăăă¨ăăžăă
ăăă§ăäžĺé˘äżDăćă¤ăăă¸ă§ăŻăăăăă¨ăăžăăDăŽăăăąăźă¸ăŽ1ă¤ă§ĺŽçžŠăăăă¤ăłăżăźăă§ăźăšăăăăă¸ă§ăŻăă§çś˛çž çă§ăăăă¨ă確čŞăăăă¨ćăăžăă ăăă ă¨ăăžăăăă
揥ăŤăăăă¸ă§ăŻăD 'ăŤć°ăăäžĺé˘äżăčż˝ĺ ăăĺż čŚăăăăžăă D 'ăĺéĄăŽă¤ăłăżăźăă§ă¤ăšăżă¤ăăĺŽçžŠăăăăăąăźă¸ăDăŤă¤ăłăăźăăăăăăăŽăŞăłăżăźă使ç¨ăăŞăĺ ´ĺăĺŽĺ ¨ăŞăšă¤ăăă使ç¨ăăăăăŤäżćăăĺż čŚăŽăăä¸ĺ¤ćĄäťśăç°ĄĺăŤç ´ćŁă§ăăžăă
ăăăŤč¨ăă°ăăĄăłăăăăŞăłăżăźăĺŽčĄăăŚăăăăă§ăŻăŞăăDăĺśçśăŤăŞăłăżăźăééăăă¨ăăžăăăă DăŤă˘ăăă°ăŹăźăăăă¨ăD 'ă¨ĺăăăăç°ĄĺăŤä¸ĺ¤ćĄäťśăç ´ĺŁă§ăăžăă
ăŞăłăżăźăăäťăŻ100ďź çś˛çž çă§ăđăă¨č¨ăŁăŚăăä˝ăăăŞăăŚăĺ¤ć´ă§ăăžăă
ăiotaenumsăăŽçś˛çž ć§ăă§ăăŤăźăŽćšăç°ĄĺăŞăăă§ăă
ăăšăŚăŽtype t u
ă u
ăŻć´ć°ă§ăăă t
ăŻăĺĺĽăŤćĺŽăăăĺ¤ăžăăŻiota
ăăăăă§const
ă¨ăăŚä˝żç¨ăăăžăă u
ĺ¤ăŻăăăăăŽĺŽć°ăŤĺŤăžăăŚăăžăă
ăăźăďź
1 << iota
ăŻăăŻăźăťăăă¨ăăŚćąăăăĺŻč˝ć§ăăăăžăăĺ°ăŞăă¨ăăťă¨ăăŠăŽĺ ´ĺăŻăăćăăžăăăçšăŤăăăĺä˝ăŽčŁć°ăĺă塝ăčż˝ĺ ăŽćĄäťśăĺż
čŚăŤăŞăĺŻč˝ć§ăăăăžăă ĺ˝ĺăŽéăăăăăŻčć
Žăăăžăăăăă¤ăăŽççĽĺ˝˘ăŤă¤ăăŚăŻă min(t)
ĺŽć°ă¨ĺźăłăäťăŽĺŽć°ăŤă¤ăăŚăŻC
ă min(t) <= C
ă¨ĺźăłăĺć§ăŤă max(t)
ăăŽăăăŞĺŽć°ă¨ĺźăłăžăăăăäťăŽĺŽć°ăŽĺ ´ĺă C
ă C <= max(t)
ă
t
ăĺžšĺşçăŤä˝żç¨ăăăăăăŤăăăŤăŻă揥ăŽăă¨ă確čŞăăĺż
čŚăăăăžăă
t
ĺ¤ăŻă常ăŤĺĺäťăĺŽć°ă§ăďźăžăăŻăé˘ć°ĺźăłĺşăăŞăŠăŽçšĺŽăŽć
Łç¨çăŞä˝ç˝Žă§ăŻ0ďźămin(t) <= v <= max(t)
䝼ĺ¤ă§ăŻă t
ă v
ĺ¤ăŽä¸ĺšłçćŻčźăŻăăăžăăăt
ĺ¤ăŻăçŽčĄćźçŽ+
ă /
ăŞăŠă§ăŻä˝żç¨ăăăžăăăçľćămin(t)
ă¨max(t)
éăŤăŻăŠăłăăăăĺ ´ĺăäžĺ¤ăçşçăăĺŻč˝ć§ăăăăžăăç´ĺžăŤt
ăĺŽçžŠăăăăăąăźă¸ăŤĺśéăăĺż
čŚăăăăžăăt
ăžăăŻăăăŠăŤăăŽăąăźăšăŽăăšăŚăŽĺŽć°ăĺŤăžăăŚăăžăăăăă§ăăă¤ăłăăźăăăŞăźĺ ăŽăăšăŚăŽăăăąăźă¸ă確čŞăăĺż čŚăăăăć Łç¨çăŞăłăźăă§çĄĺšăŤăŞăĺŻč˝ć§ăŻä˝ăăŞăăžăăăç°ĄĺăŤçĄĺšăŤăăăă¨ăă§ăăžăă
ç§ăŽç解ă§ăŻăăăăŻăżă¤ăă¨ă¤ăŞă˘ăšă¨ĺć§ăŤăĺ¤ć´ăĺŁăăă¨ăŻăŞăăŽă§ăăŞăGo2ăŽăăăŤăăăäżćăăăŽă§ăăďź
ĺă¨ă¤ăŞă˘ăšăŻăć確ăŞé大ăŞĺ¤ć´ă§ăăć°ăăăăźăŻăźăăĺ°ĺ Ľăăžăăă ăă¤ăăźăŞč¨čŞĺ¤ć´ă§ăăă˘ăŠăăŞă˘ă ăăăăăă§ăăăăŻĺ¤§ăăŞĺ¤ć´ăŤăŞăă§ăăăă ĺć ăăăĺč¨ĺ¤ăĺŚçăăăăăŤăăšăŚăŽăăźăˇăŁăŤ/ă˘ăłăăźăˇăŁăŤăŤăźăăłăćščŻăăă ăă§ăă大ăăŞčŠŚçˇ´ăŤăŞăăžăă
ăżă¤ăă¨ă¤ăŞă˘ăšăŻăĺéżçăăŞăăŁăĺéĄă俎ćŁăăŚăăžăă ĺč¨ĺăŻĺăŽĺŽĺ ¨ć§ăŤĺŠçšăăăăžăăăăăăăŞăăă¨ăŻăˇă§ăźăšăăăăźă§ăŻăăăžăăă
@rogpeppeăŽćĺăŽććĄăŽăăăŞăăŽăćŻćăă1ă¤ăŽďźăă¤ăăźăŞďźăă¤ăłăă ăăăąăźă¸http
ăŤăŻăă¤ăłăżăźăă§ă¤ăšăżă¤ăHandler
ă¨ăăăăĺŽčŁ
ăăé˘ć°ăżă¤ăHandlerFunc
ăžăă çžĺ¨ăé˘ć°ăhttp.Handle
ăŤć¸ĄăăŤăŻăć示çăŤHandlerFunc
ăŤĺ¤ćăăĺż
čŚăăăăžăă http.Handle
䝣ăăăŤăżă¤ăHandlerFunc | Handler
ĺźć°ăĺăĺ
Ľăăĺ ´ĺă HandlerFunc
ç´ćĽĺ˛ăĺ˝ăŚĺŻč˝ăŞäťťćăŽé˘ć°/ăŻăăźă¸ăŁăĺăĺ
Ľăăăă¨ăă§ăăžăă ăŚăăŞăłăŻăĺĺăŽăŞăĺăŽĺ¤ăă¤ăłăżăźăă§ă¤ăšĺăŤĺ¤ćăăćšćłăăłăłăă¤ăŠăŤäźăăĺăăłăă¨ăăŚĺšćçăŤćŠč˝ăăžăă HandlerFunc
ăŻHandler
HandlerFunc
ĺŽčŁ
ăăŚăăăăăăă䝼ĺ¤ăŽĺ ´ĺăĺ
ąç¨ä˝ĺăŻHandler
ăžăŁăăĺăăăăŤĺä˝ăăžăă
@griesemerăŻăĺćĺăšăŹăăhttps://github.com/golang/go/issues/19814#issuecomment -322752526ă§ăŽăłăĄăłăăŤĺżăăŚăăăŽăšăŹăăăŽĺĺăŽç§ăŽććĄhttps://github.com/golang/ go / issues / 19412ďźissuecomment -289588569ăŻăĺč¨ăżă¤ăďźăăšăŚăŁăăăšăżă¤ăŤăŽĺćĺăďźăGoă§ăŠăŽăăăŤćŠč˝ăăĺż čŚăăăăă¨ăăĺéĄăŤĺŻžĺŚăăžăă 彟ăăčĄăăŽăŤĺż čŚăŞčż˝ĺ ăŤăŞăĺ ´ĺăç§ăŻăăăăăăăă¨ćăăžăéăăç§ăŻçĽăăŞăăăç§ăŻĺ˝źăăčż˝ĺ ăăăĺ ´ĺă彟ăăŻčŚăŚăăă ăăă¨ćăăžă/ăăŽăăăŤĺ¤ăăŽăă¨ăćä˝ăăžăă
ăăŽć稿ăŻĺŽĺ ¨ă§ăŻăŞăăăăŽăšăŹăăăŽĺĺžă§ăăăŽăšăŹăăĺ ¨ä˝ăŤčŞŹćăăăăžăăăăăŽăšăŹăăăŻé常ăŤéˇăăŽă§ăăăăăŽçšăçš°ăčżăăăčŚç´ăăăăăŚăăăžăăžăăă
ăżă¤ăăżă°äťăăŽă¤ăłăżăźăă§ă¤ăšăŤăăŁăŚăˇăăĽăŹăźăăăăĺč¨ăżă¤ăăăăăĺăčžźăżăŤăăŁăŚăăăĺéżăăăă¨ă羜寞ăŤă§ăăŞăĺ ´ĺăăăăŻç§ăćăă¤ăăćéŤăŽé˛ĺžĄă§ăďź https ďź
@jimmyfrascheç§ăŻăă°ăăĺăŤăăăć¸ă
ĺĽăŽĺŻč˝ăŞă˘ăăăźăăŻăăă§ăďź https ďź
@rogpeppeăŞăăŹăŻăˇă§ăłă使ç¨ăăĺ ´ĺăŻăăŞăăŹăŻăˇă§ăłă使ç¨ăăŞăăŽăŻăŞăă§ăăďź
ăăăäťăŽĺéĄăŽăłăĄăłăăŤĺşăĽăăŚă2çŞçŽăŽććĄăŽćšč¨çăä˝ćăăžăăă
çšăŤăĺžšĺşçăŞăă§ăăŻăĺé¤ăăžăăă ăă ăăĺč¨ăżă¤ăăăˇăăĽăŹăźăăăăăăŤä˝żç¨ăăăäťăŽGoăżă¤ăç¨ăŤä˝ćă§ăăă¨ăŻćăăŞăăăŽăŽăĺ¤é¨ăŽçś˛çž ć§ăă§ăăŤăźă䝼ä¸ăŽććĄăŤć¸ăčžźăăŽăŻç°Ąĺă§ăă
硨éďźăăăŻĺ¤ăŽĺçăŞĺ¤ăŤĺŻžăăŚassertă¨ĺ ĽĺăăćŠč˝ăĺé¤ăăžăăă ăăăŻăăžăăŤăéćłă§ăăăăăă訹ĺŻăăççąăŻăłăźăçćăŤăăŁăŚăĺć§ăŤćäžăăăžăă
Edit2ďźăăăŻăĺĽăŽăăăąăźă¸ă§ĺŽçžŠăăăŚăăĺ ´ĺăŤăăăŁăźăŤăĺăă˘ăľăźăˇă§ăłă¨ăšă¤ăăă§ăŠăŽăăăŤćŠč˝ăăăăć確ăŤăăžăăă
Edit3ďźĺăčžźăżăŽĺśéă¨ćéťăŽăăŁăźăŤăĺăŽć確ĺ
Edit4ďźăšă¤ăăăŽăăăŠăŤăăć確ăŤăă
ăăăŻăŻăć§ćçăŤć§é ä˝ăŤäźźăč¤ĺĺă§ăă
pick {
A, B S
C, D T
E U "a pick tag"
}
ä¸č¨ă§ăŻă A
ă B
ă C
ă D
ăăăăłE
ăăăăŻăŽăăŁăźăŤăĺă§ăăă S
ă T
ăăăăłU
ăŻăăăăăŽăăŁăźăŤăăŽăăăăăŽăżă¤ăă§ăă ăăŁăźăŤăĺăŻă¨ăŻăšăăźăăăăĺ ´ĺă¨ăăăŞăĺ ´ĺăăăăžăă
ăăăŻăŻăéćĽăŞăă§ăŻĺ帰çă§ăŻăŞăĺ ´ĺăăăăžăă
ćłç
type p pick {
//...
p *p
}
éćł
type p pick {
//...
p p
}
ăăăŻăŽĺăčžźăżăŻăăăžăăăăăăăŻăć§é ä˝ăŤĺăčžźăăă¨ăă§ăăžăă ăăăŻăć§é ä˝ăŤĺăčžźăžăăŚăăĺ ´ĺăăăăŻăŽăĄă˝ăăăŻć§é ä˝ăŤăăă˘ăźăăăăžăăăăăăŻăŽăăŁăźăŤăăŻăăă˘ăźăăăăžăăă
ăăŁăźăŤăĺăŽăŞăăżă¤ăăŻăăżă¤ăă¨ĺăĺĺăŽăăŁăźăŤăăĺŽçžŠăăăăăŽççĽĺ˝˘ă§ăă ďźăăăŻăăżă¤ăăŤĺĺăäťăăŚăăŞăĺ ´ĺăŽă¨ăŠăźă§ăăăă ăăĺĺăT
ă§ăă*T
ăŻäžĺ¤ă§ăďźă
äžăă°ă
type p pick {
io.Reader
io.Writer
string
}
3ă¤ăŽăăŁăźăŤăReader
ă Writer
ăăăăłstring
ăăăăăăăăăŽăżă¤ăăăăăžăă ăăŁăźăŤăstring
ăŻăăŚăăăźăšăšăłăźăĺ
ăŤăăĺ ´ĺă§ăăă¨ăŻăšăăźăăăăŞăăă¨ăŤćł¨ćăăŚăă ăăă
ăăăŻăżă¤ăăŽĺ¤ăŻăĺçăăŁăźăŤăă¨ăăŽăăŁăźăŤăăŽĺ¤ă§ć§ćăăăžăă
ăăăŻăżă¤ăăŽăźăĺ¤ăŻăă˝ăźăšé ăŽćĺăŽăăŁăźăŤăă§ăăăăăŽăăŁăźăŤăăŽăźăĺ¤ă§ăă
ĺăăăăŻăżă¤ăăŽ2ă¤ăŽĺ¤ă a
ă¨b
ăä¸ăăăăĺ ´ĺăăăăŻĺ¤ăŻäťăŽĺ¤ă¨ăăŚĺ˛ăĺ˝ăŚăăă¨ăă§ăăžăă
a = b
ăăăŻĺ ăŽăăŁăźăŤăăŽ1ă¤ăŽăżă¤ăăŽ1ă¤ă§ăăŁăŚăăăăăŻäťĽĺ¤ăŽĺ¤ăĺ˛ăĺ˝ăŚăăă¨ăŻéćłă§ăă
ăăăŻăżă¤ăăŤăŻă常ăŤ1ă¤ăŽĺçăăŁăźăŤăăăăăăžăăă
č¤ĺăŞăăŠăŤć§ćăŻć§é ä˝ăŤäźźăŚăăžăăăčż˝ĺ ăŽĺśéăăăăžăă ă¤ăžăăăăźăŹăšăŞăăŠăŤăŻĺ¸¸ăŤçĄĺšă§ăăăćĺŽă§ăăăăźăŻ1ă¤ă ăă§ăă
䝼ä¸ăćĺšă§ă
pick{A string; B int}{A: "string"} //value is (B, "string")
pick{A, B int}{B: 1} //value is (B, 1)
pick{A, B string}{} //value is (A, "")
ăłăłăă¤ăŤćăŽă¨ăŠăźăŻćŹĄăŽă¨ăăă§ăă
pick{A int; B string}{A: 1, B: "string"} //a pick can only have one value at a time
pick{A int; B uint}{1} //pick composite literals must be keyed
ăżă¤ăpick {A int; B string}
ăŽĺ¤p
ăä¸ăăăăĺ ´ĺă揥ăŽĺ˛ăĺ˝ăŚ
p.B = "hi"
p
ăŽĺçăăŁăźăŤăăB
ăă B
ăăhiăăŤč¨ĺŽăăžăă
çžĺ¨ăŽĺçăăŁăźăŤăăŤĺ˛ăĺ˝ăŚăă¨ăăăŽăăŁăźăŤăăŽĺ¤ăć´ć°ăăăžăă ć°ăăĺçăăŁăźăŤăăč¨ĺŽăăĺ˛ăĺ˝ăŚă§ăŻăćĺŽăăăŚăăŞăăĄă˘ăŞä˝ç˝ŽăăźăăŤăăĺż čŚăăăăžăă ăăăŻăăŁăźăŤăăŽăăăŻăăŁăźăŤăăžăăŻć§é ä˝ăăŁăźăŤăă¸ăŽĺ˛ăĺ˝ăŚăŻăĺż čŚăŤĺżăăŚĺçăăŁăźăŤăăć´ć°ăžăăŻč¨ĺŽăăžăă
type P pick {
A, B image.Point
}
var p P
fmt.Println(P) //{A: {0 0}}
p.A.X = 1 //A is the dynamic field, update
fmt.Println(P) //{A: {1 0}}
p.B.Y = 2 //B is not the dynamic value, create zero image.Point first
fmt.Println(P) //{B: {0 2}}
ăăăŻăŤäżćăăăŚăăĺ¤ăŤăŻăăăŁăźăŤăă˘ăľăźăăžăăŻăăŁăźăŤăăšă¤ăăă§ăŽăżă˘ăŻăťăšă§ăăžăă
x := p.[X] //panics if X is not the dynamic field of p
x, ok := p.[X] //returns the zero value of X and false if X is not the dynamic field of p
switch v := p.[var] {
case A:
case B, C: // v is only defined in this case if fields B and C have identical type names
case D:
default: // always legal even if all fields are exhaustively listed above
}
ăăŁăźăŤăă˘ăľăźăˇă§ăłăăăłăăŁăźăŤăăšă¤ăăăŽăăŁăźăŤăĺăŻăăżă¤ăăŽăăăăăŁă§ăăăĺŽçžŠăăăăăăąăźă¸ă§ăŻăăăžăăă pick
ăĺŽçžŠăăăăăąăźă¸ĺă§äżŽéŁžăăăă¨ăŻă§ăăžăăăăžăă俎飞ăăăă¨ăă§ăăžăăă
ăăăŻćĺšă§ăďź
_, ok := externalPackage.ReturnsPick().[Field]
ăăăŻçĄĺšă§ăďź
_, ok := externalPackage.ReturnsPick().[externalPackage.Field]
ăăŁăźăŤăă˘ăľăźăˇă§ăłă¨ăăŁăźăŤăăšă¤ăăăŻă常ăŤĺçăăŁăźăŤăăŽĺ¤ăŽăłăăźăčżăăžăă
ă¨ăŻăšăăźăăăăŚăăŞăăăŁăźăŤăĺăŻăĺŽçžŠăăăąăźă¸ă§ăŽăżă˘ăľăźăă§ăăžăă
ăżă¤ăă˘ăľăźăˇă§ăłă¨ăżă¤ăăšă¤ăăăăăăŻă§ćŠč˝ăăžăă
//removed, see note at top
//v, ok := p.(fmt.Stringer) //holds if the type of the dynamic field implements fmt.Stringer
//v, ok := p.(int) //holds if the type of the dynamic field is an int
ăżă¤ăă˘ăľăźăˇă§ăłă¨ăżă¤ăăšă¤ăăăŻă常ăŤĺçăăŁăźăŤăăŽĺ¤ăŽăłăăźăčżăăžăă
ăăăŻăă¤ăłăżăźăă§ă¤ăšăŤć źç´ăăăŚăăĺ ´ĺăă¤ăłăżăźăă§ă¤ăšăŽĺă˘ăľăźăˇă§ăłăŻăăăăŻčŞä˝ăŽăĄă˝ăăăťăăă¨ăŽăżä¸č´ăăžăă [ä¸č¨ăŻĺé¤ăăăăăăăžă çĺŽă§ăăĺéˇă§ă]
ăăăŻăŽăăšăŚăŽăżă¤ăăçĺźćźçŽĺăăľăăźăăăŚăăĺ ´ĺă揥ăŽăăăŤăŞăăžăă
==
ĺ ´ĺăĺăăăăŻăŽ2ă¤ăŽĺ¤ăŻ==
ă§ăă!=
ăŽĺ¤ăăăĺ ´ĺă§ăă ==
ăăăăŻăżă¤ăăŽĺ¤ă§ăŻăäťăŽćźçŽĺăŻăľăăźăăăăŚăăžăăă
P
ĺ
ăŽăăŁăźăŤăĺă¨ăăŽăżă¤ăăŽăťăăăăăŁăźăŤăĺă¨ăăŽăżă¤ăăŽăľăăťăăă§ăăĺ ´ĺăăăăŻăżă¤ăP
ăŽĺ¤ăĺĽăŽăăăŻăżă¤ăQ
ĺ¤ćă§ăăžăă Q
ăžăă
P
ă¨Q
ăç°ăŞăăăăąăźă¸ă§ĺŽçžŠăăăŚăăŚăă¨ăŻăšăăźăăăăŚăăŞăăăŁăźăŤăăăăĺ ´ĺăăăăăŽăăŁăźăŤăăŻĺĺă¨ăżă¤ăăŤé˘äżăŞăç°ăŞăă¨čŚăŞăăăžăă
äžďź
type P pick {A int; B string}
type Q pick {B string; A int; C float64}
//legal
var p P
q := Q(p)
//illegal
var q Q
p := P(Q) //cannot handle field C
2ă¤ăŽăăăŻăżă¤ăéăŽĺ˛ăĺ˝ăŚĺŻč˝ć§ăŻă1ă¤ă ăăŽăżă¤ăăĺŽçžŠăăăŚăăéăăĺ ćć§ă¨ăăŚĺŽçžŠăăăžăă
ăĄă˝ăăăŻăĺŽçžŠăăăăăăŻăżă¤ăă§ĺŽŁč¨ă§ăăžăă
ă¨ăŻăšăăŞă¨ăłăšăŹăăźăăä˝ćďźăăăłwikiăŤčż˝ĺ ďźăăžăăhttps://gist.github.com/jimmyfrasche/ba2b709cdc390585ba8c43c989797325
硨éďźă¨ďźheartďź @mewmewăŤăăăŽčŚçšă¸ăŽčżäżĄă¨ăăŚăăŻăăăŤĺŞăă芳細ăŞăŹăăźăăćŽăăžăă
çšĺŽăŽĺT
ăŤă¤ăăŚăĺT
ĺ¤ćăăăăĺT
ĺ¤ć°ăŤĺ˛ăĺ˝ăŚăăă§ăăĺăŽăŞăšăăč¨ăćšćłăăăă¨ăăăăŠăă§ăăăăă äžăă°
type T interface{} restrict { string, error }
T
ă¨ăăĺĺăŽçŠşăŽă¤ăłăżăźăă§ă¤ăšăżă¤ăăĺŽçžŠăăăăăŤĺ˛ăĺ˝ăŚăăăĺŻč˝ć§ăŽăăăżă¤ăăŻstring
ăžăăŻerror
ăžăă äťăŽăżă¤ăăŽĺ¤ăĺ˛ăĺ˝ăŚăăă¨ăăă¨ăăłăłăă¤ăŤćă¨ăŠăźăçşçăăžăă äťç§ăŻč¨ăăă¨ăă§ăăžă
func FindOrFail(m map[int]string, key int) T {
if v, ok := m[key]; ok {
return v
}
return errors.New("no such key")
}
func Lookup() {
v := FindOrFail(m, key)
if err, ok := v.(error); ok {
log.Fatal(err)
}
s := v.(string) // This type assertion must succeed.
}
ăăŽç¨ŽăŽă˘ăăăźăă§ăŻăĺč¨ăżă¤ăďźăžăăŻăăăŻăżă¤ăďźăŽăŠăŽéčŚăŞčŚç´ ăćşăăăăŞăă§ăăăăďź
s := v.(string) // This type assertion must succeed.
v
ănil
ăŞăĺŻč˝ć§ăăăăăăăăăŻĺłĺŻăŤăŻĺ˝ăŚăŻăžăăžăăă ăăŽĺŻč˝ć§ăćé¤ăăăŤăŻăč¨čŞăŤăăŞă大ăăŞĺ¤ć´ăĺ ăăĺż
čŚăăăăžăăăăăŻăăźăĺ¤ăćăăŞăĺă¨ăăăŤäź´ăăăšăŚăŽăăŽăĺ°ĺ
Ľăăăă¨ăćĺłăăăăă§ăă ăźăĺ¤ăŻč¨čŞăŽä¸é¨ăĺç´ĺăăžăăăăăăăŽç¨ŽéĄăŽćŠč˝ăŽč¨č¨ăăăĺ°éŁăŤăăžăă
čĺłćˇąăăă¨ăŤăăăŽă˘ăăăźăăŻ@rogpeppeăŽćĺăŽććĄă¨ăăŞăäźźăŚăăžăă ăăăćăŁăŚăăŞăăŽăŻăăŞăšăăăăăżă¤ăă¸ăŽĺźˇĺśă§ăăăăăŻăĺăŤććăăăăăŞçśćłďź http.Handler
ďźă§ĺ˝šçŤă¤ĺŻč˝ć§ăăăăžăă ăă1ă¤ăŽăă¨ăŻăăăŞă˘ăłăăŻĺĺĽăŽăżă°ă§ăŻăŞăăżă¤ăăŤăăŁăŚĺşĺĽăăăăăăĺăăŞă˘ăłăăĺĺĽăŽăżă¤ăă§ăăĺż
čŚăăăăă¨ă§ăă ăăăŻĺłĺŻăŤčĄ¨çžĺăăăă¨ćăăžăăăăăŞă˘ăłăăżă°ă¨ăżă¤ăăĺşĺĽăăăă¨ă弽ăäşşăăăžăă
@ianlancetaylor
ăă
çć
A + B + C
ăŻăĺŽéăŤăŻ1 + A + B + C
ă§ăăăé¸ćăŽä˝ĺ°ăŻăăăžăăă @stevenblenkinsopăç§ăăăăŤĺăçľăă§ăăéăŤććăăăăăŤăp
ăžăăŻ*p
ăé¸ćăăŚăăĄă˘ăŞăŽăăŹăźăăŞăăăăç´°ăăĺśĺžĄă§ăăžăă ćéŠĺă¨ăăŚďźCăŽćĺłă§ďźčĺĽăăăĺ
ąç¨ä˝ă¨ăăŚăăăăĺŽčŁ
ăăăă¨ăŻă§ăăžăăă§ăăăT
ăĄă˝ăăăĺŽçžŠă§ăăžăătype T restrict {string, error}
ă ăă§ăŻăăăžăăďźio.Reader
ăĺ
ĽăăŚă io.Writer
ĺźăĺşăăă¨ăă§ăăžăă ăăăŻďźĺśéăŽăŞăďźă¤ăłăżăźăă§ăźăšăŤăŻćĺłăăăăžăăăĺč¨ĺăŤăŻćĺłăăăăžăăăerror
ĺ˛ăĺ˝ăŚĺŻč˝ăŞăăŽăĺ˛ăĺ˝ăŚăăă¨ăă§ăăŞăă¨č¨ăŁăŚăăă¨čŞăă§ăăžăT
ă¸ăŽĺ¤ćăŻćŁç˘şăŤă¨ăŠăźă§ăăĺż
čŚăăăăžăďźăăăăŻč¨ăŁăŚăăăăăŻä¸ťčŚăŞăăăŻăšďźç§ăăŞăšăăăćĺăŽ2ă¤ăŽăăďźăăă§ăăŻăăžăăăăăŚăăăç§ăĺžăăă¨ăă§ăăăăšăŚă§ăăăŞăă°ăç§ăŻăăăăăźăăăźăă§ĺăĺăăžăă ăăăăç§ăŻăăŁă¨čŻăăŞăăă¨ăéĄăŁăŚăăžăă
ĺă˘ăľăźăˇă§ăłăŤăźăŤăéŠç¨ăăăŚăăă¨äťŽĺŽăăžăăă ăăăăŁăŚăăżă¤ăăŻĺ
ˇčąĄăżă¤ăă¨ĺä¸ă§ăăăăă¤ăłăżăźăă§ăźăšăżă¤ăăŤĺ˛ăĺ˝ăŚĺŻč˝ă§ăăĺż
čŚăăăăžăă ĺşćŹçăŤăŻăă¤ăłăżăźăă§ă¤ăšă¨ăžăŁăăĺăăăăŤćŠč˝ăăžăăăĺ¤ďź nil
ďźăŻăăŞăšăăăăŚăăăżă¤ăăŽĺ°ăŞăă¨ă1ă¤ăŤĺŻžăăŚă˘ăľăźăĺŻč˝ă§ăăĺż
čŚăăăăžăă
@jimmyfrasche
ć´ć°ăăăććĄă§ăŻăăżă¤ăăŽăăšăŚăŽčŚç´ ăç°ăŞăăżă¤ăă§ăăĺ ´ĺă揥ăŽĺ˛ăĺ˝ăŚăĺŻč˝ă§ăăăăă
type p pick {
A int
B string
}
func Foo(P p) {
}
var P p = 42
var Q p = "foo"
Foo(42)
Foo("foo")
ăăŽăăăŞĺ˛ăĺ˝ăŚăĺŻč˝ăŞĺ ´ĺăŽĺč¨ăżă¤ăăŽä˝żăăăăăŻăŻăăăŤĺ¤§ăăăŞăăžăă
ăăăŻććĄă使ç¨ăăă¨ă
p
ăžăăŻ*p
ăé¸ćăăŚăăĄă˘ăŞăŽăăŹăźăăŞăăăăç´°ăăĺśĺžĄă§ăăžăă
ă¤ăłăżăźăă§ă¤ăšăăšăŤăŠăźĺ¤ăć źç´ăăăăăŤĺ˛ăĺ˝ăŚăççąăŻăäťăŽăŻăźăăăă¤ăłăżă§ăăăăŠăăăĺ¤ćăăăăăŤăżă¤ăăŻăźăăčŞăżĺăĺż
čŚăăŞăăăă§ăă č°čŤăŤă¤ăăŚăŻďź8405ăĺç
§ăăŚăă ăăă ĺăĺŽčŁ
ä¸ăŽčć
Žäşé
ăăăăŻăżă¤ăăŤăĺ˝ăŚăŻăžăĺŻč˝ć§ăăăăžăăăăăŻăĺŽéăŤăŻă p
ĺ˛ăĺ˝ăŚăăăăăăăŤăăéăăźăŤăŤăŤăŞăăă¨ăćĺłăăĺ ´ĺăăăăžăă
@urandomăăăăăăŞăăŽĺŽçžŠăčăăă¨ăăăăŻć¸ăăăŞăăă°ăŞăăŞăă§ăăă
var p P = P{A: 42} // p := P{A: 42}
var q P = P{B: "foo")
Foo(P{A: 42}) // or Foo({A: 42}) if types can be elided here
Foo(P{B: "foo"})
ăăăăŻăä¸ĺşŚăŤ1ă¤ăŽăăŁăźăŤăăăč¨ĺŽă§ăăŞăć§é ä˝ă¨čăăăŽăćĺă§ăă
ăăăăŞăă C uint
ăp
čż˝ĺ ăăă¨ă p = 42
ăŠăăŞăăžăăďź
é ĺşă¨ĺ˛ăĺ˝ăŚĺŻč˝ć§ăŤĺşăĽăăŚĺ¤ăăŽăŤăźăŤăä˝ćă§ăăžăăăăăăăŻĺ¸¸ăŤăĺĺŽçžŠă¸ăŽĺ¤ć´ăĺă使ç¨ăăăăšăŚăŽăłăźăăŤĺžŽĺŚă§ĺçăŞĺ˝ąéżăä¸ăăĺŻč˝ć§ăăăăă¨ăćĺłăăžăă
ćčŻăŽĺ ´ĺăĺ¤ć´ăŻăăăžăăăŽćŹ ĺŚăŤäžĺăăŚăăšăŚăŽăłăźăăĺŁăăĺ庌ăłăłăă¤ăŤăăĺăŤp = int(42)
ăžăăŻp = uint(42)
ăŤĺ¤ć´ăăĺż
čŚăăăăă¨ă示ăăžăă 1čĄăŽĺ¤ć´ă§ăŻă100čĄă俎ćŁăăĺż
čŚăŻăăăžăăă çšăŤăăăăăŽčĄăăłăźăăŤĺżăăŚäşşă
ăŽăăăąăźă¸ăŤĺŤăžăăŚăăĺ ´ĺă
100ďź ć示çă§ăăăăăăšăŚăĺŁăĺŻč˝ć§ăăăăă誰ă觌ăăăă¨ăă§ăăŞăé常ăŤĺŁăăăăăżă¤ăă§ăăĺż čŚăăăăžăă
ăăăŻăăšăŚăŽĺč¨ăżă¤ăăŽććĄăŤéŠç¨ăăăžăăăć示çăŞăŠăăŤăăăĺ ´ĺă§ăăăŠăăŤăŻăŠăŽăżă¤ăăŤĺ˛ăĺ˝ăŚăăăŚăăăăŤă¤ăăŚć示çă§ăăăăăĺ˛ăĺ˝ăŚĺŻč˝ă§ăă
@joshariană ăăăç§ăăăăćŁăăčŞăă§ăăăŞăăGoă䝼ĺčĄăŁăăăăŤ2çŞçŽăŽăăŁăźăŤăăŤĺčŞăľă¤ăşăŽĺ¤ăé ăăăŤifaceă常ăŤ(*type, *value)
ăŤăŞăççąăŻăĺćGCă严ćšăć¤ćťăăĺż
čŚăăŞăăăăŤăăăăă§ă2çŞçŽăăă¤ăłăżă§ăăăăŠăăă確čŞăăăăăŽăăŁăźăŤăâ常ăŤăăă§ăăă¨ćłĺŽă§ăăžăă ç§ăŻăăăćŁăăç解ăăžăăăďź
č¨ăćăăă¨ăăăăŻăżă¤ăăďźC襨č¨ă使ç¨ăăŚďźĺŽčŁ ăăăĺ ´ĺă
struct {
int which;
union {
A a;
B b;
C c;
} summands;
}
GCăŻwhich
ăć¤ćťăăŚă summands
ăăšăăŁăłăăĺż
čŚăăăăăŠăăăĺ¤ćăăăăăŤăăăăŻďźăžăăŻä˝ăĺăŁăăĺçăŽăăŽďźăĺĺžăăĺż
čŚăăăăžăăďź
Goă䝼ĺčĄăŁăăăăŤ2çŞçŽăŽăăŁăźăŤăăŤăŻăźăăľă¤ăşăŽĺ¤ăć źç´ăăăŽă§ăŻăŞăăifaceă常ăŤďź* typeă* valueďźăŤăŞăççąăŻă丌čĄGCă严ćšăŽăăŁăźăŤăăć¤ćťăăŚ2çŞçŽăăă¤ăłăżăźă§ăăăăŠăăă確čŞăăĺż čŚăăŞăăăăŤăăăăă§ăă â常ăŤăăă§ăăă¨ćłĺŽăăăă¨ăă§ăăžăă
ăăăŻćŁăăă
ăăĄăăăăăăŻăżă¤ăăŽć§čłŞăéăăăŚăăăăăăăă¤ăăŽäťŁćżĺŽčŁ ăĺŻč˝ăŤăŞăăžăă ăăăŻăżă¤ăăŻăăă¤ăłăżăź/éăă¤ăłăżăźăŽä¸č˛Ťăăăăżăźăłă常ăŤĺĺ¨ăăăăăŤăŹă¤ă˘ăŚăă§ăăžăă ăă¨ăă°ăăăšăŚăŽăšăŤăŠăźĺăăŞăźăăźăŠăăăăĺŻč˝ć§ăăăăćĺĺăăŁăźăŤăăăšăŠă¤ăšăăŁăźăŤăăŽĺ é ă¨ăŞăźăăźăŠăăăăĺŻč˝ć§ăăăăžăďźä¸Ąćšă¨ăăăă¤ăłăżăźăéăă¤ăłăżăźăăéĺ§ăăăăďźă ăă
pick {
a uintptr
b string
c []byte
}
大ăžăăŤăŹă¤ă˘ăŚăăăăă¨ăă§ăăžăďź
[ word 1 (ptr) ] [ word 2 (non-ptr) ] [ word 3 (non-ptr) ]
[ <nil> ] [ a ] [ ]
[ b.ptr ] [ b.len ] [ ]
[ c.ptr ] [ c.len ] [ c.cap ]
ăă ăăäťăŽăăăŻăżă¤ăă§ăŻăăăŽăăăŞćéŠăŞăăăăłă°ăă§ăăŞăĺ ´ĺăăăăžăă ďźASCIIăĺŁăăŚăăăă¨ăă芍ăłăăžăăGitHubăŤćŁăăăŹăłăăŞăłă°ăăăăă¨ăă§ăăŞăăăă§ăăčŚçšăŻăăăăžăăăéĄăŁăŚăăžăăďź
éçăŹă¤ă˘ăŚăăĺŽčĄăăăăŽćŠč˝ăŻăăăăŻăżă¤ăăĺŤăăăă¨ăćŻćăăăăăŠăźăăłăšăŽč°čŤă§ăăăăăăăăăžăăă ăăă§ăŽç§ăŽçŽć¨ăŻăĺăŤé˘éŁăăĺŽčŁ ăŽčŠłç´°ăŤăăŠă°ăçŤăŚăăă¨ă§ăă
@josharianăăăŚăăăăŚăăăŚăăăă¨ăă ç§ăŻăăŽăă¨ăčăăŚăăžăăă§ăăďźćŁç´ăŞă¨ăăăGCă§čĺĽăăăĺ ąç¨ä˝ăGCăăćšćłăŤé˘ăăç 犜ăăăŁăăăŠăăăă°ă°ăŁăă ăă§ăăăăăăă¨ăă§ăăžăăăăă1ćĽă¨ĺźăłăžăăăä˝ăăăŽççąă§ăç§ăŽčłăŻă丌čĄć§ăăé˘éŁäťăăžăăă§ăăăăăŽćĽăŽăGoăă§ďźfacepalmďźďźă
ăżă¤ăăŽ1ă¤ăăăă§ăŤăŹă¤ă˘ăŚăăćăŁăŚăăĺŽçžŠć¸ăżăŽć§é ä˝ă§ăăĺ ´ĺăé¸ćč˘ăŻĺ°ăŞăăŞăăžăă
1ă¤ăŽăŞăăˇă§ăłăŻăăľă¤ăşăĺçăŽć§é ä˝ă¨ĺăă§ăăăă¨ăćĺłăăăă¤ăłăżăźăĺŤăžăăŚăăĺ ´ĺă袍ĺ ć°ăăĺ§ç¸ŽăăăŞăăă¨ă§ăďźčĺĽĺintăŽĺ ´ĺăŻ+1ďźă ĺŻč˝ă§ăăă°ăăă¤ăăŞăăă˘ăăăźăăćĄç¨ăăŚăăŹă¤ă˘ăŚăăĺ ąćă§ăăăăšăŚăŽăżă¤ăăĺŽčĄă§ăăăăăŤăăžăă
ç´ ćľăŞăľă¤ăşăŽăăăăăŁă夹ăăŽăŻćŽĺżľă§ăăăăăăŻĺŽéăŤăŻĺăŞăćéŠĺă§ăă
ăă¤ăłăżăĺŤăžăăŚăăŞăăŚăă常ăŤ1 +ĺçăŽć§é ä˝ăŽăľă¤ăşă§ăăŁăă¨ăăŚăăĺ˛ăĺ˝ăŚăŽĺśĺžĄăŞăŠăĺčŞä˝ăŽäťăŽăăšăŚăŽĺŞăăăăăăăŁăăăăžăă čż˝ĺ ăŽćéŠĺăŻćéăŽçľéă¨ă¨ăăŤčż˝ĺ ăăăĺŻč˝ć§ăăăăĺ°ăŞăă¨ăăăŞăăććăăăăăŤĺŻč˝ă§ăă
type p pick {
A int
B string
}
Aă¨BăăăăŤăăĺż čŚăăăăžăăďź ăăăŻăŻä¸éŁăŽăżă¤ăăăé¸ćăăăŽă§ăčĺĽĺĺăĺŽĺ ¨ăŤç ´ćŁăăŚăżăžăăăă
type p pick {
int
string
}
q := p{string: "hello"}
ăăŽăăŠăźă ăŻăă§ăŤć§é ä˝ăŤćĺšă§ăăă¨ćăăžăă ăăăŻăŤĺż čŚăŞĺśç´ăăăĺ ´ĺăăăăžăă
@ăăŁăźăŤăĺăççĽăăăŚăăăăŽăăăŤăăżă¤ăă¨ĺăă§ăăăăăäžăŻćŠč˝ăăžăăăăăăăŽăăŁăźăŤăĺăŻă¨ăŻăšăăźăăăăŞăăăăĺŽçžŠăăăąăźă¸ĺ ăăăŽăżč¨ĺŽ/ă˘ăŻăťăšă§ăăžăă
ăżă¤ăĺăŤĺşăĽăăŚćéťçăŤçćăăăĺ ´ĺă§ăăăăŁăźăŤăĺăĺĺ¨ăăĺż čŚăăăăžăăăăăăŞăă¨ăĺ˛ăĺ˝ăŚĺŻč˝ć§ăă¤ăłăżăźăă§ă¤ăšăżă¤ăă¨ăŽç¸äşä˝ç¨ăćŞăăŞăăžăă ăăŁăźăŤăĺăŻăGoăŽäťăŽé¨ĺă§ćŠč˝ăăăăăŤăăăăŽă§ăă
@ă芍ăłă¨ăăŚăç§ăŻăăŞăăç§ăčŞăă ăăŽă¨ăŻç°ăŞăä˝ăăćĺłăăŚăăăă¨ăŤć°ăĽăăžăăă
ĺ ŹĺźĺăŻćŠč˝ăăžăăăć§é ä˝ăăŁăźăŤăăŽăăăŤčŚăăžăăăé常ăŽă¨ăŻăšăăźă/éă¨ăŻăšăăźăăŽăăŽăŽăăăŤĺä˝ăç°ăŞăăžăă
ĺŽĺŽăŤăăăŽă§ă p
ĺŽçžŠăăăăăąăźă¸ăŽĺ¤é¨ăăćĺĺăŤă˘ăŻăťăšă§ăăžăăďź
ăŠăă§ăă
type t struct {}
type P pick {
t
//other stuff
}
ďź
ăăŁăźăŤăĺăăżă¤ăĺăăĺé˘ăăăă¨ăŤăăă揥ăŽăăăŞăă¨ăă§ăăžăă
pick {
unexported Exported
Exported unexported
}
ăăăăŻ
pick { Recoverable, Fatal error }
ăăăŻăăŁăźăŤăăć§é ä˝ăăŁăźăŤăăŽăăăŤĺä˝ăăĺ ´ĺăŻăć§é ä˝ăăŁăźăŤăăŤă¤ăăŚăă§ăŤçĽăŁăŚăăăă¨ăŽĺ¤ăă使ç¨ăăŚăăăăŻăăŁăźăŤăăŤă¤ăăŚčăăăă¨ăă§ăăžăă ĺŻä¸ăŽćŹĺ˝ăŽéăăŻăä¸ĺşŚăŤč¨ĺŽă§ăăăăŁăźăŤăăé¸ćă§ăăăŽăŻ1ă¤ă ăă§ăăă¨ăăăă¨ă§ăă
@jimmyfrasche
GoăŻăă§ăŤć§é ä˝ă¸ăŽĺżĺĺăŽĺăčžźăżăăľăăźăăăŚăăăăăăšăłăźăăŽĺśéăŻč¨čŞăŤăă§ăŤĺĺ¨ăăăăŽă§ăăăĺââéĄăŻĺă¨ă¤ăŞă˘ăšăŤăăŁăŚč§ŁćąşăăăŚăăă¨ćăăžăă ăăăăčăăăăăăšăŚăŽăŚăźăšăąăźăšăŤă¤ăăŚčăăăăă§ăŻăŞăăă¨ăčŞăăŚăă ăăă ăăŽă¤ăăŁăŞă ăGoă§ä¸čŹçă§ăăăăŠăăăŤăăăŁăŚăăăăă§ăă
package p
type T struct{
Exported t
}
type t struct{}
ĺ°ăăŞ_t_ăŻă大ăăŞTăŤĺăčžźăžăăŚăăăăăąăźă¸ăŤĺĺ¨ăăăăŽăăăŞă¨ăŻăšăăźăăăăăżă¤ăăäťăăŚăŽăżĺ Źéăăăžăă
@ăŞăŽă§
ăă ăăĺŽĺ ¨ăŤăăŠăăźăăŚăăăŽăăŠăăăŻăăăăžăăă
//with the option to have field names
pick { //T is in the namespace of the pick and the type isn't exposed to other packages
T t
//...
}
//without
type T = t //T has to be defined in the outer scope and now t is exposed to other packages
pick {
T
//...
}
ăžăăăŠăăŤăŽăżă¤ăĺăăăŞăĺ ´ĺăăă¨ăă°[]string
ăĺŤăăăŤăŻă type Strings = []string
ăĺŽčĄăăĺż
čŚăăăăžăă
ăăăŻăăăăŻăżă¤ăăĺŽčŁ
ăăăŚăăăă¨ă確čŞăăăćšćłă§ăă ăŽ
çšăŤăRustă¨C ++ďźăăăŠăźăăłăšăŽă´ăźăŤăăšăżăłăăźăďźăăŠăŽăăăŤćŠč˝ăăăă§ăă
ăăă
ĺžšĺşçăŞăă§ăăŻăĺż
čŚăŞĺ ´ĺăŻăăă§ăăŤăźă使ç¨ă§ăăžăă ç§ă揲ăă
ăăăŠăźăăłăšăĺăĄăžăă ă¤ăžăăăăăŻăżă¤ăănilăŤăăăă¨ăŻă§ăăžăăă
ăăăŻčŚç´ ăŽăĄăłăăźăŽă˘ăăŹăšăĺĺžăăăă¨ăŻč¨ąĺŻăăăăšăă§ăŻăăăžăăďź
ă§ăăçĽăăăŚăăăăăŤăăˇăłă°ăŤăšăŹăăăŽĺ ´ĺă§ăăĄă˘ăŞăťăźăă§ăŻăăăžăă
RustăłăăĽăăăŁăďźă ăăăŻăżă¤ăăŤäťăŽĺśéăĺż
čŚăŞĺ ´ĺăŻă
ăăăŞăăăă§ăă ăăăăç§ăŤă¨ăŁăŚăŻăăăăŻăżă¤ăă常ăŤăăźăăŤĺ˛ăĺ˝ăŚăĺż
čŚăăăăžă
ćŞăă§ăăăă
2017ĺš´8ć18ćĽ12:01 PMăŤăăjimmyfrascheă [email protected]ăŻćŹĄăŽăăăŤć¸ăăŚăăžăă
@josharian https://github.com/joshariană ăăăç§ăăăăćŁăăčŞăă§ăăăŞă
ifaceăé ăă§ăŻăŞă常ăŤďź* typeă* valueďźăŤăŞăŁăŚăăççą
Goă䝼ĺăŤčĄăŁăăăăŤă2çŞçŽăŽăăŁăźăŤăăŽăŻăźăăľă¤ăşăŽĺ¤ăŻă
丌čĄGCăŻă2çŞçŽăŽăăŁăźăŤăăăŠăăă確čŞăăăăăŤä¸ĄćšăŽăăŁăźăŤăăć¤ćťăăĺż
čŚăŻăăăžăăă
ăŻăă¤ăłăżă§ăă常ăŤăăă§ăăă¨ćłĺŽă§ăăžăă ç§ăŻăăăćŁăăç解ăăžăăăďź
č¨ăćăăă¨ăăăăŻăżă¤ăăďźC襨č¨ă使ç¨ăăŚďźĺŽčŁ ăăăĺ ´ĺă
ć§é ä˝{
int which;
ăŚăăŞăł{
A a;
B b;
C c;
}袍ĺ ć°;
}
GCăŻă揥ăŽăăăŤăăăŻďźăžăăŻć´žćă ăĺçăŽăăŽďźăĺĺžăăĺż
čŚăăăăžăă
袍ĺ ć°ăăšăăŁăłăăĺż
čŚăăăăăŠăăăĺ¤ćăăăăăŤăŠăĄăăć¤ćťăăžăăďź
â
ăšăŹăăăä˝ćăăăăăăăăĺăĺăŁăŚăăžăă
ăăŽăĄăźăŤăŤç´ćĽčżäżĄăăGitHubă§čĄ¨ç¤şăăŚăă ăă
https://github.com/golang/go/issues/19412#issuecomment-323393003 ăăžăăŻăăĽăźă
ăšăŹăă
https://github.com/notifications/unsubscribe-auth/AGGWB3Ayi31dYwotewcfgmCQL-XVrfxIks5sZbVrgaJpZM4MTmSr
ă
@DemiMarie
pickčŚç´ ăŽăĄăłăăźăŽă˘ăăŹăšăĺĺžăăăă¨ăŻč¨ąĺŻăăăăšăă§ăŻăăăžăăďźRustăłăăĽăăăŁă§ăăçĽăăăŚăăăăăŤăăˇăłă°ăŤăšăŹăăăŽĺ ´ĺă§ăăĄă˘ăŞăťăźăă§ăŻăăăžăăďźă ăăăŻăżă¤ăăŤäťăŽĺśéăĺż čŚăŞĺ ´ĺăŻăăăăăŚăă ăăă
ăăăŻčŻăçšă§ăă ç§ăŻăăăŤăăăćăŁăŚăăžăăăăăăăăăŻçˇ¨éă§ĺ¤ąăăăăŤéăăăăžăăă ăăăŻăăĺ¤ăŤă˘ăŻăťăšăăă¨ăĺăççąă§ĺ¸¸ăŤăłăăźăčżăăăăă¨ăĺŤăăžăăă
ăăăçĺŽă§ăăççąăŽäžă¨ăăŚăĺžä¸ăŽăăăŤăčăăŚăżăŚăă ăă
v := pick{ A int; B bool }{A: 5}
p := &v.[A] //(this would be illegal but pretending it's not for a second)
v.B = true
v
ăćéŠĺăăăăăŁăźăŤăA
ă¨B
ăăĄă˘ăŞĺ
ă§ĺăä˝ç˝Žăĺ ăăăăăŤăŞăŁăŚăăĺ ´ĺă p
ăŻintăćăăŚăăžăăăă¤ăžăăćăăŚăăăŽă§ăăăăźăŤĺ¤ăŤă ăĄă˘ăŞăŽĺŽĺ
¨ć§ă䞾厳ăăăžăăă
@jimmyfrasche
ăłăłăăłăăă˘ăăŹăšćĺŽĺŻč˝ăŤăăăăŞă2ă¤çŽăŽççąăŻăăăĽăźăăźăˇă§ăłăťăăłăăŁăŻăšă§ăă çšĺŽăŽçśćłä¸ă§ĺ¤ăéćĽçăŤäżĺăăăĺ ´ĺă
v := pick{ A int; ... }{A: 5}
v2 := v
v2.[A] = 6 // (this would be illegal under the proposal, but would be
// permitted if `v2.[A]` were addressable)
fmt.Println(v.[A]) // would print 6 if the contents of the pick are stored indirectly
pick
ăă¤ăłăżăźăă§ăźăšăŤäźźăŚăăĺŻĺ¤ă˘ăăŹăšćĺŽĺŻč˝ă§ăăăçžĺ¨GoăŤăŻĺşĺĽăăăăžăăďźăăăăŤăăăă¨ă¤ăŞă˘ăˇăłă°ă茳ĺŻă§ăăŞăăŞăăžăă ă
硨éďźăăŁă¨ďźäťĽä¸ăĺç §ďź
@jimmyfrasche
ăăăŻăżă¤ăăŽăźăĺ¤ăŻăă˝ăźăšé ăŽćĺăŽăăŁăźăŤăă§ăăăăăŽăăŁăźăŤăăŽăźăĺ¤ă§ăă
v.[A]
ă¨v.(error)
ăćŁăăăă¨ăčĄăăăăŤăźăĺ¤ăçšĺĽăŞĺ ´ĺăé¤ăăŚăćĺăŽăăŁăźăŤăăéćĽçăŤć źç´ăăĺż
čŚăăăĺ ´ĺăăăăŻćŠč˝ăăŞăăă¨ăŤćł¨ćăăŚăă ăăă
@stevenblenkinsop ăćĺăŽăăŁăźăŤăăŻéćĽçăŤäżĺăăĺż čŚăăăăă¨ăŻăŠăăăćĺłă
ä¸ăăăă
var p pick { A error; B int }
ăźăĺ¤p
ăŤăŻăĺçăăŁăźăŤăA
ăăă A
ăŻnilă§ăă
@joshariană§čŞŹćăăăŚăăăăăŤăăŹăăźă¸ăłăŹăŻăżăźăŤăăŁăŚčŞ˛ăăăăăŹă¤ă˘ăŚăăŽĺśç´ăŽăăăŤăăă¤ăłăżăźăĺŤăžăăŚăă/ĺŤăžăăŚăăpick
ăŤć źç´ăăăŚăăĺ¤ăĺç
§ăăŚăăžăă
ăăŞăăŽäžă§ăŻă p.B
ăă¤ăłăżăźă§ăŻăŞăďźăŻă2ă¤ăŽăă¤ăłăżăźă§ć§ćăăăp.A
ă¨éč¤ăăăšăăŹăźă¸ăĺ
ąćă§ăăžăăă ăťă¨ăăŠăŽĺ ´ĺăéćĽçăŤäżĺăăĺż
čŚăăăăžăďźă¤ăžăă int
ă¨ăăŚă§ăŻăŞăăă˘ăŻăťăšćăŤčŞĺçăŤéĺç
§ăăă*int
ă¨ăăŚčĄ¨ăăăžăďźă p.B
ăćĺăŽăăŁăźăŤăă§ăăĺ ´ĺă pick
ăŽăźăĺ¤ăŻnew(int)
ăŤăŞăăžăăăăăŻăĺćĺăĺż
čŚăŞăăă訹厚ă§ăăăźăĺ¤ă§ăŻăăăžăăă nil *int
ănew(int)
ă¨ăăŚćąăăăăăăŤăçšćŽăŞăąăźăšăŤăăĺż
čŚăăăăžăă
@jimmyfrasche
ăăăăăăŞăăă äźčŠąăćŻăčżăă¨ăéăă¤ăłăżăźĺăŽéćĽăšăăŹăźă¸ăŽă¤ăłăżăźăă§ăźăšăĄăŤăăşă ăăłăăźăăăŽă§ăŻăŞăăéŁćĽăăăšăăŹăźă¸ă使ç¨ăăŚäşćć§ăŽăŞăăŹă¤ă˘ăŚăăŽăăŞă˘ăłăăäżĺ
硨éďźăăŁă¨ă獜ĺçść ă ć稿ăăŚăăăăŞăăŽăłăĄăłăăčŚăžăăă
@stevenblenkinsopăăăăăăăžăăăăăŞăăä˝ăćĺłăăăŽăăăăăžăă ăăăăăăăŻĺéĄă§ăŻăăăžăăă
éč¤ăăăšăăŹăźă¸ăŽĺ ąćăŻćéŠĺă§ăă ăăăŻćąşăăŚăăăăăăă¨ăă§ăăžăăă§ăăďźăżă¤ăăŽăťăăłăăŁăŻăšăŻéčŚăŞăăăă§ăă
ăłăłăă¤ăŠăźăăšăăŹăźă¸ăćéŠĺă§ăăăăăăăă¨ăé¸ćăăĺ ´ĺăăăăŻç´ ć´ăăăăăźăăšă§ăă
ăăŞăăŽäžă§ăŻăăłăłăă¤ăŠăŻăăăĺçăŽć§é ä˝ă¨ăžăŁăăĺăăăăŤć źç´ă§ăăžăďźă˘ăŻăăŁăăăŁăźăŤăăăŠăă§ăăăăçĽăăăăŤăżă°ăčż˝ĺ ăăžăďźă ăăăŻ
struct {
which_field int // 0 = A, 1 = B
A error
B int
}
ăźăĺ¤ăŻäžçśă¨ăăŚăăšăŚăă¤ă0ă§ăăăçšĺĽăŞĺ ´ĺă¨ăăŚĺŻăăŤĺ˛ăĺ˝ăŚăĺż čŚăŻăăăžăăă
éčŚăŞăŽăŻăä¸ĺşŚăŤ1ă¤ăŽăăŁăźăŤăă ăăćŠč˝ăăăăăŤăăăă¨ă§ăă
ăăăŻă§ăżă¤ăă˘ăľăźăˇă§ăł/ăšă¤ăăă訹ĺŻăăĺćŠăŻăăă¨ăă°ăăăăŻĺ
ăŽăăšăŚăŽăżă¤ăăfmt.Stringer
ăćşăăăĺ ´ĺăăăăŻă§ćŹĄăŽăăăŞăĄă˝ăăăč¨čż°ă§ăăăăăŤăăăă¨ă§ăăă
func (p P) String() string {
return p.(fmt.Stringer).String()
}
ăă ăăé¸ćăăŁăźăŤăăŽăżă¤ăăŻă¤ăłăżăźăă§ăźăšă§ăăĺŻč˝ć§ăăăăăăăăăŻĺžŽĺŚăŞçšăçăżĺşăăžăă
ĺăŽäžăŽăăăŻP
ăŤăăăčŞä˝ăfmt.Stringer
ăăăăŁăźăŤăăăăĺ ´ĺăăăăĺçăăŁăźăŤăă§ăăăăăŽĺ¤ănil
ĺ ´ĺă String
ăĄă˝ăăăŻăăăăŻăŤăŞăăžăă nil
ă nil
ă¤ăłăżăźăă§ăźăšăăăăčŞä˝ă§ăăăăä˝ăŤĺŻžăăŚăassertă¨ĺ
Ľĺăăăă¨ăŻă§ăăžăăă https://play.golang.org/p/HMYglwyVblăăăŻĺ¸¸ăŤçĺŽă§ăăăĺŽćçăŤçşçăăăăă§ăŻăăăžăăăăăăăŻă使ç¨ăăă¨ăăĺŽćçăŤçşçăăĺŻč˝ć§ăăăăžăă
ăă ăăĺč¨ăżă¤ăăŽăŻăăźăşăăŞć§čłŞăŤăăăçś˛çž ć§ăŽăŞăłăżăźăŻăăăăçşçăăăăšăŚăŽĺ ´ćăčŚă¤ăăŚďźĺ ´ĺăŤăăŁăŚăŻčޤć¤çĽăçşçăăĺŻč˝ć§ăăăăžăďźăĺŚçăĺż čŚăŞăąăźăšăĺ ąĺă§ăăžăă
ăăăŻăŤăĄă˝ăăăĺŽčŁ ă§ăăĺ ´ĺăăăăăŽăĄă˝ăăăĺă˘ăľăźăˇă§ăłăćşăăăăăŤä˝żç¨ăăăŞăăă¨ăéŠăăšăăă¨ă§ăă
type Num pick { A int; B float32 }
func (n Num) String() string {
switch v := n.[var] {
case A:
return fmt.Sprint(v)
case B:
return fmt.Sprint(v)
}
}
...
n := Num{A: 5}
s1, ok := p.(fmt.Stringer) // ok == false
var i interface{} = p
s2, ok := i.(fmt.Stringer) // ok == true
ăżă¤ăă˘ăľăźăˇă§ăłăă¤ăłăżăźăă§ă¤ăšăćşăăăŚăăĺ ´ĺăçžĺ¨ăŽăăŁăźăŤăăăăĄă˝ăăăăăă˘ăźăăăăă¨ăă§ăăžăăăăăăŤăŻăă¤ăłăżăźăă§ă¤ăščŞä˝ă§ĺŽçžŠăăăŚăăŞăă¤ăłăżăźăă§ă¤ăšăăŁăźăŤăăŽĺ¤ăăăĄă˝ăăăăăă˘ăźăăăăăŠăăăŞăŠăŽçŹčŞăŽĺéĄăçşçăăžăďźăžăăŻăăăĺšççăŤĺŽčŁ ăăćšćłăďźă ăžăăăăšăŚăŽăăŁăźăŤăăŤĺ ąéăŽăĄă˝ăăăăăăŻčŞä˝ăŤăăă˘ăźăăăăăă¨ăćĺž ăăăăăăăžăăăăăăăŻăă¤ăłăżăźăă§ă¤ăšăŤć źç´ăăăŚăăĺ ´ĺăŻäťŽćłăăŁăšăăăăŤĺ ăăŚăĺźăłĺşăăă¨ăŤăăŞă˘ăłăé¸ćăäťăăŚăăŁăšăăăăăĺż čŚăăăăžăăăăăł/ăžăăŻăăŁăźăŤăăă¤ăłăżăźăă§ăźăšăŽĺ ´ĺăŻäťŽćłăăŁăšăăăă¸ă
硨éďźăĄăŞăżăŤăăăăŻăćéŠăŤăăăŻăăăă¨ăŻăćăçăä¸čŹçăŞăšăźăăźăšăăŞăłă°ĺéĄăŽă¤ăłăšăżăłăšă§ăăăNPĺŽĺ ¨ă§ăăăä¸čŹçăŤä˝żç¨ăăă貪揲ăŞčżäźźăăăăžăă
ăŤăźăŤăŻăăăăăăăŻĺ¤ă§ăăĺ ´ĺăăżă¤ăă˘ăľăźăˇă§ăłăăăăŻĺ¤ăŽĺçăăŁăźăŤăăŤă˘ăľăźăăăžăăăăăăŻĺ¤ăă¤ăłăżăźăă§ă¤ăšăŤć źç´ăăăŚăăĺ ´ĺăăżă¤ăă˘ăľăźăˇă§ăłăŻăăăŻăżă¤ăăŽăĄă˝ăăăťăăăŤăăăžăă ćĺăŻćĺ¤ăăăăăžăăăăăăŞăä¸č˛ŤăăŚăăžăă
ăăăŻĺ¤ă§ăżă¤ăă˘ăľăźăˇă§ăłă訹ĺŻăăă ăă§ăăăăăăăă¨ăŻĺéĄă§ăŻăăăžăăă ăă ăăăăšăŚăŽăąăźăšăć¸ăĺşăăăăăŞăăŹăŻăˇă§ăłă使ç¨ăăăăăăă¨ăŞăăăăăŻĺ ăŽăăšăŚăŽăżă¤ăăĺ ąćăăăĄă˝ăăăé常ăŤç°ĄĺăŤĺŽŁäźă§ăăăŽă§ăćŽĺżľă§ăă
ăă ăăăłăźăçćă使ç¨ăăŚ
func (p Pick) String() string {
switch v := p.[var] {
case A:
return v.String()
case B:
return v.String()
//etc
}
}
ĺ ăŤé˛ăă§ăĺă˘ăľăźăˇă§ăłăĺé¤ăăžăăă ăăśăăăăăŻčż˝ĺ ăăăăšăă§ăăăăăăăŻććĄăŽĺż čŚăŞé¨ĺă§ăŻăăăžăăă
@ianlancetaylorăŽäťĽĺăŽăłăĄăłăăŤćťăăăă¨ćăăžăăă¨ăŠăźĺŚçăŤă¤ăăŚăăĺ°ăčăăĺžăć°ăăčŚçšăĺžăăăăăă§ăďźĺ ˇä˝çăŤăŻăhttpsďź//github.com/golang/go/issues/21161# issuecomment-320294933ďźă
çšăŤăć°ăă税éĄăŽăżă¤ăăŻăă¤ăłăżăźăă§ă¤ăšăżă¤ăăăăŻĺžăăăŞăăăŽăç§ăăĄăŤä¸ăăžăăďź
ç§ăčŚăŚăăăăăŤăĺč¨ăżă¤ăăŽä¸ťăŞĺŠçšăŻăč¤ć°ăŽĺ¤ăčżăăă¨ă¨ăăăă¤ăăŽĺ¤ăŽ1ă¤ăčżăăă¨ăĺşĺĽă§ăăăă¨ă§ăăçšăŤăăăăăŽĺ¤ăŽ1ă¤ăă¨ăŠăźă¤ăłăżăźăă§ă¤ăšăŽă¤ăłăšăżăłăšă§ăăĺ ´ĺăŻăăă§ăă
çžĺ¨ăăăŠăźă ăŽćŠč˝ăăăăăăăăžă
func F(âŚ) (T, error) {
âŚ
}
io.Reader.Read
ăio.Reader.Write
ăŞăŠăŽä¸é¨ăŻT
ă¨error
čżăăžăăăăăŽäťăŻT
ăžăăŻerror
ăă严ćšăŤăŞăăă¨ăŻăăăžăăă 䝼ĺăŽăšăżă¤ăŤăŽAPIăŽĺ ´ĺăă¨ăŠăźăçşçăăĺ ´ĺăŤT
ăçĄčŚăăăă¨ăŻăĺ¤ăăŽĺ ´ĺăă°ă§ăďźăă¨ăă°ăă¨ăŠăźăio.EOF
ďźă ĺžč
ăŽăšăżă¤ăŤă§ăŻăăźă䝼ĺ¤ăŽT
čżăăă¨ăăă°ă§ăă
lint
ăĺŤăčŞĺĺăăźăŤăŻăçšĺŽăŽé˘ć°ăŽä˝żç¨ćłăăă§ăăŻăăŚăă¨ăŠăźănilă§ăŞăĺ ´ĺăŤĺ¤ăćŁăăçĄčŚăăăďźăžăăŻçĄčŚăăăŞăďźăă¨ă確čŞă§ăăžăăăăăŽăăăŞăă§ăăŻăŻĺ˝çśäťťćăŽé˘ć°ăŤćĄĺźľăăăžăăă
ăă¨ăă°ăă¨ăŠăźăRequiredNotSetError
ĺ ´ĺă proto.Marshal
ăŻăĺ¤ă¨ă¨ăŠăźăăšăżă¤ăŤă§ăăăă¨ăćĺłăăăŚăăžăăăăă䝼ĺ¤ăŽĺ ´ĺăŻăĺ¤ăžăăŻă¨ăŠăźăăšăżă¤ăŤăŽăăă§ăă ĺăˇăšăă ăŻ2ă¤ăĺşĺĽăăŞăăăă誤ăŁăŚĺ帰ăĺ°ĺ
ĽăăĺŻč˝ć§ăăăăžăăă¤ăžăăĺż
čŚăŞă¨ăăŤĺ¤ăčżăăŞăăăăăšăă§ăŞăă¨ăăŤĺ¤ăčżăăăŽăŠăĄăăă§ăă ăăăŚă proto.Marshaler
ĺŽčŁ
ăŻăĺéĄăăăăŤč¤éăŤăăžăă
ä¸ćšăĺăĺéĺă¨ăăŚčĄ¨çžă§ăăă°ăăăăŤă¤ăăŚăăŁă¨ć確ăŤăăăă¨ăă§ăăžăă
type PartialMarshal struct {
Data []byte // The marshalled value, ignoring unset required fields.
MissingFields []string
}
func Marshal(pb Message) []byte | PartialMarshal | error
@ianlancetaylor ăç§ăŻăăŞăăŽććĄăç´ă§éăă§ăăžăă 䝼ä¸ăŽä˝ăăééăŁăŚăăăăŠăăćăăŚăăă ăăžăăďź
ä¸ăăăă
var r interface{} restrict { uint, int } = 1
r
ăŽĺçăżă¤ăăŻint
ă§ăăă
var _ interface{} restrict { uint32, int32 } = 1
éćłă§ăă
ä¸ăăăă
type R interface{} restrict { struct { n int }, etc }
type S struct { n int }
ăăŽĺ ´ĺă var _ R = S{}
ăŻéćłăŤăŞăăžăă
ăăăä¸ăăăă
type R interface{} restrict { int, error }
type A interface {
error
foo()
}
type C struct { error }
func (C) foo() {}
var _ R = C{}
ă¨var _ R = A(C{})
严ćšăĺćłă§ăă
严ćš
interface{} restrict { io.Reader, io.Writer }
ă¨
interface{} restrict { io.Reader, io.Writer, *bytes.Buffer }
ĺçă§ăă
ĺăăă
interface{} restrict { error, net.Error }
ă¨ĺçă§ă
interface { Error() string }
ä¸ăăăă
type IO interface{} restrict { io.Reader, io.Writer }
type R interface{} restrict {
interface{} restrict { int, uint },
IO,
}
ăăŽĺ ´ĺăĺşăŤăŞăăżă¤ăăŽR
ăŻćŹĄăŽăăăŤăŞăăžăă
interface{} restrict { io.Writer, uint, io.Reader, int }
硨éďźă¤ăżăŞăăŻä˝ăŽĺ°ăăŞäżŽćŁ
@jimmyfrascheç§ăä¸ă§ć¸ăăăŽăŻććĄă ăŁăă¨ăžă§ăŻč¨ăăžăăă ăăăŻă˘ă¤ăă˘ăŽăăăŞăăŽă§ăăă ç§ăŻăăŞăăŽăłăĄăłăăŤă¤ăăŚčăăŞăăă°ăŞăăŞăă§ăăăăăăăä¸čŚĺ˝źăăŻăăŁă¨ăăăăăăăŤčŚăăžăă
@jimmyfrascheăŽććĄăŻăăăăŻăżă¤ăăGoă§ĺä˝ăăăă¨ăç´ćçăŤćĺž ăăćšćłă¨ăťăźĺăă§ăă ăżă°ĺ¤ăăźăăăĺ§ăžăĺ ´ĺăăăăŻăŽăźăĺ¤ăŤćĺăŽăăŁăźăŤăăŽăźăĺ¤ă使ç¨ăăă¨ăă彟ăŽććĄăŻăăăźăĺ¤ăŻăă¤ăăăźăăŤăăăă¨ăćĺłăăăă¨ç´ćçă§ăăăă¨ăŤçšăŤćł¨ćăă䞥ĺ¤ăăăă¨ćăăžăďźăăăăăăăă§ăŤćł¨çŽăăăŚăăžă;ăăŽăšăŹăăăŻäťă§ăŻé常ăŤéˇăă§ă...ďźă ăžăăăăăŠăźăăłăšă¸ăŽĺ˝ąéżďźä¸čŚăŞĺ˛ăĺ˝ăŚăăŞăďźă¨ăăăăŻăă¤ăłăżăźăă§ă¤ăšăŤĺŽĺ ¨ăŤç´äş¤ăăŚăăăă¨ďźă¤ăłăżăźăă§ă¤ăšăĺŤăăăăŻă§éŠăăăăŞĺä˝ăĺăćżăăăă¨ăŻăăăžăăďźăć°ăŤĺ ĽăŁăŚăăžăă
ĺ¤ć´ăć¤č¨ăăĺŻä¸ăŽăă¨ăŻăăżă°ăĺ¤ć´ăăăă¨ă§ăă foo.X = 0
ăŻă foo = Foo{X: 0}
ă§ăă ăăăŤć°ćĺă§ăăăăżă°ăăŞăťăăăăŚĺ¤ăăźăăŤăăăă¨ăăăć確ăŤç¤şăăŚăăžăă ăăăŻăă¤ăăźăŞçšă§ăăă彟ăŽććĄăăăŽăžăžĺăĺ
Ľăăăăă°ăç§ăŻăžă é常ăŤĺŹăăă§ăă
@ ns-cweberăăăă¨ăăăăăžăăăăźăĺ¤ăŽĺä˝ă俥ç¨ăăăă¨ăŻă§ăăžăăă ă˘ă¤ăă˘ăŻăă°ăăăŽé澎ăăă§ăăŚăăăŽăšăŹăăăŽĺĺă§ĺşăăă@rogpeppeăŽććĄăŤăăăžăăďźăăŞăăăăŞăéˇăéććăăŚăăăăăŤďźă ç§ăŽćŁĺ˝ĺăŻăăŞăăä¸ăăăăŽă¨ĺăă§ăăă
foo.X = 0
寞foo = Foo{X: 0}
ăç§ăŽććĄă§ăŻĺŽéăŤăŻä¸Ąćšă訹ĺŻăăăŚăăžăă ăăŞăăčĄăăă¨ăă§ăăžăăŽă§ăăăăŻăŽăăŁăźăŤăăć§é ä˝ăŽĺ ´ĺăŻĺžč
ăäžżĺŠă§ăfoo.X.Y = 0
ăŽäťŁăăăŤfoo = Foo{X: image.Point{X: foo.[X].X, 0}}
ĺéˇă§ăăăă¨ăŤĺ ăăŚăĺŽčĄćăŤĺ¤ąćăăĺŻč˝ć§ăăăăžăă
ăžăăăťăăłăăŁăŻăšăŽă¨ăŹăăźăżăăăă埡ĺăăăăăăăŽăžăžăŤăăŚăăă¨ĺ˝šçŤă¤ă¨ćăăžăăăăăŻăä¸ĺşŚăŤ1ă¤ăŽăăŁăźăŤăăăč¨ĺŽă§ăăŞăć§é ä˝ă§ăă
ăăăăăŽăžăžĺăĺ ĽăăăăăŽă匨ăăĺŻč˝ć§ăăăăă¨ăŽ1ă¤ăŻăć§é ä˝ăŤăăăŻăĺăčžźăăă¨ăăŠăŽăăăŤćŠč˝ăăăă§ăă ĺ ćĽăć§é ä˝ăŽä˝żç¨ăŤĺăźăăăžăăžăŞĺ˝ąéżăŤă¤ăăŚčŠłăă誏ćăăžăăă ç§ăŻăăă俎çĺŻč˝ă ă¨ćăăžăăăćčŻăŽäżŽçăä˝ă§ăăăĺŽĺ ¨ăŤăŻăăăăžăăă ćăĺç´ăŞăŽăŻăăĄă˝ăăăŽăżăçśćżăăĺăčžźăžăăăăăŻăĺĺă§ç´ćĽĺç §ăăŚăăŁăźăŤăăŤă˘ăŻăťăšăăĺż čŚăăăăă¨ă§ăăć§é ä˝ăć§é ä˝ăăŁăźăŤăă¨ăăăŻăăŁăźăŤăăŽä¸Ąćšăćă¤ăă¨ăéżăăăăăŤăç§ăŻăăăŤĺžĺăăŚăăžăă
@jimmyfrascheăźăĺ¤ăŽĺä˝ăŤă¤ăăŚäżŽćŁăăŚăăă ăăăăă¨ăăăăăžăă ç§ăŻăăŞăăŽććĄă严ćšăŽăăĽăźăăźăżăźăčć ŽăŤĺ ĽăăŚăăăă¨ăŤĺćăăžăăăăăŚăăŞăăŽă¨ăŹăăźăżăźăăăăă¤ăłăăŻčŻăăăŽă ă¨ćăăžăă ăăŞăăŽććĄăŤĺŻžăăăăŞăăŽčŞŹćăŻçăŤăăŞăŁăŚăăžăăăç§ăŻfoo.XYăč¨ĺŽăăŚăăăŽăčŚăăă¨ăă§ăăžăăăăăăăčŞĺçăŤé¸ćăăŁăźăŤăăĺ¤ć´ăăăă¨ăŤć°ăĽăăŚăăžăăă§ăăă ăăŞăăŽććĄăćĺăăă°ăăăŽăăăăŞäşç´ăăăŁăŚăăç§ăŻăžă ĺĺăăŤĺăă§ăăžăă
ćĺžăŤăăăăŻĺăčžźăżăŽç°ĄĺăŞććĄăŻăç§ăç´ćçăŤç解ă§ăăăăŽăŽăăă§ăă ć°ăĺ¤ăăŁăŚăăć˘ĺăŽăłăźăăĺŁăăăŤĺç´ăŞććĄăăč¤éăŞććĄăŤç§ťčĄăăăă¨ăŻă§ăăžăăăăăŽéăŻĺ˝ăŚăŻăžăăžăăă
@ ns-cweber
čŞĺăfoo.XYăč¨ĺŽăăŚăăăŽăčŚăăă¨ăă§ăăžăăăăăăăŻăăŁăźăŤăăčŞĺçăŤĺ¤ć´ăăăăă¨ăŤć°ăĽăăŚăăžăăă§ăăă
ăăăŻĺ ŹćŁăŞçšă§ăăăăăŽăă¨ăŤé˘ăăŚăŻăăăŽč¨čŞăăžăăŻäťťćăŽč¨čŞă§ĺ¤ăăŽăă¨ăŤă¤ăăŚăăăćăéăăăă¨ăă§ăăžăă ä¸čŹçăŤăĺ˛ç˘ăŤăŻĺŽĺ ¨ăŹăźăŤăăăăžăăăĺŽĺ ¨ăŻăăżăŻăăăžăăă
ăăŞăăăăăăç ´ĺŁăăăăăŤăăŞăăŽéŞéăŤăŞăăŞăăŞăă°ăăăăăăŞăăä¸čŹçăŤäżčˇăăĺ¤ăăŽĺ¤§ăăŞăăŽăăăăžăăăăăăăŞăăŻăăă§ăăăŞăăä˝ăăăŚăăăŽăăçĽăĺż čŚăăăăžăă
ăăŽăăăŤééăăă¨ç
Šăăăăăăăăžăăăăăăăă bar.X = 0
ăč¨ĺŽăăžăăăă bar.Y = 0
ăč¨ĺŽăăă¤ăăă§ăăăă¨ĺ¤§ĺˇŽăăăžăăăăăŽfoo
ăŻăăăŻăżă¤ăă§ăă
ĺć§ăŤă i.Foo()
ă p.Foo()
ăăăăłv.Foo()
ăăšăŚĺăăăăŤčŚăăžăăă i
ănil
ă¤ăłăżăźăă§ă¤ăšăŽĺ ´ĺă p
ăŻnilăă¤ăłăżăźă§ăăă Foo
ăŻăăŽăąăźăšăĺŚçăăžăăăćĺăŽ2ă¤ăŻăăăăŻăŤăŞăĺŻč˝ć§ăăăăžăăă v
ăvalueăĄă˝ăăăŹăˇăźăăźă使ç¨ăăĺ ´ĺăŻă§ăăžăăă§ăăďźĺ°ăŞăă¨ăĺźăłĺşăčŞä˝ăăă§ăŻăăăžăăďźă ă
â
ĺăčžźăżăŤé˘ăăŚăŻăĺžă§çˇŠăăăăăŽăčŻăçšăŞăŽă§ăĺ ăŤé˛ăă§ććĄă硨éăăžăăă
ĺč¨ăżă¤ăăŤăŻăĺ¤ăăŽĺ ´ĺăĺ¤ăŽăŞăăăŁăźăŤăăăăăžăă ăă¨ăă°ă database/sql
ăăăąăźă¸ăŤăŻă揥ăŽăăŽăăăăžăă
type NullString struct {
String string
Valid bool // Valid is true if String is not NULL
}
ĺč¨ăżă¤ă/ăăăŻ/ĺ ąç¨ä˝ăăăĺ ´ĺăăăăŻćŹĄăŽăăăŤčĄ¨ăăăžăă
type NullString pick {
Null struct{}
String string
}
ăăŽĺ ´ĺăsumăżă¤ăăŤăŻć§é ä˝ăăăćăăăŞĺŠçšăăăăžăă ăăăŻĺĺăŤä¸čŹçăŞä˝żç¨ćłă§ăăăăăććĄăŤäžă¨ăăŚĺŤăă䞥ĺ¤ăăăă¨ćăăžăă
Bikesheddingďźçłă訳ăăăžăăďźăăăăŻć§ćăľăăźăă¨ć§é ä˝ăăŁăźăŤăĺăčžźăżć§ćă¨ăŽä¸ä¸č´ăŽäžĄĺ¤ăăăă¨ç§ăŻä¸ťĺźľăăžăďź
type NullString union {
Null
String string
}
@neild
ćĺăŤćĺžăŽăă¤ăłăăćă¤ďźć稿ăăĺăŽćĺžăŽĺ¤ć´ă¨ăăŚďźĺłĺŻăŤăŻĺż é ă§ăŻăăăžăăďźăăăŁăźăŤăĺăŽăŞăĺĺäťăăżă¤ăďźăžăăŻĺĺäťăăżă¤ăă¸ăŽăă¤ăłăżăźďźăăăĺ ´ĺăăăăŻăŻćéťăŽăăŁăźăŤăăä˝ćăăăă¨ăčż˝ĺ ăăžăăăżă¤ăă¨ĺăĺĺă§ăă ăăăŻćĺăŽă˘ă¤ăă˘ă§ăŻăŞăăăăăăžăăăă大é¨ăăăăŤăăăăăŽăżă¤ăăŽăăăăăăŽä¸čŹçăŞăąăźăšăŽ1ă¤ăăŤăăźăăăăăŤčŚăăžăăă ăăŞăăŽćĺžăŽäžăć¸ăăă¨ăă§ăăă¨ăăă¨ďź
type Null = struct{} //though this puts Null in the same scope as NullString
type NullString pick {
Null
String string
}
ăă ăăčŚçšăŤćťăă¨ăăăăŻĺŞăă使ç¨ćłă§ăă ĺŽéăăăă使ç¨ăăŚĺćĺăä˝ćă§ăăžăďź type Stoplight pick { Stop, Slow, Go struct{} }
ă ăăăŻăconst / iotafaux-enumăŤăăäźźăŚăăžăă ĺăĺşĺăŤăłăłăă¤ăŤăăăă¨ăă§ăăžăă ăăŽĺ ´ĺăŽä¸ťăŞĺŠçšăŻăçść
ă襨ăć°ĺ¤ăĺŽĺ
¨ăŤăŤăăťăŤĺăăăŚăăăăŞăšăăăăŚăă3ă¤äťĽĺ¤ăŽçść
ăŤăăăă¨ăă§ăăŞăăă¨ă§ăă
ćŽĺżľăŞăăă Stoplight
ĺ¤ăä˝ćăăăłč¨ĺŽăăăăăŽć§ćăăăĺäťă§ăăăăăŽĺ ´ĺăŻćŞĺăăžăă
light := Stoplight{Slow: struct{}{}}
light.Go = struct{}{}
äťăŽĺ ´ćă§ććĄăăăŚăăăăăŤă {}
ăžăăŻ_
ăstruct{}{}
ççĽĺ˝˘ăŤăăăă¨ă訹ĺŻăăă¨ĺ˝šçŤăĄăžăă
ĺ¤ăăŽč¨čŞăçšăŤé˘ć°ĺč¨čŞăŻăăŠăăŤăĺă¨ĺăăšăłăźăăŤé 罎ăăăă¨ă§ăăăĺéżăăžăă ăăăŤăăăĺ¤ăăŽč¤éăăçăăĺăăšăłăźăă§ĺŽçžŠăăă2ă¤ăŽăăăŻăăăŁăźăŤăĺăĺ ąćă§ăăŞăăŞăăžăă
ăă ăăăăŁăźăŤăăŽĺăĺźć°ă¨ăăŚĺăăăăŻĺ
ăŽĺăăŁăźăŤăăŽĺăĺĺă§é˘ć°ăä˝ćăăăłăźăă¸ă§ăăŹăźăżăźă使ç¨ăăă¨ăăăăĺéżăăăŽăŻç°Ąĺă§ăă ăžăăçšĺĽăŞĺ ´ĺă¨ăăŚăĺăŽăľă¤ăşăăźăăŽĺ ´ĺăŤĺźć°ăĺăăŞăăŁăĺ ´ĺă Stoplight
äžăŽĺşĺăŻćŹĄăŽăăăŤăŞăăžăă
func Stop() Stoplight {
return Stoplight{Stop: struct{}{}}
}
func Slow() Stoplight {
return Stoplight{Slow: struct{}{}}
}
func Go() Stoplight {
return Stoplight{Go: struct{}{}}
}
NullString
äžă§ăŻă揥ăŽăăăŤăŞăăžăă
func Null() NullString {
return NullString{Null: struct{}{}}
}
func String(s string) NullString {
return NullString{String: s}
}
ăăăă§ăŻăăăžăăăă go generate
é˘ăăŚăăăé常ăŤç°ĄĺăŤă¤ăłăŠă¤ăłĺă§ăăžăă
ăżă¤ăĺăŤĺşăĽăăŚćéťăŽăăŁăźăŤăăä˝ćăăĺ ´ĺďźăżă¤ăăäťăŽăăăąăźă¸ăăăŽăăŽă§ăŞăéăďźăăžăăŻăăŁăźăŤăĺăĺ ąćăăĺăăăăąăźă¸ĺ ăŽ2ă¤ăŽăăăŻă§ĺŽčĄăăăĺ ´ĺăŻćŠč˝ăăžăăăăĺéĄăăăžăăă ăăŽććĄăŻă玹ăăĺşăăŚăăšăŚăčĄăăăă§ăŻăăăžăăăăĺ¤ăăŽăă¨ăĺŻč˝ăŤăăăăă°ăŠăăźăŤçšĺŽăŽçśćłăŤćéŠăŞăăŽăćąşĺŽăăćčťć§ăćäžăăžăă
ăăĺ¤ăăŽć§ćbikesheddingďź
type NullString union {
Null
Value string
}
var _ = NullString{Null}
var _ = NullString{Value: "some value"}
var _ = NullString{Value} // equivalent to NullString{Value: ""}.
ĺ ˇä˝çăŤăŻăăăźăĺŤăžăŞăčŚç´ ăŞăšăăćă¤ăŞăăŠăŤăŻăč¨ĺŽăăăăŁăźăŤăăŤĺĺăäťăăăăŽă¨ăăŚč§Łéăăăžăă
ăăăŻăč¤ĺăŞăăŠăŤăŽäťăŽä˝żç¨ćłă¨ć§ćçăŤççžăăžăă ä¸ćšăăăźăŽăŞăĺ ąç¨ä˝ĺćĺĺăŽčł˘ćăŞč§ŁéăŻăŞăăăăďźĺ°ăŞăă¨ăç§ăŤăŻďźĺ ąç¨ä˝/ăăăŻ/ĺč¨ĺăŽăłăłăăăšăă§ăŻčł˘ćă§ç´ćçăŤčŚăă使ç¨ćłă§ăă
@neild
ăăăŻăč¤ĺăŞăăŠăŤăŽäťăŽä˝żç¨ćłă¨ć§ćçăŤççžăăžăă
ăăăŻćčä¸ăŻçăŤăăŞăŁăŚăăžăăăăăăŻç§ăŤăŻĺ¤§ăăŞăăŹăăŁăăŽăăăŤćăăžăă
ăžăă注ćăăŚăă ăă
var ns NullString // == NullString{Null: struct{}{}} == NullString{}
ns.String = "" // == NullString{String: ""}
map[T]struct{}
ă使ç¨ăăŚăăă¨ăăŤstruct{}{}
ăăăăăŤ
var set struct{}
ăŠăăă§theMap[k] = set
ă使ç¨ăăă¨ăĺć§ăŤăăăŻă§ćŠč˝ăăžă
ăăăŞăăă¤ăŻăˇă§ăăŁăłă°:(ĺč¨ăżă¤ăăŽăłăłăăăšăă§ăŽďźçŠşăŽăżă¤ăăŻăĺžćĽăănullăă§ăŻăŞăăunităă¨ĺźă°ăăŚăăžăăă
@bcmillsSorta ă
é˘ć°ĺč¨čŞă§ăŻăsumĺăä˝ćăăă¨ăăăŽăŠăăŤăŻĺŽéăŤăŻăăŽĺăŽĺ¤ăä˝ćăăé˘ć°ăŤăŞăăžăďźăă ăăăłăłăă¤ăŠăăăżăźăłăăăăłă°ăĺŻč˝ăŤăăăăăŤçĽăŁăŚăăăĺć§çŻĺăăžăăŻăăżă¤ăłăłăă¨ĺźă°ăăçšĺĽăŞé˘ć°ă§ăďźă
data Bool = False | True
ăăźăżĺBool
ă¨ăĺăăšăłăźăĺ
ăŤ2ă¤ăŽé˘ć°True
ă¨False
ăăăăăăŤç˝˛ĺ() -> Bool
ăžăă
ăăă§ă ()
ăŻăăżă¤ăçşéłĺä˝ďźĺä¸ăŽĺ¤ăŽăżăćă¤ăżă¤ăďźăŽč¨čż°ćšćłă§ăă Goă§ăŻăăăŽăżă¤ăăŻăăžăăžăŞćšćłă§č¨čż°ă§ăăžăăăć
ŁäžçăŤstruct{}
č¨čż°ăăăžăă
ăăăăŁăŚăăłăłăšăăŠăŻăżăźăŽĺźć°ăŽĺăŻăŚăăăă¨ĺźă°ăăžăă ăłăłăšăăŠăŻăżăźăŽĺĺăŽčŚĺăŻăăăŽăăăŞăŞăăˇă§ăłăżă¤ăă¨ăăŚä˝żç¨ăăăĺ ´ĺăé常None
ăăăăĄă¤ăłăŤĺăăăŚĺ¤ć´ă§ăăžăă ăă¨ăă°ăĺ¤ăăăźăżăăźăšăăăŽăăŽă§ăăĺ ´ĺă Null
ăŻéŠĺăŞĺĺăŤăŞăăžăă
@bcmills
ç§ăčŚăŚăăăăăŤăĺč¨ăżă¤ăăŽä¸ťăŞĺŠçšăŻăč¤ć°ăŽĺ¤ăčżăăă¨ă¨ăăăă¤ăăŽĺ¤ăŽ1ă¤ăčżăăă¨ăĺşĺĽă§ăăăă¨ă§ăăçšăŤăăăăăŽĺ¤ăŽ1ă¤ăă¨ăŠăźă¤ăłăżăźăă§ă¤ăšăŽă¤ăłăšăżăłăšă§ăăĺ ´ĺăŻăăă§ăă
ĺĽăŽčŚćšăăăă°ăăăăŻGoăŽĺč¨ĺăŽä¸ťăŞćŹ çšă ă¨ćăăžăă
ăăĄăăăĺ¤ăăŽč¨čŞăŻăĺ¤ăă¨ăŠăźăčżăĺ ´ĺăŤćŁç˘şăŤĺč¨ĺă使ç¨ăăžăăăăăŻăăăăăŽč¨čŞăŤéŠăăŚăăžăă ĺč¨ăżă¤ăăGoăŤčż˝ĺ ăăăĺ ´ĺăĺăćšćłă§ăăăă使ç¨ăăăă¨ăă大ăăŞčŞćăăăăžăă
ăă ăăGoăŤăŻăăăŽçŽçăŽăăăŤč¤ć°ăŽĺ¤ă使ç¨ăăăłăźăăŽĺ¤§čŚć¨ĄăŞă¨ăłăˇăšăă ăăă§ăŤăăăžăă ć°ăăăłăźăăĺč¨ĺă使ç¨ăăŚďźĺ¤ăă¨ăŠăźďźăżăăŤăčżăĺ ´ĺăăăŽă¨ăłăˇăšăă ăŻćçĺăăăžăă ä¸é¨ăŽä˝ćč ăŻăć˘ĺăŽăłăźăă¨ăŽä¸č˛Ťć§ăäżă¤ăăăŤăĺźăçśăč¤ć°ăŽăŞăżăźăłă使ç¨ăăžăă ä¸é¨ăŽä˝ćč ăŻĺč¨ăżă¤ăă使ç¨ăăžăă ć˘ĺăŽAPIăĺ¤ćăăăă¨ăăäşşăăăžăă ä˝ăăăŽççąă§ĺ¤ăGoăăźă¸ă§ăłăŤĺşĺˇăăä˝ćč ăŻăć°ăăAPIăăăăăŻă˘ăŚăăăăžăă ăăăŻćˇˇäšąăăă§ăăăăăăăŚç§ăŻĺŠçăăłăšăăŽäžĄĺ¤ăăăăăăŤăŞăĺ§ăăă¨ăŻćăăžăăă
ć°ăăăłăźăăĺč¨ĺă使ç¨ăăŚďźĺ¤ăă¨ăŠăźďźăżăăŤăčżăĺ ´ĺăăăŽă¨ăłăˇăšăă ăŻćçĺăăăžăă
Go 2ă§ĺč¨ĺăčż˝ĺ ăăăăăăĺä¸ăŤä˝żç¨ăăă¨ăĺéĄăŻćçĺă§ăŻăŞă秝čĄăŽ1ă¤ăŤăŞăăžăăă¤ăžăăGo 1ďźĺ¤ăă¨ăŠăźďźAPIăGo 2ďźĺ¤|ă¨ăŠăźďźăŤĺ¤ćă§ăăĺż čŚăăăăžăă ďźAPIăăăłăăŽéăăă ăăăăă°ăŠă ăŽGo2é¨ĺă§ăŻç°ăŞăăżă¤ăă§ăăĺŻč˝ć§ăăăăžăă
Go 2ă§ĺč¨ĺăčż˝ĺ ăăăăăăĺä¸ăŤä˝żç¨ăăĺ ´ĺ
ăăăŻăăăăžă§ăŤčŚăăăŽă¨ăŻăžăŁăăç°ăŞăććĄă§ăăăă¨ăŤćł¨ćăăŚăă ăăăć¨ćşăŠă¤ăăŠăŞăĺ¤§ĺš ăŤăŞăăĄăŻăżăŞăłă°ăăĺż čŚăăăăAPIăšăżă¤ăŤéăŽĺ¤ćăĺŽçžŠăăĺż čŚăăăăžăăăăŽăŤăźăăŤé˛ăă¨ăăăăŻé常ăŤĺ¤§ăăăŞăăžăăĺč¨ăżă¤ăăŽč¨č¨ăŤé˘ăăăă¤ăăźăŞăłăăŁăˇăŤă使ç¨ăăAPI秝čĄăŽč¤éăŞććĄă
Go1ă¨Go2ăĺăăăă¸ă§ăŻăă§ăˇăźă ăŹăšăŤĺ
ąĺă§ăăăăăŤăăăă¨ăçŽçă¨ăăŚăăăăă誰ăăăä˝ăăăŽççąă§ăGo 1ăłăłăă¤ăŠă§ăšăżăăŻăă 2ăŠă¤ăăŠăŞăŤç§ťĺăăžăă ăă ăăäžĺé˘äżăăăă°A
ăŤé çŞăŤäžĺăăB
ăăăăłB
ăŽăăăŞć°ćŠč˝ă使ç¨ăăăăăŤă˘ăăăăźăpick
ăăŽAPIăŤăŻăăăŽć°ăăăăźă¸ă§ăłăŽB
ă使ç¨ăăăăăŤć´ć°ăăŞăéăăäžĺé˘äżA
ăĺŁăăžăă A
ăŻăăăłăăźB
ă§ĺ¤ăăăźă¸ă§ăłă使ăçśăăăă¨ăă§ăăžăăăăťăăĽăŞăăŁăă°ăŞăŠăŽăăăŤĺ¤ăăăźă¸ă§ăłăçśćăăăŚăăŞăĺ ´ĺăăžăăŻć°ăăăăźă¸ă§ăłă使ç¨ăăĺż
čŚăăăĺ ´ĺB
ç´ćĽä˝żç¨ăăŚăăăăăä˝ăăăŽççąă§ăăă¸ă§ăŻăăŤ2ă¤ăŽăăźă¸ă§ăłăĺŤăăăă¨ăă§ăăŞăăăăĺéĄăçşçăăĺŻč˝ć§ăăăăžăă
ćçľçăŤăăăă§ăŽĺéĄăŻč¨čŞăăźă¸ă§ăłă¨ăŻăťă¨ăăŠé˘äżăăŞăăć˘ĺăŽă¨ăŻăšăăźăăăăé˘ć°ăŽç˝˛ĺăŽĺ¤ć´ă¨é˘äżăăăăžăă ăăăć¨é˛ĺăćäžăăć°ăăćŠč˝ăŤăŞăă¨ăăäşĺŽăŻăăăăăĺ°ăć°ăćŁăăăăŽă§ăă ä¸ä˝äşćć§ăćăŞăăă¨ăŞăć˘ĺăŽAPIăĺ¤ć´ăăŚpick
ă使ç¨ă§ăăăăăŤăăăă¨ăçŽçăŽĺ ´ĺăŻăä˝ăăăŽăăŞăă¸ć§ćăĺż
čŚăŤăŞăĺŻč˝ć§ăăăăžăă äžďźĺŽĺ
¨ăŤăšăăăźăăłă¨ăăŚďźďź
type ReadResult pick(N int, Err error) {
N
PartialResult struct { N; Err }
Err
}
ăłăłăă¤ăŠăźăŻăăŹăŹăˇăźăłăźăăăă˘ăŻăťăšăăăă¨ăăŤăçšĺŽăŽăăŞă˘ăłăăŤăăŁăźăŤăăĺĺ¨ăăŞăĺ ´ĺăŻăźăĺ¤ă使ç¨ăăŚă ReadResult
ăšăăŠăăăăăă¨ăă§ăăžăă éăŽćšćłăăăăă ăăŽäžĄĺ¤ăăăăăŠăăăŻăăăăžăăă template.Must
ăăăŞAPIăŻă pick
ă§ăŻăŞăăč¤ć°ăŽĺ¤ăĺăĺ
ĽăçśăăéăăčŁăăăăŤăšăăŠăăăŁăłă°ăŤäžĺăăĺż
čŚăăăĺ ´ĺăăăăžăă ăžăăŻă揥ăŽăăăŞăăŽă使ç¨ă§ăăžăă
type ReadResult pick(N int, Err error) {
case Err == nil:
N
default:
PartialResult struct { N; Err }
case N == 0:
Err
}
ăăăŻăč¤éăŞăă¨ăčĄăăžăăăç§ăŻAPIăć¸ăăăăšăćšćłăĺ¤ć´ćŠč˝ăĺ°ĺ Ľăăăă¨ăŻăä¸çăĺŁăăă¨ăŞă秝čĄăăćšćłăŤă¤ăăŚăŽçŠčŞăĺż čŚă¨ăŠăŽăăăŤčŚăăă¨ăă§ăăžăă ăăŞăă¸ć§ćăĺż čŚă¨ăăŞăćšćłăăăăăăăăžăăă
ĺč¨ĺăă製ĺĺďźć§é ä˝ăč¤ć°ăŽćťăĺ¤ďźăŤç§ťčĄăăăŽăŻç°Ąĺă§ăăĺ¤äťĽĺ¤ăŽăăšăŚăăźăăŤč¨ĺŽăăă ăă§ăă 製ĺăżă¤ăăăĺč¨ăżă¤ăă¸ăŽç§ťčĄăŻăä¸čŹçăŤć確ăŤĺŽçžŠăăăŚăăžăăă
APIă製ĺăżă¤ăăăźăšăŽĺŽčŁ ăăĺč¨ăżă¤ăăăźăšăŽĺŽčŁ ăŤăˇăźă ăŹăšăă¤ćŽľéçăŤç§ťčĄăăĺ ´ĺăćăç°ĄĺăŞăŤăźăăŻăĺč¨ăżă¤ăăăźă¸ă§ăłăŤĺŽéăŽĺŽčŁ ăăăă製ĺăżă¤ăăăźă¸ă§ăłăĺč¨ĺăăźă¸ă§ăłăăŠăłăżă¤ă ăă§ăăŻăŤĺż čŚăŞăăŽă¨ă製ĺăšăăźăšă¸ăŽć役ăĺŽčĄăăžăă
ăăăŻćŹĺ˝ăŤć˝čąĄçăŞăŽă§ăăăăŤäžăăăăžă
ĺč¨ăŞăăŽăăźă¸ă§ăł1
func Take(i interface{}) error {
switch i.(type) {
case int: //do something
case string:
default: return fmt.Errorf("invalid %T", i)
}
}
func Give() (interface{}, error) {
i := f() //something
if i == nil {
return nil, errors.New("whoops v:)v")
}
return i
}
ĺč¨ăŽăăăăźă¸ă§ăł2
type Value pick {
I int
S string
}
func TakeSum(v Value) {
// do something
}
// Deprecated: use TakeSum
func Take(i interface{}) error {
switch x := i.(type) {
case int: TakeSum(Value{I: x})
case string: TakeSum(Value{S: x})
default: return fmt.Errorf("invalid %T", i)
}
}
type ErrValue pick {
Value
Err error
}
func GiveSum() ErrValue { //though honestly (Value, error) is fine
return f()
}
// Deprecated: use GiveSum
func Give() (interface{}, error) {
switch v := GiveSum().(var) {
case Value:
switch v := v.(var) {
case I: return v, nil
case S: return v, nil
}
case Err:
return nil, v
}
}
ăăźă¸ă§ăł3ăŻGive / Takeăĺé¤ăăžă
ăăźă¸ă§ăł4ăŻăGiveSum / TakeSumăŽĺŽčŁ ăGive / TakeăŤç§ťĺăăGiveSum / TakeSumăGive / Takeăĺźăłĺşăă ăă§ăGiveSum / TakeSumăĺťć˘ăăžăă
ăăźă¸ă§ăł5ăŻGiveSum / TakeSumăĺé¤ăăžă
ăăăŻăăăă§ăéăăăăăžăăăăĺć§ăŽć§čłŞăŽäťăŽĺ¤§čŚć¨ĄăŞćˇˇäšąă¨ĺăă§ăăăč¨čŞăăä˝ĺăŞăăŽăĺż čŚă¨ăăžăă
ĺč¨ĺăŽďźăťă¨ăăŠăŽďźăŚăźăăŁăŞăăŁăŻăăłăłăă¤ăŤćăŤĺă¤ăłăżăźăă§ă¤ăš{}ăŽĺă¸ăŽäťŁĺ Ľăĺśç´ăăăĄăŤăăşă ă§ĺŽçžă§ăăă¨ćăăžăă
ç§ăŽĺ¤˘ă§ăŻă揥ăŽăăăŤăŞăăžăă
type T1 switch {T2,T3} // only nil, T2 and T3 may be assigned to T1
type T2 struct{}
type U switch {} // only nil may be assigned to U
type V switch{interface{} /* ,... */} // V equivalent to interface{}
type Invalid switch {T2,T2} // only uniquely named types
type T3 switch {int,uint} // switches can contain switches but...
...ăšă¤ăăăżă¤ăăć示çăŤĺŽçžŠăăăŚăăŞăăżă¤ăă§ăăă¨ă˘ăľăźăăăă¨ăăłăłăă¤ăŤćă¨ăŠăźăŤăăŞăăžăă
var t1 T1
i,ok := t1.(int) // T1 can't be int, only T2 or T3 (but T3 could be int)
switch t := t1.(type) {
case int: // compile error, T1 is just nil, T2 or T3
}
ăăăŚăçŁĺťăŻT3ăŽăăăŞăżă¤ăă¸ăŽăăăžăăŞĺŽć°ăŽĺ˛ăĺ˝ăŚăŤă¤ăăŚéŻăćŻăăă§ăăăăăăăšăŚăŽćĺłă¨çŽçăŽăăăŤďźĺŽčĄćďź var x T3 = 32
ăŻvar x interface{} = 32
ăžăă ăăśăăăšă¤ăăăăăăźăŽăăăŞĺĺăŽăăăąăźă¸ăŤçľăżčžźăžăăŚăăăăŤăă¤ăłăŽăăă¤ăăŽäşĺĺŽçžŠăăăăšă¤ăăăżă¤ăăăăŁăăăă§ăăăă
@ j7bă@ianlancetaylorăŻă§ĺć§ăŽă˘ă¤ăă˘ăćäžăhttps://github.com/golang/go/issues/19412#issuecomment -323256891
ĺžă§ăăăŽčŤçç帰çľăŤăŞăă¨ćăăăŽăhttps://github.com/golang/go/issues/19412#issuecomment-325048452ăŤć稿ăăžăăă
ăăăăŽĺ¤ăăŻăéĄäźźć§ăčăăă¨çăăéŠç¨ăăăăăă§ăă
ăăŽăăăŞăă¨ăăăžăăăă°ćŹĺ˝ăŤç´ ć´ăăăă§ăăăă ă¤ăłăżăźăă§ă¤ăšăăă¤ăłăżăźăă§ă¤ăš+ĺśéăŤç°ĄĺăŤç§ťčĄă§ăăžăďźçšăŤIanăŽć§ćă§ăŻăă¤ăłăżăźăă§ă¤ăšă§ć§çŻăăăć˘ĺăŽçäźźĺč¨ăŽćĺžăŤrestrict
ăčż˝ĺ ăăă ăă§ăďźă ĺŽčĄćăŤăăăăŻĺşćŹçăŤă¤ăłăżăźăă§ăźăšă¨ĺä¸ă§ăăăăťă¨ăăŠăŽä˝ćĽăŻăä¸ĺ¤ćĄäťśăĺŁăăă¨ăăŤăłăłăă¤ăŠăźăŤčż˝ĺ ăŽă¨ăŠăźăçşčĄăăăă ăăŞăŽă§ăĺŽčŁ
ăŻç°Ąĺă§ăă
ăăăăăăăćŠč˝ăăăăă¨ăŻä¸ĺŻč˝ă ă¨ćăăžăă
ă¨ăŚăčżăăăăăŻăăŁăăăŽăăăŤčŚăăžăăăăăŞăăŻăşăźă ă¤ăłăăŚăăŞăăăăăŚăăăăĺ°ăăăăˇăĽăăŚăä˝ăäťăŽăăăăä¸ăăăŽă§ăăăă ăă§ăăăŞăĺłă§ăŞăăă¨ăăăšăŚăŠă¤ăłă˘ăăă ăăŞăăŻăăă俎垊ăăăă¨ăăăă¨ăă§ăăžăăăăăăăăăŞăăŻă¤ăłăżăźăă§ăźăšăŤăăäźźăŚăăăĺĽĺŚăŞĺ ´ĺăŤăŻç°ăŞăŁăćŻăčăăăăä˝ăăćăŤĺ Ľăăžăă
ĺ¤ĺç§ăŻä˝ăăćŹ ăăŚăăžăă
ăąăźăšăĺż
ăăăäşăăŤç´ ă§ăăĺż
čŚăăŞăéăăĺśéăăăă¤ăłăżăźăă§ă¤ăšăŽććĄăŤĺéĄăŻăăăžăăă 2ă¤ăŽă¤ăłăżăźăă§ăźăšăżă¤ăďź io.Reader
/ io.Writer
ďźéăŽçľĺăäşăăŤç´ ă§ăŞăăă¨ăŻăăăŞăăťăŠéŠăăšăăă¨ă§ăŻăŞăă¨ćăăžăă interface{}
ĺ˛ăĺ˝ăŚăăăĺ¤ăă严ćšăĺŽčŁ
ăăŚăăĺ ´ĺă io.Reader
ăžăăŻio.Writer
ă¨ăăŚć źç´ăăăŚăăăăŠăăăĺ¤ćă§ăăŞăă¨ăăäşĺŽă¨ĺŽĺ
¨ăŤä¸č´ăăŚăăžăă ăăăăăŽăąăźăšăĺ
ˇä˝çăŞăżă¤ăă§ăăéăăé交ĺăć§çŻă§ăăă¨ăăäşĺŽăŻĺŽĺ
¨ăŤéŠĺă§ăăăăăŤćăăăžăă
ăăŹăźăăŞăăŻăăŚăăŞăłăĺśéăăăă¤ăłăżăźăă§ăźăšă§ăăĺ ´ĺăăăăăŤç´ćĽăĄă˝ăăăĺŽçžŠă§ăăŞăăă¨ă§ăă ăžăăă¤ăłăżăźăă§ăźăšăżă¤ăăĺśéăăăŚăăĺ ´ĺă pick
ăżă¤ăăćäžăăäżč¨źăăăç´ćĽăšăăŹăźă¸ăĺĺžă§ăăžăăă ăăăăŽčż˝ĺ ăŽĺŠçšăĺžăăăăŤč¨čŞăŤĺĽăŽç¨ŽéĄăŽăăŽăčż˝ĺ ăă䞥ĺ¤ăăăăăŠăăăŻăăăăžăăă
@jimmyfrasche for type T switch {io.Reader,io.Writer}
ReadWriterăTăŤĺ˛ăĺ˝ăŚăăă¨ăŻĺéĄăăăžăăăăTăio.ReaderăžăăŻIo.Writeră§ăăă¨ăăă˘ăľăźăă§ăăžăăăio.ReaderăžăăŻio.Writerăă˘ăľăźăăăăŤăŻĺĽăŽă˘ăľăźăˇă§ăłăĺż
čŚă§ăăćç¨ăŞă˘ăľăźăˇă§ăłă§ăăĺ ´ĺăŻăăšă¤ăăăżă¤ăăŤčż˝ĺ ăăăă¨ăć¨ĺĽ¨ăăReadWriteră
@stevenblenkinsopăĄă˝ăăăŞăă§ăăăŻććĄăĺŽçžŠă§ăăžăă ĺŽéăăĄă˝ăăă¨ćéťăŽăăŁăźăŤăĺăĺé¤ăăă¨ăăăăŻăŽĺăčžźăżă訹ĺŻă§ăăžăă ďźćăăăŤç§ăŻăăĄă˝ăăă¨ăăăăťăŠă§ăŻăŞăăćéťăŽăăŁăźăŤăĺăăăăă§ăŽăăćç¨ăŞăăŹăźăăŞăă§ăăă¨ćăăžăďźă
ăăăŚăăăŽä¸ćšă§ă @ ianlancetaylorăŽć§ćăŻ
type IR interface {
Foo()
Bar()
} restrict { A, B, C }
A
ă B
ăăăăłC
ăăăăFoo
ăăăłBar
ăĄă˝ăăăćăŁăŚăăéăăłăłăă¤ăŤăăăžăďźăă ăăĺżé
ăăĺż
čŚăăăăžăďźç´nil
ĺ¤ďźă
硨éďźćä˝ă§ăŽčŞŹć
ä˝ăăăŽĺ˝˘ĺźăŽ_restrictedinterface_ă彚çŤă¤ă¨ćăăžăăăć§ćăŤĺćăăžăăă ăăăç§ăććĄăăŚăăăă¨ă§ăă ăăăŻäťŁć°çăăźăżĺă¨ĺăăăăŤćŠč˝ăăĺż ăăăĺ ąéăŽĺä˝ăăăĺż čŚăŽăŞăăăĄă¤ăłé˘éŁăŽăŞăă¸ă§ăŻăăă°ăŤăźăĺăăžăă
//MyGroup can be any of these. It can contain other groups, interfaces, structs, or primitive types
type MyGroup group {
MyOtherGroup
MyInterface
MyStruct
int
string
//..possibly some other types as well
}
//type definitions..
type MyInterface interface{}
type MyStruct struct{}
//etc..
func DoWork(item MyGroup) {
switch t:=item.(type) {
//do work here..
}
}
ăăŽă˘ăăăźăăŤăŻăĺžćĽăŽçŠşăŽă¤ăłăżăźăă§ă¤ăšinterface{}
ă˘ăăăźăăŤćŻăšăŚăăă¤ăăŽĺŠçšăăăăžăă
犺ăŽă¤ăłăżăźăă§ăźăšinterface{}
ăŻăé˘äżăăăżă¤ăăŽć°ăä¸ćăŞĺ ´ĺăŤĺ˝šçŤăĄăžăă ăăă§ăŻăĺŽčĄćăŽć¤č¨źăŤäžĺăă䝼ĺ¤ăŤé¸ćč˘ăŻăăăžăăă ä¸ćšăĺăŽć°ăéăăăŚăăŚăăłăłăă¤ăŤćăŤăăăŁăŚăăĺ ´ĺăŻăăłăłăă¤ăŠăŤćŻć´ăăŚăăăăžăăăďź
@henryasăăćç¨ăŞćŻčźăŻăĺč¨ăżă¤ăăďźéăďźčĄăăăăŤçžĺ¨ć¨ĺĽ¨ăăăŚăăćšćłă ă¨ćăăžăďźçŠşă§ăŞăă¤ăłăżăźăă§ăźăšďźć確ăŞă¤ăłăżăźăă§ăźăšăć˝ĺşă§ăăŞăĺ ´ĺăŻăă¨ăŻăšăăźăăăăŚăăŞăăăźăŤăźé˘ć°ă使ç¨ďźă
ç§ăŻăăŞăăŽč°čŤăăăăŤéčŚăŞćĺłă§ĺ˝ăŚăŻăžăă¨ăŻćăăŞăă
GoprotobufsăŤé˘ăăă¨ăŻăšăăŞă¨ăłăšăŹăăźăăŻćŹĄăŽă¨ăăă§ăă
proto2ć§ćă§ăŻăăăŞăăˇă§ăłăăăŁăźăŤăă使ç¨ă§ăăžăăăăăŻăăźăĺ¤ă¨ćŞč¨ĺŽĺ¤ăĺşĺĽăăăăżă¤ăă§ăă çžĺ¨ăŽč§ŁćąşçăŻăăă¤ăłăżăźďźăă¨ăă°ă *int
ďźă使ç¨ăăăă¨ă§ăăăăă§ănilăă¤ăłăżăźăŻćŞč¨ĺŽă示ăăsetăă¤ăłăżăźăŻĺŽéăŽĺ¤ăćăăžăă 揲ćąăŻăĺ¤ăŤă˘ăŻăťăšăăă ăă§ăăă¨ăăä¸čŹçăŞăąăźăšăč¤éăŤăăăă¨ăŞăăăźăă¨ćŞč¨ĺŽăŽĺşĺĽăĺŻč˝ăŤăăă˘ăăăźăă§ăďźăźăĺ¤ăŻćŞč¨ĺŽăŽĺ ´ĺăŻĺéĄăăăžăăďźă
çĽčŞăŻăĺč¨ĺăŽçĽčŞăăźă¸ă§ăłă§ăăăoneofsăă訹ĺŻăăžăă çžĺ¨ćĄç¨ăăăŚăăă˘ăăăźăăŻćŹĄăŽă¨ăăă§ăďźĺ¤§ăžăăŞäžďźă
type Communique_Union interface { isCommunique_Union() }
ďźtype Communique_Number struct { Number int32 }
ďźăăŠăăăăăă¨ă ăăçŽçă¨ăăŚăăžăăĺăżă¤ăăŤăŻisCommunique_Union
ăĄă˝ăăăăăăžăă@henryasăăćç¨ăŞćŻčźăŻăĺč¨ăżă¤ăăďźéăďźčĄăăăăŤçžĺ¨ć¨ĺĽ¨ăăăŚăăćšćłă ă¨ćăăžăďźçŠşă§ăŞăă¤ăłăżăźăă§ăźăšďźć確ăŞă¤ăłăżăźăă§ăźăšăć˝ĺşă§ăăŞăĺ ´ĺăŻăă¨ăŻăšăăźăăăăŚăăŞăăăźăŤăźé˘ć°ă使ç¨ďźă
ç§ăŻăăŞăăŽč°čŤăăăăŤéčŚăŞćĺłă§ĺ˝ăŚăŻăžăă¨ăŻćăăŞăă
揥ăŽăăăŤăăŞăă¸ă§ăŻăăŤăăăźăŽă¨ăŻăšăăźăăăăŚăăŞăăĄă˝ăăăčż˝ĺ ăăŚăăŞăă¸ă§ăŻăăă¤ăłăżăźăă§ă¤ăšă¨ăăŚć¸Ąăăă¨ăă§ăăăăăŤăăăă¨ăćĺłăăžăăďź
type MyInterface interface {
belongToMyInterface() //dummy method definition
}
type MyObject struct{}
func (MyObject) belongToMyInterface(){} //dummy method
ç§ăŻăăăăžăŁăăć¨ĺĽ¨ăăăăšăă§ăŻăŞăă¨ćăăžăă ăăăŻă解湺çă¨ăăăăăŻĺéżçăŽăăăŞăăŽă§ăă ç§ăŻĺäşşçăŤă犺ăŽăĄă˝ăăăä¸čŚăŞăĄă˝ăăĺŽçžŠăăăĄăăĄăŤç˝ŽăăŽă§ăŻăŞăăéçĺăŽć¤č¨źăăăăăă¨ćăŁăŚăăžăă
_ăăăźăĄă˝ăă_ă˘ăăăźăăŽĺéĄăŻćŹĄăŽă¨ăăă§ăă
interface{}
ă˘ăăăźăăăăăăăŤćŞăă§ăă ĺŠç¨ĺŻč˝ăŞăăčŻăă˘ăăăźăăăăăžăă@henryas
ç§ăŻăăŞăăŽ3çŞçŽăŽăă¤ăłăă埡ăč°čŤă¨ăŻčŚăŚăăžăăă äźč¨ĺŁŤăăŞăă¸ă§ăŻăăŽé˘äżăĺĽăŽćšćłă§čĄ¨ç¤şăăăĺ ´ĺăäźč¨ĺŁŤăŻäťć§ăŤĺăŁăçŹčŞăŽă¤ăłăżăźăă§ăźăšăä˝ćă§ăăžăă ăăŠă¤ăăźăăĄă˝ăăăă¤ăłăżăźăă§ă¤ăšăŤčż˝ĺ ăăŚăăăăăćşăăĺ ˇčąĄĺăäťăŽĺ ´ćă§ĺŽçžŠăăăŚăăă¤ăłăżăźăă§ă¤ăšăŽăľăăťăăă¨äşćć§ăăŞăă¨ăăćĺłă§ăŻăăăžăăă
GoăăźăľăźăŻăăŽććłăĺ¤ç¨ăăŚăăăćŁç´ăŞă¨ăăăăăăŻăč¨čŞă§ĺŽčŁ ăăĺż čŚăăăăťăŠăăăąăźă¸ăćšĺăăăăăŻăćłĺăăăă¨ăŻă§ăăžăăă
@asç§ăŽăă¤ăłăăŻăć°ăă_relationshipăăĽăź_ăä˝ćăăăăăłăŤăé˘éŁăăĺ ˇčąĄăŞăă¸ă§ăŻăăć´ć°ăăŚăăăŽăăĽăźăŤç˘şĺŽăŤĺŻžĺżă§ăăăăăŤăăĺż čŚăăăă¨ăăăă¨ă§ăă ăăăčĄăăăăŤăăŞăă¸ă§ăŻăăŻăă°ăă°ćśč˛ťč ăŽăăĄă¤ăłăŤă¤ăăŚçšĺŽăŽäťŽĺŽăăăŞăăă°ăŞăăŞăăŽă§ăăăăŻééăŁăŚăăăăăŤćăăăžăă GoăăźăľăźăŽĺ ´ĺăŽăăăŤăăŞăă¸ă§ăŻăă¨ăłăłăˇăĽăźăăźăĺŻćĽăŤé˘éŁăăŚăăăăĺăăăĄă¤ăłĺ ăŤĺĺ¨ăăĺ ´ĺăăăăŻăăăťăŠéčŚă§ăŻăŞăĺŻč˝ć§ăăăăžăă ăă ăăăŞăă¸ă§ăŻăăäťăŽăăă¤ăăŽăăĄă¤ăłăŤăăŁăŚćśč˛ťăăăĺşćŹçăŞćŠč˝ăćäžăăĺ ´ĺăăăăŻĺéĄăŤăŞăăžăă ăŞăă¸ă§ăŻăăŻă_dummy method_ă˘ăăăźăăćŠč˝ăăăăăŤăäťăŽăăšăŚăŽăăĄă¤ăłăŤă¤ăăŚĺ°ăçĽăĺż čŚăăăăžăă
ăŞăă¸ă§ăŻăăŤĺ¤ăăŽçŠşăŽăĄă˝ăăăă˘ăżăăăăăŚăăžăăžăăăăăăăĺż čŚă¨ăăă¤ăłăżăźăă§ă¤ăšăŻĺĽăŽăăĄă¤ăł/ăăăąăźă¸/ăŹă¤ă¤ăźăŤĺĺ¨ăăăăăăŞăăăăăŽăĄă˝ăăăĺż čŚăŞăŽăăŻčŞč ăŤăŻăăăăžăăă
ă¤ăłăżăźăă§ăźăšăäťăăăŞăźăăłăľă ă˘ăăăźăă§ăŻç°ĄĺăŤĺč¨ă使ç¨ă§ăăŞăă¨ăăçšăŻĺĺăŤĺ Źĺšłă§ăšă ć示çăŞsum-typeă使ç¨ăăă¨ăĺč¨ăç°ĄĺăŤăŞăăžăă ăă ăăăĺč¨ĺăŻĺĺŽĺ ¨ć§ăćäžăăăă¨ăŻé常ăŤç°ăŞăč°čŤă§ăăĺż čŚăŤĺżăăŚăäťćĽă§ăĺĺŽĺ ¨ć§ăĺĺžă§ăăžăă
ăă ăăäťăŽč¨čŞă§ĺŽčŁ ăăăŚăăăŻăăźăşăăľă ăŤăŻ2ă¤ăŽćŹ çšăăăăžăă1ă¤ăŻă大čŚć¨ĄăŞĺćŁéçşăăăťăšă§ăăăăé˛ĺăăăăă¨ăŽéŁăăă§ăă ăăăŚ2ă¤çŽăŻăĺăˇăšăă ăŤĺăĺ ăăă¨ćăăžăăGoăŤăŻăăăťăŠĺźˇĺăŞĺăˇăšăă ăăŞăăŽă弽ăă§ăăăăăŻăĺăŽăłăźăăŁăłă°ăćăă¨ăŠăžăăă䝣ăăăŤăăă°ăŠă ăăłăźăăŁăłă°ăăăăă§ăăăă埡ĺăŞĺăˇăšăă ă§ăŻăăă埡ĺăŞč¨čŞďźHaskellăRustăŞăŠďźăŤç§ťčĄăăžăă
ăăăŻč¨ăŁăŚăăĺ°ăŞăă¨ă2ă¤çŽăŻééăăŞă弽ăżăŽă˛ă¨ă¤ă§ăăăĺćăăă¨ăăŚăăăă¤ăăšé˘ăăăŠăšé˘ăä¸ĺăŁăŚăăă¨čŚăŞăăăăăŠăăăŻăĺäşşçăŞĺĽ˝ăżćŹĄçŹŹă§ăă ăă ććăăăăŁăăŽă§ăăăéăăĺč¨ĺăăŞăă¨ĺĺŽĺ ¨ăŞĺč¨ăĺĺžă§ăăŞăă¨ăăăă¨ăŻăĺŽéăŤăŻçĺŽă§ăŻăăăžăă:)
[1]çšăŤăăăăŻç°Ąĺă§ăŻăăăžăăăăăăă§ăĺŻč˝ă§ăă
type Node interface {
node()
}
type Foo struct {
bar.Baz
}
func (foo) node() {}
@Merovius
ç§ăŻăăŞăăŽ2çŞçŽăŽćŹ çšăŤĺćăăžăăă ć¨ćşăŠă¤ăăŠăŞăŤăŻăĺč¨ĺăăĺ¤ĺ¤§ăŞćŠćľăĺăăĺ ´ćăăăăăăăăžăăăçžĺ¨ăŻçŠşăŽă¤ăłăżăźăă§ă¤ăšă¨ăăăăŻă使ç¨ăăŚĺŽčŁ
ăăăŚăăă¨ăăäşĺŽăŻăăăŽćŹ ĺŚăăłăźăăŁăłă°ăŤćŞĺ˝ąéżăĺăźăăŚăăăă¨ă示ăăŚăăžăă ăăĄăăăăăŽăăăŞăłăźăăŻăăăăć¸ăăăŚăăăŽă§ĺéĄăŻăŞăăĺč¨ĺăŻĺż
čŚăŞăă¨č¨ăäşşăăăăăăăăžăăăăăăŽčŤçăŽćăăăŻăé˘ć°ăŤäťăŽĺăŻĺż
čŚăŞăă¨ăăăă¨ă§ăă署ĺă䝣ăăăŤçŠşăŽă¤ăłăżăźăă§ă¤ăšă使ç¨ăăĺż
čŚăăăăžăă
çžĺ¨ăĺč¨ăżă¤ăă襨ăăăăŤăăă¤ăăŽăĄă˝ăăă§ă¤ăłăżăźăă§ăźăšă使ç¨ăăăă¨ăŤé˘ăăŚă1ă¤ăŽĺ¤§ăăŞćŹ çšăăăăžăă ăăăăŻćéťçăŤĺŽčŁ ăăăŚăăăăăăăŽă¤ăłăżăźăă§ă¤ăšăŤä˝żç¨ă§ăăăżă¤ăăăăăăžăăă éŠĺăŞĺč¨ĺă使ç¨ăăă¨ăĺčŞä˝ăĺŽéăŤä˝żç¨ă§ăăĺăćŁç˘şăŤč¨čż°ăăžăă
ç§ăŻăăŞăăŽ2çŞçŽăŽćŹ çšăŤĺćăăžăăă
ăĺč¨ĺăŻĺă使ç¨ăăăăă°ăŠăăłă°ăäżé˛ăăăă¨ăăăšăăźăăĄăłăăŤĺćăăžăăăăăăă¨ăćŹ çšă§ăăăă¨ăŤĺćăăžăăăďź ăăŞăăćĺăŽăăŽăŤĺćăăŚăăŞăăăăŤćăăăăŽă§ďźăăŞăăŽăłăĄăłăăŻĺşćŹçăŤăăăŽĺăŞăĺ丝埾ă§ăďźăăăŚ2çŞçŽăŤé˘ăăŚăŻăç§ăŻăăăä¸č¨ăŽĺĽ˝ăżćŹĄçŹŹă§ăăăă¨ăčŞăăžăăă
ć¨ćşăŠă¤ăăŠăŞăŤăŻăĺč¨ĺăăĺ¤ĺ¤§ăŞćŠćľăĺăăĺ ´ćăăăăăăăăžăăăçžĺ¨ăŻçŠşăŽă¤ăłăżăźăă§ă¤ăšă¨ăăăăŻă使ç¨ăăŚĺŽčŁ ăăăŚăăă¨ăăäşĺŽăŻăăăŽćŹ ĺŚăăłăźăăŁăłă°ăŤćŞĺ˝ąéżăĺăźăăŚăăăă¨ă示ăăŚăăžăă ăăĄăăăăăŽăăăŞăłăźăăŻăăăăć¸ăăăŚăăăŽă§ĺéĄăŻăŞăăĺč¨ĺăŻĺż čŚăŞăă¨č¨ăäşşăăăăăăăăžăăăăăăŽčŤçăŽćăăăŻăé˘ć°ăŤäťăŽĺăŻĺż čŚăŞăă¨ăăăă¨ă§ăă署ĺă䝣ăăăŤçŠşăŽă¤ăłăżăźăă§ă¤ăšă使ç¨ăăĺż čŚăăăăžăă
ăăŽăżă¤ăăŽç˝éťăŽč°čŤăŻĺŽéăŤăŻĺ˝šăŤçŤăĄăžăăă ç§ăŻăĺč¨ăżă¤ăăĺ ´ĺăŤăăŁăŚăŻçăżăčť˝ć¸ăăăă¨ăŤĺćăăžăă ĺăˇăšăă ăăă埡ĺăŤăăăăšăŚăŽĺ¤ć´ăŻăĺ ´ĺăŤăăŁăŚăŻçăżăčť˝ć¸ăăžăăăĺ ´ĺăŤăăŁăŚăŻçăżă
č°čŤăŻăPython風ăŽĺăˇăšăă ďźĺăŞăďźăžăăŻcoq風ăŽĺăˇăšăă ďźăăšăŚăŽćŁăăăŽč¨źćďźăĺż čŚăăŠăăăŤă¤ăăŚă§ăŻăăăžăăă č°čŤăŻăĺč¨ĺăŽĺŠçšăćŹ çšăä¸ĺăŁăŚăăăăă§ăăĺż čŚăăăă严ćšăčŞăăăă¨ăŻĺ˝šăŤçŤăĄăžăă
FTRăĺäşşçăŤăŻăăŞăźăăłăľă ăżă¤ăďźă¤ăžăăăăšăŚăŽăľă ăżă¤ăăŤćéťçăžăăŻć示çăŞăSomethingElseăăąăźăšăăăďźăŤĺ寞ăăăă¨ăŻăŞăăă¨ă埡調ăăăă¨ćăăžăăăăăŤăăăăŽćčĄçăŞćŹ çšăŽăťă¨ăăŠăčť˝ć¸ăăăžăăăăăďźăťă¨ăăŠăŽĺ ´ĺăăăăăŻé˛ĺăăăŽăéŁăăďźă§ăăăŞăăăăăăăŽćčĄçăŞĺŠçšăŽăťă¨ăăŠăćäžăăžăďźéçĺăă§ăăŻăăăŞăăč¨ĺăăăăăĽăĄăłăăäťăŽăăăąăźă¸ăăĺăĺćă§ăăžăâŚďźă
ăă ăăăŞăźăăłăľă ăŻăaďźé常ăĺč¨ăżă¤ăăčŚćąăăäşşă ăŤă¨ăŁăŚćşčśłăŽăă匼ĺă§ăŻăŞăăbďźGoăăźă ăŤăăĺ ĺŤăäżč¨źăăăŽăŤĺĺăŞĺ¤§ăăŞăĄăŞăăă¨ăŻčŚăŞăăăŞăĺŻč˝ć§ăăăă¨ćăăžăă ăăăăç§ăŻăăăăŽäťŽĺŽăŽăăăăăžăăŻä¸Ąćšă§ééăŁăŚăăăă¨ă訟ćăăăćşĺăă§ăăŚăăžă:)
ăă1ă¤ăŽčłŞĺďź
ć¨ćşăŠă¤ăăŠăŞăŤăŻăĺč¨ĺăăĺ¤ĺ¤§ăŞćŠćľăĺăăĺ ´ćăăăăăăăă¨ăăäşĺŽ
ç§ăŻć¨ćşăŠă¤ăăŠăŞăŽ2ă¤ăŽĺ ´ćăăčăăăăžăăăăăă§ăŻăăăăăŤéčŚăŞĺŠçšăăăă¨ćăăžăăăăăŻăăŞăăŹăŻăă¨ă´ăź/ă˘ăšăă§ăă ăăăŚăăăăŤăăăăăăąăźă¸ăŻăăăăŞăă§ăăžăćŠč˝ăăăăă§ăă ăăŽĺşćşçšăăăăăăŁăˇăăă¨ăé常ăŤăă¨ăăč¨čăŻčŞĺźľăăăŚăăăăăŤčŚăăžăăăăăĄăăăćŁĺ˝ăŞĺ ´ćăăăăăăăă¨ăŻćăăŞăăăăăăžăăă
database/sql/driver.Value
ăŻăĺč¨ĺă§ăăăă¨ăćçăŞĺ ´ĺăăăăžăďźďź23077ăŤč¨čźăăăŚăăžăďźă
https://godoc.corp.google.com/pkg/database/sql/driver#Value
ăă ăă database/sql.Rows.Scan
ăŽăăăăăŞăăŻăŞă¤ăłăżăźăă§ă¤ăšă§ăŻăćŠč˝ă夹ăăăăă¨ăŻăăăžăăă ăšăăŁăłăŻăĺşăŤăŞăĺăint
ĺ¤ăŤčŞăżčžźăăă¨ăă§ăăžăă ĺŽĺ
ăăŠăĄăźăżăźăĺč¨ĺăŤĺ¤ć´ăăăŤăŻăĺ
ĽĺăćéăŽĺăŽăťăăăŤĺśéăăĺż
čŚăăăăžăă
https://godoc.corp.google.com/pkg/database/sql#Rows.Scan
@Merovius
ăŞăźăăłăľă ăżă¤ăďźă¤ăžăăăăšăŚăŽăľă ăżă¤ăăŤăŻćéťçăžăăŻć示çăŞăSomethingElseăăąăźăšăăăăžăďźă¨ăŻĺŻžç §çă§ăŻăăăžăăăćčĄçăŞćŹ çšăŽăťă¨ăăŠăčť˝ć¸ăăăăăă§ăďźăťă¨ăăŠăŽĺ ´ĺăé˛ĺăĺ°éŁă§ăďźă
ăŻăăźăşăăľă ăŽăé˛ĺăăăŽăéŁăăăĺéĄăčť˝ć¸ăăäťăŽăŞăăˇă§ăłăĺ°ăŞăă¨ă2ă¤ăăăžăă
1ă¤ăŻăĺŽéăŤăŻĺč¨ăŽä¸é¨ă§ăŻăŞăăżă¤ăă§ăŽä¸č´ă訹ĺŻăăăă¨ă§ăă 揥ăŤăĺč¨ăŤăĄăłăăźăčż˝ĺ ăăăŤăŻăćĺăŤăăŽăłăłăˇăĽăźăăźăć´ć°ăăŚć°ăăăĄăłăăźă¨ç §ĺăăăłăłăˇăĽăźăăźăć´ć°ăăăĺžă§ăŽăżĺŽéăŤăăŽăĄăłăăźăčż˝ĺ ăăžăă
ăă1ă¤ăŻăăä¸ĺŻč˝ăŞăăĄăłăăźă訹ĺŻăăăă¨ă§ăăă¤ăžăăä¸č´ă§ăŻć示çăŤč¨ąĺŻăăăŚăăăăĺŽéăŽĺ¤ă§ăŻć示çăŤč¨ąĺŻăăăŚăăŞăăĄăłăăźă§ăă ĺč¨ăŤăĄăłăăźăčż˝ĺ ăăăŤăŻăćĺăŤăăăä¸ĺŻč˝ăŞăĄăłăăźă¨ăăŚčż˝ĺ ăă揥ăŤăłăłăˇăĽăźăăźăć´ć°ăăćĺžăŤć°ăăăĄăłăăźăĺŻč˝ăŞăăăŤĺ¤ć´ăăžăă
database/sql/driver.Value
ăŻăĺč¨ĺă§ăăăă¨ăćçăŞĺ ´ĺăăăăžă
ĺćăăžăăăăăăŤă¤ăăŚçĽăăžăăă§ăăă ăăăă¨ă ďźďź
1ă¤ăŻăĺŽéăŤăŻĺč¨ăŽä¸é¨ă§ăŻăŞăăżă¤ăă§ăŽä¸č´ă訹ĺŻăăăă¨ă§ăă 揥ăŤăĺč¨ăŤăĄăłăăźăčż˝ĺ ăăăŤăŻăćĺăŤăăŽăłăłăˇăĽăźăăźăć´ć°ăăŚć°ăăăĄăłăăźă¨ç §ĺăăăłăłăˇăĽăźăăźăć´ć°ăăăĺžă§ăŽăżĺŽéăŤăăŽăĄăłăăźăčż˝ĺ ăăžăă
čĺłćˇąăă˝ăŞăĽăźăˇă§ăłă
@Meroviusă¤ăłăżăźăă§ăźăšăŻăćŹčłŞçăŤçĄéĺĺăŽăăĄăăŞăźă§ăă ăăšăŚăŽĺč¨ăżă¤ăăŻăçĄéă§ăăăă¨ăŞăăăă¨ă default:
ĺ ´ĺăăăăžăă ăă ăăćéĺč¨ăżă¤ăăăŞăĺ ´ĺă default:
ăŻăăăăŤă¤ăăŚçĽăăŞăăŁăćĺšăŞăąăźăšăăžăăŻăăă°ăŠă ăŽăŠăăăŤăă°ăăăçĄĺšăŞăąăźăšăŽăăăăăćĺłăăžăăćéĺč¨ăŽĺ ´ĺăĺč
ăŽăżă§ăăăĺžč
ăŻăăăžăăă
json.Tokenăăăłsql.Null *ăżă¤ăăŻăäťăŽć¨ćşçăŞäžă§ăă go / typesăŻăgo / astă¨ĺăăăăŤăĄăŞăăăăăăžăă ĺ é¨çść ăŽăăĄă¤ăłăĺśéăăăă¨ă§ăč¤éăŞé 玥ăŽăăăă°ă¨ăăšăăç°ĄĺăŤăŞăăă¨ăŻăšăăźăăăăAPIăŤăŻăŞăäžăăăăăăăă¨ćăăžăă ăăăăŻăä¸čŹçăŞăŠă¤ăăŠăŞăŽăăăŞăăŻAPIă§ăŻăăžăçşçăăŞăĺ é¨çść ăă˘ăăŞăąăźăˇă§ăłăŽĺśç´ăŤćă彚çŤă¤ă¨ćăăžăăăăăă§ăćă 使ç¨ăăăžăă
ĺäşşçăŤăŻăĺč¨ăżă¤ăăŻGoăŤĺĺăŞčż˝ĺ ăŽăăŻăźăä¸ăăžăăăăăžăĺ¤ăăŻăŞăă¨ćăăžăă Goĺăˇăšăă ăŤăŻćŹ çšăăăăžăăăăă§ăŤé常ăŤĺŞăăŚăăŚćčťć§ăăăăžăă ĺăˇăšăă ă¸ăŽGo2ăŽčż˝ĺ ăŻăăă§ăŤĺĺ¨ăăăăŽăťăŠĺ¤ăăŽéťĺăćäžăăăă¨ăŻăăăžăăăĺż čŚăŞăăŽăŽ80ă90ďź ăŻăă§ăŤé 罎ăăăŚăăžăă ă¤ăžăăă¸ă§ăăŞăăŻăšă§ăăăĺşćŹçăŤć°ăăăă¨ăĺŽčĄă§ăăăăă§ăŻăăăžăăăă¤ăžăăăă§ăŤĺŽčĄăăŚăăăă¨ăăăăĺŽĺ ¨ăŤăăăç°ĄĺăŤăăăăăăŠăźăăłăšçăŤăăăĺŞăăăăźăŤăĺŻč˝ăŤăăćšćłă§ĺŽčĄă§ăăăăăŤăŞăăžăă ĺč¨ĺăŻäźźăŚăăžăăăimoă§ăďźăă ăăăăă1ă¤ăžăăŻäťăŽă¸ă§ăăŞăăŻă§ăăĺ ´ĺăŻăćăăăŤĺŞĺ ăăăžăďźăăăŚăăăăăŻăăŞăăăžăăă˘ăŤăŞăăžăďźďźă
ĺč¨ăżă¤ăăŽăšă¤ăăă§çĄé˘äżăŞăăăŠăŤăă訹ĺŻăďźăăšăŚăŽăąăźăš+ăăăŠăŤăă訹ĺŻďźăăłăłăă¤ăŠăźăŤçś˛çž ć§ă埡ĺśăăăŞăĺ ´ĺďźăŞăłăżăźăŻĺŻč˝ă§ăăďźăĺč¨ăŤăąăźăšăčż˝ĺ ăăăŽăŻĺăăăăç°Ąĺă§ăďźăăăŚĺăăăăéŁăăă§ăďź ďźäťăŽăăăŞăăŻAPIăĺ¤ć´ăăĺ ´ĺă
json.Tokenăăăłsql.Null *ăżă¤ăăŻăäťăŽć¨ćşçăŞäžă§ăă
ăăźăŻăł-確ăăŤă ASTĺéĄăŽĺĽăŽă¤ăłăšăżăłăšďźĺşćŹçăŤăăăšăŚăŽăăźăľăźăŻĺč¨ăżă¤ăăŽćŠćľăĺăăžăďźă
ăă ăăsql.Null *ăŽăĄăŞăăăŻăăăăžăăă ă¸ă§ăăŞăăŻăăŞăĺ ´ĺďźăžăăŻăéćłăŽăă¸ă§ăăŞăăŻăŞăăˇă§ăłăăŤăă¤ăłăčż˝ĺ ăăĺ ´ĺďźă§ăăĺăĺż
čŚă§ăăă type NullBool enum { Invalid struct{}; Value Int }
ă¨type NullBool struct { Valid bool; Value Int }
éăŤĺ¤§ăăŞéăăŻăŞăăăă§ăă ăŻăăéăăăăăă¨ăŻćżçĽăăŚăăžăăăăăăŻăťă¨ăăŠăăăžăăă
ĺč¨ăżă¤ăăŽăšă¤ăăă§çĄé˘äżăŞăăăŠăŤăă訹ĺŻăďźăăšăŚăŽăąăźăš+ăăăŠăŤăă訹ĺŻďźăăłăłăă¤ăŠăźăŤçś˛çž ć§ă埡ĺśăăăŞăĺ ´ĺďźăŞăłăżăźăŻĺŻč˝ă§ăăďźăĺč¨ăŤăąăźăšăčż˝ĺ ăăăŽăŻĺăăăăç°Ąĺă§ăďźăăăŚĺăăăăéŁăăă§ăďź ďźäťăŽăăăŞăăŻAPIăĺ¤ć´ăăĺ ´ĺă
ä¸č¨ăĺç §ă ăăăăŻç§ăăŞăźăăłăľă ă¨ĺźăă§ăăăăŽă§ăăăç§ăŻăăăăŤĺ寞ăăŚăăžăăă
ăăăăŻç§ăăŞăźăăłăľă ă¨ĺźăă§ăăăăŽă§ăăăç§ăŻăăăăŤĺ寞ăăŚăăžăăă
ç§ăŽĺ ˇä˝çăŞććĄăŻhttps://github.com/golang/go/issues/19412#issuecomment-323208336ă§ăăăăŞăźăăłăŽĺŽçžŠăćşăăĺŻč˝ć§ăăăă¨ćăăžăăăăžă ĺ°ăăŠăă§ăăăăžă ăžă ăăă¨ç˘şäżĄăăŚăăžăăĺăĺ¤ăăŚçŁ¨ăăžăă çšăŤăăăšăŚăŽăąăźăšăăŞăšăăăăŚăăŚăăăăăŠăŤăăŽăąăźăšă訹厚ĺŻč˝ă§ăăăă¨ăć確ă§ăŞăăă¨ăŤć°ăĽăăăŽă§ăăăăć´ć°ăăžăăă
ăŞăăˇă§ăłĺăŻĺč¨ĺăŽăăŠăźă˘ăăŞă§ăŻăŞăăă¨ăŤĺćăăžăăă ăăăăăăăăŻé常ăŤĺŞăăŚăăăă¸ă§ăăŞăăŻăšă§ććăăŚăăăăăŤă
type Nullable(T) pick { // or whatever syntax (on all counts)
Null struct{}
Value T
}
ä¸ĺşŚăăăšăŚăŽăąăźăšăăŤăăźăăăŽăŻç´ ć´ăăăăă¨ă§ăă ăăăăăăŞăăććăăŚăăăăăŤăä¸čŹçăŞčŁ˝ĺďźć§é ä˝ďźă§ăĺăăă¨ăă§ăăžăă Valid = falseăValueďź= 0ăŽçĄĺšăŞçść ăăăăžăăăăŽăˇăăŞăŞă§ăŻă1 + TăťăŠĺ°ăăăŞăăŚăă2⨯Tăĺ°ăăăăăĺéĄăçşçăăŚăăĺ ´ĺăŻç°ĄĺăŤć šçľśă§ăăžăă
ăăĄăăăĺ¤ăăŽăąăźăšă¨ĺ¤ăăŽéč¤ăăä¸ĺ¤ćĄäťśăĺŤăăăč¤éăŞĺč¨ă§ăăĺ ´ĺăé˛ĺžĄçăŞăăă°ăŠăăłă°ă§ăééăăçŻăăăăăééăăçşčŚăăăŽăéŁăăăŞăăžăăăăăăŁăŚăä¸ĺŻč˝ăŞăăŽăăžăŁăăăłăłăă¤ăŤăăŞăăăăŤăăă¨ăĺ¤ăăŽéŤŞăçŻç´ă§ăăžăăĺźăŁĺźľăă
ăăźăŻăł-確ăăŤă ASTĺéĄăŽĺĽăŽă¤ăłăšăżăłăšďźĺşćŹçăŤăăăšăŚăŽăăźăľăźăŻĺč¨ăżă¤ăăŽćŠćľăĺăăžăďźă
ç§ăŻăăă¤ăăŽĺ Ľĺăĺăĺăăăăă¤ăăŽĺŚçăčĄăăăăă¤ăăŽĺşĺăçćăăĺ¤ăăŽăăă°ăŠă ăä˝ćăăžăăé常ăăăăĺ帰çăŤĺ¤ăăŽăăšăŤĺĺ˛ăăĺ ĽĺăăąăźăšăŤĺĺ˛ăăăăăăŽăąăźăšăŤĺşăĽăăŚĺ¤ćăăžăăĺż čŚăŞĺşĺă ç§ăŻćĺéăăăźăľăźăć¸ăăŚăăăăă§ăŻăŞăăăăăăžăăăďźç˘şăăŤăăă漽ăăăăă§ăďźďźăASTăŽĺéĄăŻăĺ¤ăăŽăłăźăăŤĺ˝ăŚăŻăžăăžăăçšăŤăĺĽĺŚăŞăăŽăĺ¤ăăăĺäťăŞăă¸ăăšăă¸ăăŻăćąăĺ ´ĺăŻăăă§ăăç§ăŽĺ°ăăŞé ăŤĺăžăčŚäťśă¨ă¨ăă¸ăąăźăšă
ä¸čŹçăŞăŠă¤ăăŠăŞăä˝ćăăŚăăă¨ăăŻăETLăĺŽčĄăăăă犺ćłçăŞăŹăăźăăä˝ćăăăăçść XăŽăŚăźăśăźăZă¨ăăźăŻăăăŚăăŞăĺ ´ĺăŤă˘ăŻăˇă§ăłYăçşçăăăă¨ă確čŞăăăăăăťăŠăAPIăŤčĄ¨ç¤şăăăžăăăä¸čŹçăŞăŠă¤ăăŠăŞă§ăăă10ĺăŽăăăă°ă1ç§ăŤç縎ăăă ăă§ăăĺ é¨çść ăĺśéă§ăăă¨ĺ˝šçŤă¤ĺ ´ćăčŚă¤ăăăžăăăăăłăłăă¤ăŠăééăŁăŚăăă¨č¨ăŁăăă
çšăŤGoăŽĺ ´ĺăĺč¨ăżă¤ăă使ç¨ăă1ă¤ăŽĺ ´ćăŻă1ă¤ăŽă´ăŤăźăăłăŤ3ă¤ăŽăăŁăłăăĺĽăŽă´ăŤăźăăłăŤ2ă¤ăŽăăŁăłăä¸ăăĺż
čŚăăăăăŁăăŤăŽćăé¸ćăăă´ăŤăźăăłă§ăă chan stuct { kind MsgKind; a A; b B; c C }
ăŻă§ăăžăăă chan A
ă chan B
ă chan C
čś
ăăŚchan pick { a A; b B; c C }
ă使ç¨ă§ăăăăăŤăŞăăăăŤä˝ă辡ăăŁăŚăăăŽăă追补ăăăŽăŤĺ˝šçŤăĄăžăä˝ĺăŞăšăăźăšă¨ĺ°ăŞăć¤č¨źăç ç˛ăŤăăŚăăăłăă§äťäşăăăžăă
ć°ăăăżă¤ăăŽäťŁăăăŤăć˘ĺăŽă¤ăłăżăźăă§ă¤ăšăżă¤ăăšă¤ăăćŠč˝ă¸ăŽčż˝ĺ ă¨ăăŚăŽăłăłăă¤ăŤćăŽăżă¤ăăŞăšăăă§ăăŻăŻăŠăă§ăăďź
func main() {
if FlipCoin() == false {
printCertainTypes(FlipCoin(), int(5))
} else {
printCertainTypes(FlipCoin(), string("5"))
}
}
// this function compiles with main
func printCertainTypes(flip bool, in interface{}) {
if flip == false {
switch v := in.(type) {
case int:
fmt.Printf(âinteger %v\nâ, v)
default:
fmt.Println(v)
}
} else {
switch v := in.(type) {
case int:
fmt.Printf(âinteger %v\nâ, v)
case string:
fmt.Printf(âstring %v\nâ, v)
}
}
}
// this function compiles with main
func printCertainTypes(flip bool, in interface{}) {
switch v := in.(type) {
case int:
fmt.Printf(âinteger %v\nâ, v)
case bool:
fmt.Printf(âbool %v\nâ, v)
}
fmt.Println(flip)
switch v := in.(type) {
case string:
fmt.Printf(âstring %v\nâ, v)
case bool:
fmt.Printf(âbool 2 %v\nâ, v)
}
}
// this function emits a type switch not complete error when compiled with main
func printCertainTypes(flip bool, in interface{}) {
if flip == false {
switch v := in.(type) {
case int:
fmt.Printf(âinteger %v\nâ, v)
case bool:
fmt.Printf(âbool %v\nâ, v)
}
} else {
switch v := in.(type) {
case string:
fmt.Printf(âstring %v\nâ, v)
case bool:
fmt.Printf(âbool %v\nâ, v)
}
}
}
// this function emits a type switch not complete error when compiled with main
func printCertainTypes(flip bool, in interface{}) {
fmt.Println(flip)
switch v := in.(type) {
case int:
fmt.Printf(âinteger %v\nâ, v)
case bool:
fmt.Printf(âbool %v\nâ, v)
}
}
ĺ ŹĺšłăćăăăăŤăçžĺ¨ăŽĺăˇăšăă ă§ĺč¨ĺăćŚçŽăăćšćłăć¤č¨ăăăăăăŽéˇćă¨çćăćŻčźć¤č¨ăăĺż čŚăăăăžăă äťăŤä˝ăăŞăĺ ´ĺăăăăŻćŻčźăŽăăăŽăăźăšăŠă¤ăłăćäžăăžăă
ć¨ćşçăŞć掾ăŻăăżă°ă¨ăăŚă¨ăŻăšăăźăăăăŚăăŞăăä˝ăăăŞăăĄă˝ăăăćă¤ă¤ăłăżăźăă§ăźăšă§ăă
ăăăŤĺŻžăă1ă¤ăŽč°čŤăŻăĺč¨ăŽĺăżă¤ăăŤăăŽăżă°ăĺŽçžŠăăĺż čŚăăăă¨ăăăă¨ă§ăă ăăăŻĺłĺŻăŤăŻçĺŽă§ăŻăăăžăăăĺ°ăŞăă¨ăć§é ä˝ă§ăăăĄăłăăźăŤă¤ăăŚăŻă揥ăŽăă¨ăă§ăăžăă
type Sum interface { sum() }
type sum struct{}
func (sum) sum() {}
ăăŽ0ĺš ăŽăżă°ăć§é ä˝ăŤĺăčžźăă ăă§ăă
ăŠăăăźăĺ°ĺ Ľăăăă¨ă§ăĺč¨ăŤĺ¤é¨ăżă¤ăăčż˝ĺ ă§ăăžă
type External struct {
sum
*pkg.SomeType
}
ăăăŻĺ°ăä¸ć źĺĽ˝ă§ăăă
ĺč¨ăŽăăšăŚăŽăĄăłăăźăĺ ąéăŽĺä˝ăĺ ąćăăĺ ´ĺăăăăăŽăĄă˝ăăăă¤ăłăżăźăă§ăźăšĺŽçžŠăŤĺŤăăăă¨ăă§ăăžăă
ăăŽăăăŞć§ćă§ăŻăĺăĺč¨ăŤĺŤăžăăŚăăă¨ăŻč¨ăăžăăăăăŽĺč¨ăŤĺŤăžăăŚăăŞăăăŽăŻăăăăžăăă ĺż
é ăŽnil
ĺ ´ĺăŤĺ ăăŚăĺăĺăčžźăżăăŞăăŻă揥ăŽăăăŞĺ¤é¨ăăăąăźă¸ă§ä˝żç¨ă§ăăžăă
import "p"
var member struct {
p.Sum
}
ăăăąăźă¸ĺ ă§ăŻăăłăłăă¤ăŤăăăŚăéćłăŞĺ¤ăć¤č¨źăăăăăŤćł¨ćăăĺż čŚăăăăžăă
ĺŽčĄćăŤăăă¤ăăŽĺĺŽĺ
¨ć§ăĺ垊ăăăŤăŻăăăžăăžăŞćšćłăăăăžăă ĺč¨ă¤ăłăżăźăă§ăźăšăŽĺŽçžŠăŤvalid() error
ăĄă˝ăăăĺŤăă揥ăŽăăăŞé˘ć°ăçľăżĺăăăŚăăăă¨ăăăăăžăăă
func valid(s Sum) error {
switch s.(type) {
case nil:
return errors.New("pkg: Sum must be non-nil")
case A, B, C, ...: // listing each valid member
return s.valid()
}
return fmt.Errorf("pkg: %T is not a valid member of Sum")
}
2税éĄăŽć¤č¨źăĺćăŤčĄăăă¨ăă§ăăăŽă§äžżĺŠă§ăă ăăžăăžĺ¸¸ăŤćĺšăŞăĄăłăăźăŽĺ ´ĺă揥ăŽăăăŞĺŽĺćăĺéżă§ăăžăă
type alwaysValid struct{}
func (alwaysValid) valid() error { return nil }
ăăŽăăżăźăłăŤé˘ăăăăä¸čŹçăŞä¸ćşăŽ1ă¤ăŻăgodocă§ĺč¨ăŽăĄăłăăźăˇăăăć確ăŤăŞăăŞăăă¨ă§ăă ăžăăăĄăłăăźăé¤ĺ¤ăăăă¨ăŻă§ăăăă¨ăŤăăć¤č¨źăăĺż
čŚăăăăăăăăăĺéżăăç°ĄĺăŞćšćłăăăăžăăăăăźăĄă˝ăăăă¨ăŻăšăăźăăăăă¨ă§ăă
ăă䝼ĺ¤ăŽă
//A Node is one of (list of types).
type Node interface { node() }
ć¸ăăžă
//A Node is only valid if it is defined in this package.
type Node interface {
//Node is a dummy method that signifies that a type is a Node.
Node()
}
誰ăăNode
ăćşăăăŽăć˘ăăăă¨ăŻă§ăăŞăăŽă§ăä˝ăăăăŽăăçĽăăăăťăăăăă§ăăăă ăăăŤăăăăŠăŽăżă¤ăăNode
ďźä¸ĺ¤ŽăŞăšăăŞăďźăćşăăăăä¸çŽă§ăăăăžăăăăçžĺ¨čĄ¨ç¤şăăŚăăçšĺŽăŽăżă¤ăăNode
ćşăăăăŠăăăŻăăăăžăă
ăăŽăăżăźăłăŻăĺč¨ăŽăżă¤ăăŽĺ¤§é¨ĺăĺăăăăąăźă¸ă§ĺŽçžŠăăăŚăăĺ ´ĺăŤĺ˝šçŤăĄăžăă ăŞăĺ ´ĺăä¸čŹçăŞć掾ăŻă json.Token
ădriver.Value
ăăăŤă interface{}
ăŤăăŠăźăŤăăăŻăăăă¨ă§ăă ĺăŽăăżăźăłăăăăăăŽăŠăăăźăżă¤ăă§ä˝żç¨ăăăă¨ăă§ăăžăăăćçľçăŤăŻinterface{}
ăŞăăăăăťă¨ăăŠćĺłăăăăžăăă ăăŽăăăŞĺ¤ăăăăąăźă¸ăŽĺ¤é¨ăăćĽăă¨äşćłăăăĺ ´ĺăŻă礟ĺćŁăăăăăĄăŻăăŞăĺŽçžŠă§ăăžăă
//Sum is one of int64, float64, or bool.
type Sum interface{}
func New(v interface{}) (Sum, error) {
switch v.(type) {
case nil:
return errors.New("pkg: Sum must be non-nil")
case int64, float64, bool:
return v
}
return fmt.Printf("pkg: %T is not a valid member of Sum")
}
ĺč¨ăŽä¸čŹçăŞä˝żç¨ćłăŻăăĺ¤ăŞăăă¨ăăźăăŽĺŻč˝ć§ăăăĺ¤ăăĺşĺĽăăĺż čŚăăăăŞăăˇă§ăłĺă§ăă ăăăčĄăăŤăŻ2ă¤ăŽćšćłăăăăžăă
*T
ăŻă nil
ăă¤ăłăżăźă¨ăăŚĺ¤ăăŞăăă¨ă示ăănil䝼ĺ¤ăŽăă¤ăłăżăźăŽĺç
§ă解é¤ăăçľćă¨ăăŚďźăăăăďźăźăĺ¤ă示ăăžăă
䝼ĺăŽă¤ăłăżăźăă§ăźăšăăźăšăŽčżäźźăăăăłĺśéäťăăŽă¤ăłăżăźăă§ăźăšă¨ăăŚĺč¨ăżă¤ăăĺŽčŁ ăăăăăŽăăžăăžăŞććĄă¨ĺć§ăŤăăăăŤăŻčż˝ĺ ăŽăă¤ăłăżăźéĺç §ă¨ĺŻč˝ăŞăăźăĺ˛ăĺ˝ăŚăĺż čŚă§ăă
ăŞăăˇă§ăłăŽĺ ´ĺăăăăŻsqlăăăąăźă¸ăŽććłă使ç¨ăăŚĺéżă§ăăžăă
type OptionalT struct {
Valid bool
Value T
}
ăăăŽä¸ťăŞćŹ çšăŻăçĄĺšăŞçść ăă¨ăłăłăźăă§ăăăă¨ă§ăăćĺšăŻfalseă§ăăăĺ¤ăŻăźă䝼ĺ¤ă§ăăĺŻč˝ć§ăăăăžăă ValidăfalseăŽĺ ´ĺăŤValueăĺĺžăăăă¨ăă§ăăžăďźăă ăăćĺŽăăăŚăăŞăĺ ´ĺăŤăźăTăĺż čŚăŞĺ ´ĺăŻäžżĺŠă§ăďźă ĺ¤ăăźăăŤăăăŤValidăfalseăŤč¨ĺŽăăĺžăValueăĺ˛ăĺ˝ăŚăăŤValidătrueăŤč¨ĺŽďźăžăăŻçĄčŚďźăăă¨ă䝼ĺăŤç ´ćŁăăăĺ¤ă誤ăŁăŚĺ襨示ăăăžăă ăăăŻăăżă¤ăăŽä¸ĺ¤ćĄäťśăäżčˇăăăăăŽăťăăżăźă¨ă˛ăăżăźăćäžăăăă¨ă§ĺéżă§ăăžăă
ĺč¨ĺăŽćăĺç´ăŞĺ˝˘ĺźăŻăĺ¤ă§ăŻăŞăIDăć°ăŤăăĺ ´ĺă§ăďźĺćĺă
Goă§ăăăĺŚçăăĺžćĽăŽćšćłăŻăconst / iotaă§ăă
type Enum int
const (
A Enum = iota
B
C
)
OptionalT
ăżă¤ăă¨ĺć§ăŤăăăăŤăŻä¸čŚăŞéćĽ
ăăŽăżă¤ăăŽĺşćŹçăŞć°ăŽĺéĄăăăăžăă A+B == C
ă ĺăŞăăŽçŠĺĺŽć°ăăăŽĺăŤĺ¤ćăăăŽăŻĺ°ăç°Ąĺăăăžăă ăăăćăžăăĺ ´ćăŻăăăăăăăžăăăç§ăăĄăŻä˝ăăăŁăŚăăăăćăŤĺ
Ľăăžăă ĺ°ăä˝ĺăŞä˝ćĽăčĄăă ăă§ăăăăIDă ăăŤĺśéă§ăăžăă
type Enum struct { v int }
var (
A = Enum{0}
B = Enum{1}
C = Enum{2}
)
çžĺ¨ăăăăăŻä¸éćăŞăŠăăŤă§ăă ăăăăćŻčźăăăă¨ăŻă§ăăžăăăăăă ăă§ăă ćŽĺżľăŞăăăäťă§ăŻć常ć§ă夹ăăžăăăăăăĺ°ăä˝ćĽăčĄăăă¨ă§ăăăĺăćťăăă¨ăă§ăăžăăă
func A() Enum { return Enum{0} }
func B() Enum { return Enum{1} }
func C() Enum { return Enum{2} }
ăă¤ăŠăźăăŹăźăă¨é常ăŤă¤ăłăŠă¤ăłĺĺŻč˝ăŞé˘ć°ĺźăłĺşăăç ç˛ăŤăăŚăĺ¤é¨ăŚăźăśăźăĺĺăĺ¤ć´ă§ăăŞăăă¨ăĺăćťăăžăăă
ăă ăăĺăăťăźĺŽĺ
¨ăŤéăăŚăăăăăăăăŻă¤ăłăżăźăă§ă¤ăšăŽĺč¨ăăăăăă¤ăăŽçšă§ĺŞăăŚăăžăă ĺ¤é¨ăłăźăăŻA()
ă B()
ăăžăăŻC()
ăŽăżă使ç¨ă§ăăžăă varăŽäžăŽăăăŤăŠăăŤăĺ
Ľăćżăăăă¨ăŻă§ăăă A() + B()
ăĺŽčĄăăăă¨ăă§ăăžăăăăžăă Enum
ĺż
čŚăŞăĄă˝ăăăčŞçąăŤĺŽçžŠă§ăăžăă ĺăăăăąăźă¸ĺ
ăŽăłăźăă誤ăŁăŚĺ¤ăä˝ćăžăăŻĺ¤ć´ăăĺŻč˝ć§ăŻăăăžăăăăăă辡ăăăŞăăăăŤćł¨ćăăă°ăăăăŻć¤č¨źăłăźăăĺż
čŚă¨ăăŞăćĺăŽĺč¨ăżă¤ăă§ăăĺĺ¨ăăĺ ´ĺăŻćĺšă§ăă ă
ĺ¤ăăŽăŠăăŤăăăăăăăăŽăăă¤ăăŤăŻčż˝ĺ ăŽćĽäťăăăăăŠăăŤăŤăŻĺă税éĄăŽăăźăżăăăĺ ´ĺăăăăžăă 3ă¤ăŽĺ¤ăŽăŞăçść ďźAăBăCďźă2ă¤ăŻćĺĺĺ¤ďźDăEďźăăă1ă¤ăŻćĺĺĺ¤ă¨intĺ¤ďźFďźăćă¤ĺ¤ăăăă¨ăăžăă ä¸č¨ăŽćŚčĄăăăă¤ăçľăżĺăăăŚä˝żç¨ââăăăă¨ăă§ăăžăăăćăç°ĄĺăŞćšćłăŻćŹĄăŽă¨ăăă§ăă
type Value struct {
Which int // could have consts for A, B, C, D, E, F
String string
Int int
}
ăăăŻä¸č¨ăŽOptionalT
ăżă¤ăăŤăăäźźăŚăăžăăăăăźăŤĺ¤ăŽäťŁăăăŤĺćĺăăăă Which
ĺ¤ăŤĺżăăŚč¨ĺŽă§ăăďźăžăăŻč¨ĺŽă§ăăŞăďźč¤ć°ăŽăăŁăźăŤăăăăăžăă ć¤č¨źă§ăŻăăăăăéŠĺăŤč¨ĺŽăăăŚăăďźăžăăŻč¨ĺŽăăăŚăăŞăďźăă¨ăŤćł¨ćăăĺż
čŚăăăăžăă
Goă§ă揥ăŽăăăăăă襨çžăăćšćłăŻăăăăăăăžăă äťăŽäşşăăă注ćăĺż čŚăŞäşşăăăžăă ĺ¤ăăŽĺ ´ĺăĺŽčĄćăŤä¸ĺ¤ćĄäťśăŽă1ă¤ăăžăăŻçĄé˘äżăŞéćĽĺç §ăć¤č¨źăăĺż čŚăăăăžăă 彟ăĺ ¨ĺĄăĺ ąćăă丝ăŞćŹ çšăŻăč¨čŞăŽä¸é¨ă§ăŻăŞăč¨čŞă§ăˇăăĽăŹăźăăăăŚăăăăăăăŽ1ă¤ăăŽä¸ĺ¤ćĄäťśăreflectăžăăŻgo / typesăŤčĄ¨ç¤şăăăăăĄăżăăă°ăŠăăłă°ăĺ°éŁăŤăŞăăă¨ă§ăă彟ăă ăĄăżăăă°ăŠăăłă°ă§ăăăă使ç¨ăăăŤăŻăĺč¨ăŽćŁăăăăŹăźăăźăčŞčăăŚć¤č¨źă§ăăĺż čŚăăăăžăăăžăăăăăăăăăŽä¸ĺ¤ćĄäťśăăŞăćĺšăŞăłăźăăŤăăäźźăŚăăăăăăăăć˘ăăŚăăăăŽă§ăăă¨č¨ăăăĺż čŚăăăăžăă
ĺč¨ăżă¤ăăč¨čŞăŽä¸é¨ă§ăăĺ ´ĺăăăăăŻă˝ăźăšăłăźăăŤĺć ăăăç°ĄĺăŤĺźăĺşăăăĺŻč˝ć§ăăăăăăŽçľćăăŠă¤ăăŠăŞă¨ăăźăŤăćšĺăăăžăă ăłăłăă¤ăŠăźăŻăăăŽă1ă¤ăăŽä¸ĺ¤ćĄäťśăčŞčăăŚăăă°ăăăă¤ăăŽćéŠĺăčĄăăă¨ăă§ăăžăă ăăă°ăŠăăźăŻăĺ¤ăĺŽéăŤćŁăăăăĄă¤ăłăŤăăăă¨ă確čŞăăă¨ăăäşç´°ăŞăĄăłăăăłăšă§ăŻăŞăăéčŚăŞć¤č¨źăłăźăăŤéä¸ăăăă¨ăă§ăăžăă
ăăŽăăăŞć§ćă§ăŻăĺăĺč¨ăŤĺŤăžăăŚăăă¨ăŻč¨ăăžăăăăăŽĺč¨ăŤĺŤăžăăŚăăŞăăăŽăŻăăăăžăăă ĺż é ăŽnilăŽĺ ´ĺăŤĺ ăăŚăĺăĺăčžźăżăăŞăăŻă揥ăŽăăăŞĺ¤é¨ăăăąăźă¸ă§ä˝żç¨ă§ăăžăă
[âŚ]
ăăăąăźă¸ĺ ă§ăŻăăłăłăă¤ăŤăăăŚăéćłăŞĺ¤ăć¤č¨źăăăăăŤćł¨ćăăĺż čŚăăăăžăă
ăŠăăăŚďź ăăăąăźă¸ăŽä˝č
ă¨ăăŚăăăăŻç§ăŤăŻăăăŞăăŽĺéĄăăŽé ĺăŤăăŁăăă¨čŚăăžăă io.Reader
ă渥ăăŚăăăŽRead
ăĄă˝ăăăăăăăŻăŤăŞăŁăĺ ´ĺăç§ăŻăăăăĺ垊ăăă¤ăăăŻăŞăăăă ăăăăŻăŤéĽăăăžăă ĺć§ăŤăç§ă厣č¨ăăăżă¤ăăŽçĄĺšăŞĺ¤ăä˝ćăăăăăŤéŞéăŤăŞăŁăĺ ´ĺăç§ăŻčŞ°ă¨č°čŤăăžăăďź ă¤ăžăăăă¨ăăĽăŹăźăăăăăŻăăźăşăăľă ăĺăčžźăă ăă¨ăăĺéĄăŻăĺśçśăŤçşçăăăă¨ăŻăăŁăăŤăăăžăăă
ăăăŻč¨ăŁăŚăăă¤ăłăżăźăă§ăźăšătype Sum interface { sum() Sum }
ĺ¤ć´ăăăăšăŚăŽĺ¤ăăăčŞä˝ăčżăăăăŤăăăă¨ă§ăăăŽĺéĄăé˛ăăă¨ăă§ăăžăă ăăăăă°ă sum()
ăŽăŞăżăźăłă使ç¨ă§ăăžăăăăăŻăĺăčžźăżăŽä¸ă§ăćŁĺ¸¸ăŤĺä˝ăăžăă
ăăŽăăżăźăłăŤé˘ăăăăä¸čŹçăŞä¸ćşăŽ1ă¤ăŻăgodocă§ĺč¨ăŽăĄăłăăźăˇăăăć確ăŤăŞăăŞăăă¨ă§ăă
ăăăŻăăŞăăĺŠăăăăăăăžăăă
ăăăŽä¸ťăŞćŹ çšăŻăçĄĺšăŞçść ăă¨ăłăłăźăă§ăăăă¨ă§ăăćĺšăŻfalseă§ăăăĺ¤ăŻăźă䝼ĺ¤ă§ăăĺŻč˝ć§ăăăăžăă
ăăăŻç§ăŤă¨ăŁăŚçĄĺšăŞçść
ă§ăŻăăăžăăă ăźăĺ¤ăŻéćłă§ăŻăăăžăăă sql.NullInt64{false,0}
ă¨NullInt64{false,42}
éăŤIMOăŽéăăŻăăăžăăă ăŠăĄăăSQLNULLăŽćĺšă§ĺçăŽčĄ¨çžă§ăă ĺ¤ă使ç¨ăăĺăŤăăšăŚăŽăłăźăăćĺšă§ăăă¨ăă§ăăŻăăĺ ´ĺăăăŽéăăŻăăă°ăŠă ă§ăŻčŚłĺŻă§ăăžăăă
ăłăłăă¤ăŠăăăŽăă§ăăŻăŽĺŽčĄă埡ĺśăăŞăăă¨ăŻĺ
ŹćŁă§ćŁăăćšĺ¤ă§ăăďźăĺŽéăŽăăŞăăˇă§ăł/ĺč¨ăżă¤ăăŽĺ ´ĺăŻăăăăăăăŞăă§ăăăďźăĺŽčĄăăŞăăťăăç°Ąĺă§ăă ăăăăăăăĺżăăĺ ´ĺă誤ăŁăŚăźă䝼ĺ¤ăŽĺ¤ă使ç¨ăăăăăă誤ăŁăŚăźăăŽĺ¤ă使ç¨ăăćšăčŻăă¨ăŻćăăžăăďźăă¤ăłăżăźĺăŽĺăé¤ăăŚă使ç¨ăăă¨ăăăăŻăŤăŞăĺŻč˝ć§ăăăăžăă大声ă§ĺ¤ąćăăžăăăăăăăŽĺ ´ĺăŻăă¨ăŤăă裸ăŽăă¤ăłăżĺă使ç¨ăă nil
ăăćŞč¨ĺŽăă¨ăăŚä˝żç¨ăăĺż
čŚăăăăžăă
ăăŽăżă¤ăăŽĺşćŹçăŞć°ăŽĺéĄăăăăžăă A + B == CăĺăŞăăŽçŠĺĺŽć°ăăăŽĺăŤĺ¤ćăăăŽăŻĺ°ăç°Ąĺăăăžăă
ăăăŻçčŤä¸ăŽć¸ĺżľă§ăăăăăă¨ăĺŽéăŤçşçăăžăăăďź
ăăă°ăŠăăźăŻăĺ¤ăĺŽéăŤćŁăăăăĄă¤ăłăŤăăăă¨ă確čŞăăă¨ăăäşç´°ăŞăĄăłăăăłăšă§ăŻăŞăăéčŚăŞć¤č¨źăłăźăăŤéä¸ăăăă¨ăă§ăăžăă
FTRă ăă§ăsum-types-as-sum-typesă使ç¨ăăĺ ´ĺďźă¤ăžăăĺéĄăă´ăźăŤăăłăăŠă¨ăăŁă¤ăłăżăźăă§ă¤ăšăäťăăŚăăă¨ăŹăŹăłăăŤă˘ăăŤĺăăăă¨ăŻă§ăăžăăďźăć¤č¨źăłăźăăä˝ćăăăă¨ăŻăăăžăăă ăŹăˇăźăăźăžăăŻĺźć°ă¨ăăŚć¸Ąăăăăă¤ăłăżăźăăźăăăŠăăăăă§ăăŻăăŞăăŽă¨ĺăăăăŤďźćĺšăŞăăŞă˘ăłăă¨ăăŚćć¸ĺăăăŚăăĺ ´ĺăé¤ăďźă ăłăłăă¤ăŠăç§ăŤăăăĺŚçăăăăăŤĺźˇĺśăăĺ ´ćďźă¤ăžăăăé˘ć°ăŽçľăăăŤćťăăŞăăăšăżă¤ăŤăŽĺéĄďźă§ăŻăăăăŠăŤăăŽĺ ´ĺăŤăăăăŻăŤăŞăăžăă
ĺäşşçăŤăŻăGoăŻĺŽç¨çăŞč¨čŞă ă¨ćăăžăăăăăŻăčŞĺăŽăăăŤăăžăăŻă誰ăăčŞĺăŽćšăĺŞăăŚăăăă¨ăçĽăŁăŚăăăă¨ăăççąă§ĺŽĺ ¨ćŠč˝ăčż˝ĺ ăăă ăă§ăŞăăĺŽč¨źăăăăăźăşăŤĺşăĽăăŚăăžăă ăăăăŁăŚăĺŽç¨çăŞćšćłă§ä˝żç¨ăăăă¨ăŻĺéĄăŞăă¨ćăăžăă
ć¨ćşçăŞć掾ăŻăăżă°ă¨ăăŚă¨ăŻăšăăźăăăăŚăăŞăăä˝ăăăŞăăĄă˝ăăăćă¤ă¤ăłăżăźăă§ăźăšă§ăă
ă¤ăłăżăźăă§ă¤ăšă¨ĺč¨ăżă¤ăăŤăŻć šćŹçăŞéăăăăăžăďźăăŞăăŽć稿ă§č¨ĺăăăŚăăžăăă§ăăďźă ă¤ăłăżăźăă§ă¤ăšăäťăăŚĺč¨ăżă¤ăăćŚçŽăăĺ ´ĺăĺ¤ăĺŚçăăćšćłăŻĺŽéăŤăŻăăăžăăă ćśč˛ťč ă¨ăăŚăăăŞăăŻăăăĺŽéăŤä˝ăäżćăăŚăăăŽăčŚĺ˝ăă¤ăăăć¨ć¸Źăăăă¨ăăă§ăăžăăă ăăăŻăĺăŤçŠşăŽă¤ăłăżăźăă§ă¤ăšă使ç¨ăăăăăĺŞăăŚăăžăă ĺŻä¸ăŽćç¨ć§ăŻăă¤ăłăżăźăă§ă¤ăšăĺŽçžŠăăĺăăăăąăźă¸ăăăŽăżĺŽčŁ ăĺĺžă§ăăĺ ´ĺă§ăăăăŽĺ ´ĺăŤăŽăżăĺĺžă§ăăăăŽăĺśĺžĄă§ăăžăă
ä¸ćšă揥ăŽăăăŞăăŽăăăăžăă
func foo(val string|int|error) {
switch v:= val.(type) {
case string:
...
}
}
ĺč¨ăżă¤ăăŽĺ¤ă使ç¨ăăéăŤăćśč˛ťč ăŤăăŤăăŻăźăćäžăăžăă ăăŽäžĄĺ¤ăŻĺ ˇä˝çă§ăăă解éăŽä˝ĺ°ăŻăăăžăăă
@Merovius
ăăŞăăč¨ĺăăăăăăŽăăŞăźăăłăľă ăăŤăŻăăăăŁăźăăŁăźăŻăŞăźăăăŽăăăŤăăăăćŞç¨ăăăă¨ă訹ĺŻăăă¨ăăçšă§ăä¸é¨ăŽäşşă
ăé大ăŞćŹ çšă¨ăăŚĺéĄăăĺŻč˝ć§ăăăăăŽăăăăžăă ăăăŻăăŞăăˇă§ăłăŽé˘ć°ăŽĺźć°ăćŠč˝ă¨ăăŚćĺŚăăăççąă§ăă
ăăŞăăč¨ĺăăăăăăŽăăŞăźăăłăľă ăăŤăŻăăăăŁăźăăŁăźăŻăŞăźăăăŽăăăŤăăăăćŞç¨ăăăă¨ă訹ĺŻăăă¨ăăçšă§ăä¸é¨ăŽäşşă ăé大ăŞćŹ çšă¨ăăŚĺéĄăăĺŻč˝ć§ăăăăăŽăăăăžăă ăăăŻăăŞăăˇă§ăłăŽé˘ć°ăŽĺźć°ăćŠč˝ă¨ăăŚćĺŚăăăççąă§ăă
ăăăŻç§ăŤăŻăăŞăĺźąăč°čŤăŽăăăŤćăăžă-äťăŤä˝ăăŞăă¨ăăŚăăăăăăĺĺ¨ăăăŽă§ăăăŞăăŻăă§ăŤăăăăĺŻč˝ăŤăăăăŽăŻä˝ă§ă訹ĺŻăăŚăăžăă 確ăăŤăăăšăŚăŽćĺłă¨çŽçăŽăăăŤăăă§ăŤăŞăăˇă§ăłăŽĺźć°ăăăăžăďźç§ăăăŽăăżăźăłă
ă¤ăłăżăźăă§ă¤ăšă¨ĺč¨ăżă¤ăăŤăŻć šćŹçăŞéăăăăăžăďźăăŞăăŽć稿ă§č¨ĺăăăŚăăžăăă§ăăďźă ă¤ăłăżăźăă§ă¤ăšăäťăăŚĺč¨ăżă¤ăăćŚçŽăăĺ ´ĺăĺ¤ăĺŚçăăćšćłăŻĺŽéăŤăŻăăăžăăă ćśč˛ťč ă¨ăăŚăăăŞăăŻăăăĺŽéăŤä˝ăäżćăăŚăăăŽăčŚĺ˝ăă¤ăăăć¨ć¸Źăăăă¨ăăă§ăăžăăă
ăăăăăä¸ĺşŚč§Łćăăăă¨ăăžăăăăăžă ă§ăăžăăă ăŞăăăŞăăŻăăăă使ăăă¨ăă§ăăŞăăŽă§ăăďź ăăăăŻé常ăŽă¨ăŻăšăăźăăăăăżă¤ăăŤăăăă¨ăă§ăăžăă ăŻăăăăăăŻďźćăăăŤďźăăăąăźă¸ă§ä˝ćăăăăżă¤ăă§ăăĺż čŚăăăăžăăăăăăé¤ăă°ăĺŽéăŽăŻăăźăşăăľă ă¨ćŻčźăăŚăăăăăŽä˝żç¨ćšćłăŤĺśéăŻăŞăăăă§ăă
ăăăăăä¸ĺşŚč§Łćăăăă¨ăăžăăăăăžă ă§ăăžăăă ăŞăăăŞăăŻăăăă使ăăă¨ăă§ăăŞăăŽă§ăăďź ăăăăŻé常ăŽă¨ăŻăšăăźăăăăăżă¤ăăŤăăăă¨ăă§ăăžăă ăŻăăăăăăŻďźćăăăŤďźăăăąăźă¸ă§ä˝ćăăăăżă¤ăă§ăăĺż čŚăăăăžăăăăăăé¤ăă°ăĺŽéăŽăŻăăźăşăăľă ă¨ćŻčźăăŚăăăăăŽä˝żç¨ćšćłăŤĺśéăŻăŞăăăă§ăă
ăăăźăĄă˝ăăăă¨ăŻăšăăźăăăăăľăźăăăźăăŁăăĺč¨ăżă¤ăăăĺŽčŁ ă§ăăĺ ´ĺăŻăŠăăŞăăžăăďź ăžăăŻăăăźă ăĄăłăăźăă¤ăłăżăźăă§ă¤ăšăŽăăžăăžăŞăłăłăˇăĽăźăăźăŤç˛žéăăŚăăăăĺăăăăąăźă¸ăŤĺĽăŽĺŽčŁ ăčż˝ĺ ăăăă¨ăćąşĺŽăăăăŽĺŽčŁ ăŽă¤ăłăšăżăłăšăăłăźăăŽăăžăăžăŞć掾ăäťăăŚăăăăŽăłăłăˇăĽăźăăźăŤć¸Ąăăăă¨ăăé常ăŤçžĺŽçăŞăˇăăŞăŞă§ăăďź ç§ăŽćç˝ăŞă解ćä¸ĺŻč˝ăŞăăšăăźăăĄăłăăçš°ăčżăăŞăšăŻăăăăžăăăćśč˛ťč ă¨ăăŚăăăŞăăŻ[ĺč¨ĺ¤]ăĺŽéăŤä˝ăäżćăăŚăăăŽăăăăăăć¨ć¸Źăăăă¨ăăă§ăăžăăăă ăăăŻă¤ăłăżăźăă§ăźăšă§ăăă誰ăăăăĺŽčŁ ăăŚăăăŽăăćăăŚăăăŞăăŽă§ăăăŞăăŻçĽăŁăŚăăžăă
@Merovius
FTRă ăă§ăsum-types-as-sum-typesă使ç¨ăăĺ ´ĺďźă¤ăžăăĺéĄăă´ăźăŤăăłăăŠă¨ăăŁă¤ăłăżăźăă§ă¤ăšăäťăăŚăăă¨ăŹăŹăłăăŤă˘ăăŤĺăăăă¨ăŻă§ăăžăăďźăć¤č¨źăłăźăăä˝ćăăăă¨ăŻăăăžăăă ăŹăˇăźăăźăžăăŻĺźć°ă¨ăăŚć¸Ąăăăăă¤ăłăżăźăăźăăăŠăăăăă§ăăŻăăŞăăŽă¨ĺăăăăŤďźćĺšăŞăăŞă˘ăłăă¨ăăŚćć¸ĺăăăŚăăĺ ´ĺăé¤ăďźă ăłăłăă¤ăŠăç§ăŤăăăĺŚçăăăăăŤĺźˇĺśăăĺ ´ćďźă¤ăžăăăé˘ć°ăŽçľăăăŤćťăăŞăăăšăżă¤ăŤăŽĺéĄďźă§ăŻăăăăŠăŤăăŽĺ ´ĺăŤăăăăŻăŤăŞăăžăă
ç§ăŻăăă常ăŤăžăăŻćąşăăŚçŠă¨ăăŚćąăăžăăă
ćŞăĺ Ľĺă渥ăăäşşăăăăŤççşăăĺ ´ĺăç§ăŻć¤č¨źăłăźăăć°ăŤăăžăăă
ăăăă誰ăăćŞăĺ Ľĺă渥ăă¨ćçľçăŤăăăăŻăçşçăăĺŻč˝ć§ăăăăăăă°ăă襨示ăăăŞăĺ ´ĺăŻăć¤č¨źăłăźăăč¨čż°ăăŚăćŞăĺ ĽĺăŤă§ăăă ăćŠăăăŠă°ăäťăăă¨ăŠăźăçşçăăăă¨ă誰ăç解ăăĺż čŚăăŞăăăăŤăăžă150ăłăźăŤăšăżăăŻă§ăăŹăźă ăä¸ăăžăďźçšăŤăăăŽćŞăĺ¤ăăŠăăŤĺ°ĺ ĽăăăăăććĄăăăăăŤăăłăźăŤăšăżăăŻă§ăăăŤ150ăăŹăźă ăä¸ăăĺż čŚăăăĺ ´ĺăăăăăďźă
ĺžă§ăăăă°ăŽ30ĺăçŻç´ă§ăăĺŻč˝ć§ăăăăăăäť30ĺă貝ăăăŽăŻĺŽç¨çă§ăă çšăŤç§ăŤă¨ăŁăŚăŻăăă¤ăă°ăăăééăăçŻăăŚăăăŽă§ăĺŚć ĄăŤéăăŽăćŠăăă°ćŠăăťăŠă揥ăŽă°ăăăééăăçŻăăă¨ăă§ăăžăă
ăŞăźăăźăĺĺžăăŚăăăŤä˝żç¨ăéĺ§ăăé˘ć°ăăăĺ ´ĺănilăăă§ăăŻăăžăăăăé˘ć°ăçšĺŽăŽăĄă˝ăăăĺźăłĺşăăăăžă§ăŞăźăăźăĺźăłĺşăăŞăć§é ä˝ăŽăăĄăŻăăŞă§ăăĺ ´ĺăŻă nilăăă§ăăŻăăŚăăăăŻăŤăŞăăăăăŞăźăăźăŻnilă§ăăŁăŚăŻăŞăăžăăăăŞăŠăŽă¨ăŠăźăčżăăă¨ăŠăźăŽĺĺ ăă¨ăŠăźăŽĺĺ ăŤă§ăăă ăčżăăŞăăăăŤăăžăă
godoc -analysis
ç§ăŻçĽăŁăŚăăžăăăăăăŻĺ˝šăŤçŤăăŞăă¨ćăăžăă ^ CăćźăĺăŤăăŻăźăŻăšăăźăšă§40ĺéĺŽčĄăăăžăăăăăăŻăăăăąăźă¸ăă¤ăłăšăăźăŤăžăăŻĺ¤ć´ăăăăłăŤć´ć°ăăĺż čŚăăăăžăă ăă ăăďź20131ďźăăŽăšăŹăăăăĺĺ˛ăăŚăăžăďźďźăăăăžăă
ăăăŻč¨ăŁăŚăăă¤ăłăżăźăă§ăźăšă
type Sum interface { sum() Sum }
ĺ¤ć´ăăăăšăŚăŽĺ¤ăăăčŞä˝ăčżăăăăŤăăăă¨ă§ăăăŽĺéĄăé˛ăăă¨ăă§ăăžăă ăăăăă°ăsum()
ăŽăŞăżăźăłă使ç¨ă§ăăžăăăăăŻăĺăčžźăżăŽä¸ă§ăćŁĺ¸¸ăŤĺä˝ăăžăă
ç§ăŻăăă彚ăŤçŤă¤ă¨ăŻćăăžăăă§ăăă ć示çăŞć¤č¨źăăăĺ¤ăăŽĺŠçšăŻăŞăăć¤č¨źăĺ°ăŞăăŞăăžăă
[const / iotaĺćĺăŽăĄăłăăźăčż˝ĺ ă§ăăă¨ăăäşĺŽ]ăŻçčŤçăŞć¸ĺżľă§ăăăăăă¨ăĺŽéăŤĺşăŚăăžăăăďź
ăăŽçšĺŽăŽăăŽăŻçčŤçă§ăăďźç§ăŻç§ăčăăăă¨ăă§ăăăăšăŚăŽčłĺŚä¸ĄčŤăçčŤçăăăłĺŽç¨çăăŞăšăăăăă¨ăăŚăăžăăă ăăăăç§ăŽăă大ăăŞăă¤ăłăăŻăč¨čŞă§ä¸ĺ¤ćĄäťśăŽă1ă¤ăă襨çžăăăă¨ăăćšćłăŻăăăăăăăăăŞăä¸čŹçăŤä˝żç¨ăăăŚăăžăăăč¨čŞăŽä¸ç¨ŽăŽĺăŤăăăťăŠĺç´ă§ăŻăŞăă¨ăăăă¨ă§ăăă
[ĺăŞăçŠĺăconst / iotaĺćĺăŤĺ˛ăĺ˝ăŚăăă¨ăă§ăăă¨ăăäşĺŽ]ăŻçčŤçăŞć¸ĺżľă§ăăăăăă¨ăĺŽéăŤĺşăŚăăžăăăďź
ăăăŻĺŽéăŤĺşăŚăăžăăă ä˝ăćŞăăŁăăŽăăç解ăăăŽăŤăăăťăŠćéăŻăăăăžăăă§ăăăăăłăłăă¤ăŠăăăăŽčĄăăăăééăŁăŚăăăă¨č¨ăŁăŚăăăăăăăŤćéăăăăăŞăăŁăă§ăăăă ăăŽçšĺŽăŽăąăźăšăĺŚçăăäťăŽćšćłăŽčŠąăăăăžăăăăăăăăŠăŽăăăŤä¸čŹçăŤä˝żç¨ăăăăăŻăăăăžăăă
ăăăŻç§ăŤă¨ăŁăŚçĄĺšăŞçść ă§ăŻăăăžăăă ăźăĺ¤ăŻéćłă§ăŻăăăžăăă
sql.NullInt64{false,0}
ă¨NullInt64{false,42}
éăŤIMOăŽéăăŻăăăžăăă ăŠăĄăăSQLNULLăŽćĺšă§ĺçăŽčĄ¨çžă§ăă ĺ¤ă使ç¨ăăĺăŤăăšăŚăŽăłăźăăćĺšă§ăăă¨ăă§ăăŻăăĺ ´ĺăăăŽéăăŻăăă°ăŠă ă§ăŻčŚłĺŻă§ăăžăăă
ăłăłăă¤ăŠăăăŽăă§ăăŻăŽĺŽčĄă埡ĺśăăŞăăă¨ăŻĺ ŹćŁă§ćŁăăćšĺ¤ă§ăăďźăĺŽéăŽăăŞăăˇă§ăł/ĺč¨ăżă¤ăăŽĺ ´ĺăŻăăăăăăăŞăă§ăăăďźăĺŽčĄăăŞăăťăăç°Ąĺă§ăă ăăăăăăăĺżăăĺ ´ĺă誤ăŁăŚăźă䝼ĺ¤ăŽĺ¤ă使ç¨ăăăăăă誤ăŁăŚăźăăŽĺ¤ă使ç¨ăăćšăčŻăă¨ăŻćăăžăăďźăă¤ăłăżăźĺăŽĺăé¤ăăŚă使ç¨ăăă¨ăăăăŻăŤăŞăĺŻč˝ć§ăăăăžăă大声ă§ĺ¤ąćăăžăăăăăăăŽĺ ´ĺăŻăă¨ăŤăă裸ăŽăă¤ăłăżĺă使ç¨ăăăćŞč¨ĺŽăă¨ăăŚnilă使ç¨ăăĺż čŚăăăăžăă
ăăăšăŚăŽăłăźăăĺ¤ă使ç¨ăăĺăŤćĺšă§ăăă¨ăă§ăăŻăăĺ ´ĺăăŻăăă°ăĺ Ľăčžźăă ĺ ´ćă§ăăăăłăłăă¤ăŠăźă埡ĺśă§ăăăă¨ă§ăă ç§ăŻăăŽăăăŞăă°ăçşçăăžăăďźăă ăăăăŽăăżăźăłăŽăă大ăăŞăăźă¸ă§ăłă§ăŻăăăŁăšăŻăŞăăăźăżăźăŤč¤ć°ăŽĺ¤ăăŁăźăŤăă¨3ă¤äťĽä¸ăŽçść ăăăăžăăďźă ç§ăŻéçşă¨ăăšăä¸ăŤăăăăăšăŚăčŚă¤ăă誰ăéçăŤéăăăăŞăăŁăă¨äżĄăăŚăăžăăăç§ăăăŽééăăçŻăăă¨ăăŤăłăłăă¤ăŠăăĄăăăŠç§ăŤč¨ăŁăŚăăăă°ăăăŽă§ăăăăăăăŽ1ă¤ăĺŻä¸ăŽćšćłă§ăăă¨ç˘şäżĄă§ăăžăăăłăłăă¤ăŠăŤăă°ăăăŁăĺ ´ĺăintĺăŽĺ¤ć°ăŤćĺĺăĺ˛ăĺ˝ăŚăăă¨ăăĺ ´ĺă¨ĺăăăăŤăéĺťăŤăăćăăžăăă
ăăăŚă確ăăŤăç§ăŻăŞăăˇă§ăłĺăŤăŻ*T
ă弽ăżăžăăăĺŽčĄć犺ă¨ăłăźăăŽĺŻčŞć§ăŽä¸Ąćšă§ăźă䝼ĺ¤ăŽăłăšăăé˘éŁäťăăăăŚăăžăă
ďźăăŽçšĺŽăŽäžă§ăŻăăăăŻććĄă§ĺŽéăŽĺ¤ăžăăŻćŁăăăźăĺ¤ăĺĺžăăăłăźăăŻv, _ := nullable.[Value]
ăăăăăăŻç°Ąć˝ă§ĺŽĺ
¨ă§ăăďź
ăăăŻç§ăćăă§ăăăă¨ă§ăŻăăăžăăă ăăăŻăżă¤ăăŻĺ¤ăżă¤ăă§ăăĺż
čŚăăăăžăă
RustăŽăăăŤă ăăăăŽćĺăŽĺčŞăŻăĺż
čŚăŤĺżăăŚăGCăĄăżăăźăżă¸ăŽăă¤ăłăżăźă§ăăĺż
čŚăăăăžăă
ăă䝼ĺ¤ăŽĺ ´ĺăăăăăŽä˝żç¨ăŤăŻăăăŠăźăăłăšăŽä˝ä¸ăäź´ăăžăă
ĺăĺ
ĽăăăăŞăă ç§ăŤă¨ăŁăŚăăăš10:41 AMăăJoshBleecherSnyderă<
[email protected]>ăŻćŹĄăŽăăăŤć¸ăăŚăăžăďź
ăăăŻăăăăźăśăŤă使ç¨ăăă¨ăapăžăăŻ* păé¸ćăăŚăăĺ¤ăăŽć
ĺ ąăĺžăăă¨ăă§ăăžă
ăĄă˘ăŞăŽăăŹăźăăŞăăăăç´°ăăĺśĺžĄă§ăăžăă
ă¤ăłăżăźăă§ă¤ăšăăšăŤăŠăźĺ¤ăć źç´ăăăăăŤĺ˛ăĺ˝ăŚăççąăŻă
äťăŽĺčŞă
ăă¤ăłăż; ďź8405 https://github.com/golang/go/issues/8405ăĺç
§ăăŚăă ăă
č°čŤă ĺăĺŽčŁ
ä¸ăŽčć
Žäşé
ăă
ăăăŻăżă¤ăăăăăŻăĺŽéăŤăŻăpăĺ˛ăĺ˝ăŚăăăŚćçľçăŤăŞăăă¨ăćĺłăăĺ ´ĺăăăăžăă
ă¨ăŤăăéăăźăŤăŤă
â
ăšăŹăăăä˝ćăăăăăăăăĺăĺăŁăŚăăžăă
ăăŽăĄăźăŤăŤç´ćĽčżäżĄăăGitHubă§čĄ¨ç¤şăăŚăă ăă
https://github.com/golang/go/issues/19412#issuecomment-323371837 ăăžăăŻăăĽăźă
ăšăŹăă
https://github.com/notifications/unsubscribe-auth/AGGWB-wQD75N44TGoU6LWQhjED_uhKGUks5sZaKbgaJpZM4MTmSr
ă
@urandom
ăăăźăĄă˝ăăăă¨ăŻăšăăźăăăăăľăźăăăźăăŁăăĺč¨ăżă¤ăăăĺŽčŁ ă§ăăĺ ´ĺăŻăŠăăŞăăžăăďź
ă¨ăŻăšăăźăăăăăĄă˝ăăă¨ă¨ăŻăšăăźăăăăăżă¤ăăŤăŻéăăăăăžăă ç§ăăĄăŻăäşăăčś ăăŚčŠąăăŚăăăăă§ăă ç§ăŤăŻăăăăŻăŞăźăăłăľă ă¨ăŻăăźăşăăľă ăŽéăŤéăăăŞăăĺéĄăŞăćŠč˝ăăŚăăăăăŤčŚăăžăă
type X interface { x() X }
type IntX int
func (v IntX) x() X { return v }
type StringX string
func (v StringX) x() X { return v }
type StructX struct{
Foo bool
Bar int
}
func (v StructX) x() X { return v }
ăăăąăźă¸ăŽĺ¤é¨ăŤćĄĺźľćŠč˝ăŻăăăžăăăăăăăąăźă¸ăŽăłăłăˇăĽăźăăźăŻăäťăŽĺ¤ă¨ĺăăăăŤĺ¤ă使ç¨ăä˝ćăăăăłć¸Ąăăă¨ăă§ăăžăă
XăăžăăŻăăăćşăăăăźăŤăŤĺăŽ1ă¤ăĺ¤é¨ăŤĺăčžźăă§ăăăXăĺăĺăăăăąăźă¸ĺ ăŽé˘ć°ăŤć¸Ąăăă¨ăă§ăăžăă
ăăŽé˘ć°ăxăĺźăłĺşăă¨ăăăăăŻăŤăŞăăďźXčŞä˝ăĺăčžźăžăăŚăăŚăä˝ăŤăč¨ĺŽăăăŚăăŞăĺ ´ĺďźăăłăźăăćä˝ă§ăăĺ¤ăčżăăžăăăĺźăłĺşăĺ ăă渥ăăăĺ¤ă§ăŻăŞăăăăĺźăłĺşăĺ ăŤăŻĺ°ăéŠăăžăă ďźăăăŚă彟ăăăăăĽăĄăłăăčŞăă§ăăŞăăŽă§ă彟ăăăăŽăăăŞăă¨ă芌ăżăŚăăăăŠăăă彟ăăŽăłăźăăŻăă§ăŤçăăăă§ăďźă
ăăăăăăŞăă§ăă ăăăă¨ăăăĄăăťăźă¸ă§ăăăăŻăŤăŞăăăŞăăźăżăźăĺźăłĺşăăă¨ăŻăăăăĺŚçăăăăăŽćăéŠăăšăćšćłăŽăăăŤćăăăĺźăłĺşăĺ ăŤăłăźăă俎ćŁăăăžăă
ăăŽé˘ć°ăxăĺźăłĺşăă¨ăăăăăŻăŤăŞăă[âŚ]ăăłăźăăćä˝ă§ăăĺ¤ăčżăăžăăăĺźăłĺşăĺ ăă渥ăăăĺ¤ă§ăŻăŞăăăăĺźăłĺşăĺ ăŤăŻĺ°ăéŠăăžăă
ä¸ă§čż°ăšăăăăŤăçĄĺšăŞĺ¤ăŽćĺłçăŞć§çŻăçĄĺšă§ăăăă¨ăŤéŠăăĺ ´ĺăŻăćĺž ăĺčăăĺż čŚăăăăžăă ăăăăăăăăŤăăăăăăŻăăŽçšĺŽăŽč°čŤăŽçłťçľąăä˝ă§ăăŁăăă§ăŻăŞăăĺĽă ăŽč°čŤăĺĽă ăŤäżă¤ăă¨ăŻĺ˝šăŤçŤăĄăžăă ăăăŻ@urandomăŤé˘ăăăăŽă§ăăżă°ăĄă˝ăăă使ç¨ăăă¤ăłăżăźăă§ă¤ăšăäťăăăŞăźăăłăľă ăŻăäťăŽăăăąăźă¸ă§ăŻĺ çă§ăăă使ç¨ă§ăăŞăă¨č¨ăŁăŚăăžăăă çăăă丝埾ă ă¨ćăăžăăăăăăć確ăŤă§ăăă°ç´ ć´ăăăă¨ćăăžăă
ĺéĄăŻă誰ăăăłăłăă¤ăŤăăŚăăăąăźă¸ăŤć¸Ąăăă¨ăă§ăăĺč¨ăŤĺŤăžăăŞăĺăä˝ćăăĺŻč˝ć§ăăăăă¨ă§ăă
č¨čŞăŤéŠĺăŞĺč¨ăżă¤ăăčż˝ĺ ăăăŤăăăăĺŚçăăăăăŽ3ă¤ăŽăŞăăˇă§ăłăăăăžă
3ăŻç§ăŤăŻ1ă¨2ăŽĺĽĺŚăŞçľăżĺăăăŽăăăŤćăăžăďźăăăä˝ă財ăăŽăăăăăžăăă
ăéŠăăăăćĺłçăŤçĄĺšăŞĺ¤ăä˝ćăăăŽăçĄĺšă ă¨ćăŁăăăćĺž ăčăç´ăĺż čŚăăăăă¨ăŻćăăžăăă3ă§ăŻä˝ăăăăăăăŞăŁăăă¨ăŤć°ăĽăăŤăăăŞăăžăăççąăç解ăăăŽăŻéŁăăă§ăăăă
2ăŻăăłăźăăçĄĺšăŞçść ăŤéĽăăŽăé˛ăă誰ăă桡䚹ăăĺ ´ĺăŤăăŹă˘ăé俥ăăŚăăŞăééăŁăŚăăăŽăăăăăŚăăă俎ćŁăăćšćłăçĽăăăăŽă§ăćčŻăŽăăă§ăă
ç§ăŻăăżăźăłăŽćĺłă誤解ăăŚăăžăăăăăă¨ăç°ăŞăĺ˛ĺŚăăăăăŤă˘ăăăźăăăŚăăă ăă§ăăďź
@urandom誏ćă
ĺéĄăŻă誰ăăăłăłăă¤ăŤăăŚăăăąăźă¸ăŤć¸Ąăăă¨ăă§ăăĺč¨ăŤĺŤăžăăŞăĺăä˝ćăăĺŻč˝ć§ăăăăă¨ă§ăă
ăăŞăăŻăă¤ă§ăăăăăăăă¨ăă§ăăžăă çăăăĺ ´ĺăŻăăłăłăă¤ăŠă§ăă§ăăŻăăăĺč¨ĺă使ç¨ăăŚăă常ăŤĺŽĺ ¨ă§ăŞăăăŽă使ç¨ă§ăăžăďźăăăŚăćăăăŤĺč¨ă¨ăăŚćĺłăăăăăŽăĺăčžźăżăăăăĺćĺăăŞăăă¨ăăçĄĺšăŞĺ¤ăć§çŻăă質çăŤç°ăŞăćšćłă¨ăăŚăŻčŚăŚăăžăăćĺšăŞĺ¤ďźă ĺéĄăŻăăăăăĺŽéăŤĺéĄăĺźă辡ăăé ťĺşŚă¨ăăăŽĺéĄăăŠăăťăŠćˇąĺťăŤăŞăăăă§ăă ç§ăŽćčŚă§ăŻăä¸č¨ăŽč§Łćąşçă§ăŻăçăăŻăăťă¨ăăŠćąşăăŚăé常ăŤä˝ăăă§ă-ăăŞăăŻćăăăŤĺćăăžăăăăăăŻĺéĄăăăžăăă ăăăăăăăăŤăăăăăăŤă¤ăăŚčŚĺ´ăăŚăăçšăŻăăžăăŞăăăă§ă-ăăŽçšĺŽăŽçšăŽä¸Ąĺ´ăŽč°čŤă¨čŚč§ŁăŻĺĺăŤć確ă§ăăĺż čŚăăăăç§ăŻăăžăăŤăé¨ă ăăçš°ăčżăăéżăăçăŤçŚçšăĺ˝ăŚăăă¨ăăŚăăžăć°ăăĺźć°ă ç§ăŻä¸č¨ăŽć§é ăĺăä¸ăăŚăăăĄăźăšăăŻăŠăšăŽĺč¨ăżă¤ăă¨ă¨ăăĽăŹăźăăăăĺč¨-çľçąăŽă¤ăłăżăźăă§ă¤ăšăŽéăŤă¨ăŻăšăăźăĺŻč˝ć§ăŤéăăăŞăăă¨ă示ăăžăăă ăăăăăăăăçšă§ĺłĺŻăŤĺŞăăŚăăăă¨ă示ăăăŽă§ăŻăăăžăăă
çăăăĺ ´ĺăŻăăłăłăă¤ăŠă§ăă§ăăŻăăăĺč¨ĺă使ç¨ăăŚăă常ăŤĺŽĺ ¨ă§ăŞăăăŽă使ç¨ă§ăăžăďźăăăŚăćăăăŤĺč¨ă¨ăăŚćĺłăăăăăŽăĺăčžźăżăăăăĺćĺăăŞăăă¨ăăçĄĺšăŞĺ¤ăć§çŻăă質çăŤç°ăŞăćšćłă¨ăăŚăŻčŚăŚăăžăăćĺšăŞĺ¤ďźă
ç§ăŻăăă質çăŤç°ăŞăă¨ćăăžăďźäşşă
ăăăŽăăăŤĺăčžźăżă誤ç¨ăăă¨ăďźĺ°ăŞăă¨ăproto.Message
ă¨ăăăĺŽčŁ
ăăĺ
ˇä˝çăŞăżă¤ăă§ďźă彟ăăŻä¸čŹçăŤăăăĺŽĺ
¨ă§ăăăăŠăăăăăăŚăăăĺŁăăăăăăŞăä¸ĺ¤éăŤă¤ăăŚčăăŚăăžăăă ďźăŚăźăśăźăŻăă¤ăłăżăźăă§ăźăšăĺż
čŚăŞĺä˝ăĺŽĺ
¨ăŤč¨čż°ăăŚăăă¨ćłĺŽăăžăăăă¤ăłăżăźăă§ăźăšăĺ
ąç¨ä˝ăžăăŻĺč¨ĺă¨ăăŚä˝żç¨ăăăĺ ´ĺăĺ¤ăăŽĺ ´ĺăăăă§ăŻăăăžăăăhttpsďź//github.com/golang/protobuf/issues/364ăĺç
§ăăŚăă ăăăďź
寞ç
§çăŤă誰ăăăăăąăźă¸unsafe
ă使ç¨ăăŚăé常ăŻĺç
§ă§ăăŞăĺăŤĺ¤ć°ăč¨ĺŽăăĺ ´ĺăĺ°ăŞăă¨ăä˝ăĺŁăăăăăăăŚăăŽççąăŤă¤ăăŚčăăăă¨ăăăă¨ć示çăŤä¸ťĺźľăăŚăăžăă
@Meroviusăăăăç§ăŻăŻăŁăăăăŚăăžăă
ĺŽĺ ¨ćŠč˝ăŽć大ăŽĺŠçšăŻăăăăĺć ăŤăăŁăŚĺ°éăăăgo / typesă§čĄ¨ăăăăă¨ă§ăă ăăăŤăăăăăźăŤă¨ăŠă¤ăăŠăŞă§ä˝ćĽăăăăăŽăăĺ¤ăăŽć ĺ ąăĺžăăăžăă Goă§ĺč¨ĺăăˇăăĽăŹăźăăăćšćłăŻăăăăăăăžăăăăăăăŻăăšăŚéĺč¨ĺăłăźăă¨ĺăă§ăăăăăăăźăŤă¨ăŠă¤ăăŠăŞăŻăăăăĺč¨ĺă§ăăăçšĺŽăŽăăżăźăłăčŞčă§ăăĺż čŚăăăăă¨ăçĽăăăăŤĺ¸Żĺĺ¤ć ĺ ąăĺż čŚă¨ăăžă使ç¨ăăăŚăăžăăăăăăăŽăăżăźăłă§ăăĺ¤§ĺš ăŞĺ¤ĺăĺŻč˝ă§ăă
ăžăăçĄĺšăŞĺ¤ăä˝ćăăĺŻä¸ăŽćšćłăŻĺŽĺ ¨ă§ăŻăăăžăăăé常ăŽăłăźăăçćăăăăłăźăăăŞăăŹăŻăăăăăžăăĺžč ăŽ2ă¤ăŻăăăăĽăĄăłăăčŞăăă¨ăă§ăăŞăäşşă¨ăŻç°ăŞăăĺéĄăĺźă辡ăăĺŻč˝ć§ăéŤăăŞăăžăă
ĺŽĺ ¨ć§ăŽăă1ă¤ăŽĺŻćŹĄçăŞĺŠçšăŻăăłăłăă¤ăŠăźăăăĺ¤ăăŽć ĺ ąăćăĄăăăéŤéăŞăłăźăăçćă§ăăăă¨ăćĺłăăžăă
çäźźĺč¨ăă¤ăłăżăźăă§ăźăšăŤç˝Žăćăăăă¨ăă§ăăăă¨ăŤĺ ăăŚă json.Token
ădriver.Value
ăăăŞăăăăăŽé常ăŽăżă¤ăăŽ1ă¤ăăŽçäźźĺč¨ă罎ăćăăăă¨ăă§ăăă¨ăăäşĺŽăăăăžăă ăăăăŻăťă¨ăăŠăăăžăăăă interface{}
ăĺż
čŚăŞĺ ´ćăŻ1ă¤ĺ°ăŞăăŞăăžăă
ăžăăçĄĺšăŞĺ¤ăä˝ćăăĺŻä¸ăŽćšćłăŻĺŽĺ ¨ă§ăŻăăăžăă
ăăŽçşč¨ăŤă¤ăŞăăăçĄĺšăŞäžĄĺ¤ăăŽĺŽçžŠăç解ăăŚăăŞăă¨ćăăžăă
@neildăăăăă°
var v pick {
None struct{}
A struct { X int; Y *T}
B int
}
ăăăŻćŹĄăŽăăăŤăĄă˘ăŞăŤé 罎ăăăžă
struct {
activeField int //which of None (0), A (1), or B (2) is the current field
theInt int // If None always 0
thePtr *T // If None or B, always nil
}
ĺŽĺ
¨ă§ăŞăĺ ´ĺăŻă activeField
ă0ăžăăŻ2ăŽĺ ´ĺă§ăthePtr
č¨ĺŽăăăă activeField
ă0ăŽĺ ´ĺă§ătheInt
ĺ¤ăč¨ĺŽăăăă§ăăžăă
ăŠăĄăăŽĺ ´ĺă§ăăăăăŻăłăłăă¤ăŠăźăčĄăă§ăăă䝎ĺŽăçĄĺšăŤăăäťćĽç§ăăĄăćă¤ăă¨ăă§ăăăŽă¨ĺă税éĄăŽçčŤä¸ăŽăă°ă訹ăăžăă
ăăăă @ bcmillsăććăăăăăŤăĺŽĺ ¨ă§ăŞăăăŽă使ç¨ăăŚăăĺ ´ĺăŻăăăăć ¸ăŽé¸ćč˘ă§ăăăăăä˝ăăăŚăăăŽăăăăçĽăŁăŚăăăŻăă§ăă
ç§ăç解ăăŚăăŞăăŽăŻăăŞăĺŽĺ ¨ă§ăŞăăă¨ăçĄĺšăŞĺ¤ăä˝ćăăĺŻä¸ăŽćšćłă§ăăăă¨ăăăă¨ă§ăă
var t time.Timer
t
ăŻçĄĺšăŞĺ¤ă§ăă t.C
ăč¨ĺŽăăăŚăăăă t.Stop
ăĺźăłĺşăă¨ăăăăŻăŤăŞăăžăăĺŽĺ
¨ă§ăŞăĺż
čŚăŻăăăžăăă
ä¸é¨ăŽč¨čŞăŤăŻăăçĄĺšăŞăĺ¤ăŽä˝ćăé˛ăăăăŤé常ăŤéˇăĺăˇăšăă ăăăăžăă GoăŻăăăăŽ1ă¤ă§ăŻăăăžăăă çľĺăăăŽéăăŠăŽăăăŤĺ¤§ăăĺăăăŽăăăăăžăăă ďźăăĄăăăçľĺăćŻćăăççąăŻäťăŤăăăăžăăďź
@neildăŻăçłă訳ăăăžăăăăç§ăŻčŞĺăŽĺŽçžŠăŤçăăăŚăăžăă
ĺč¨ĺăŽä¸ĺ¤éăŤââé˘ăăŚăŻçĄĺšă§ăăă
ăăĄăăăĺč¨ăŽĺă ăŽăżă¤ăăŻçĄĺšăŞçść ăŤăŞăĺŻč˝ć§ăăăăžăă
ăă ăăĺč¨ĺăŽä¸ĺ¤ćĄäťśăçśćăăăă¨ăŻăăăă°ăŠăăźă ăă§ăŞăăĺć ăăăłç§ťĺ/ĺăŤăă˘ăŻăťăšă§ăăăă¨ăćĺłăăăăăăŠă¤ăăŠăŞăăăźăŤă§ăăăăćä˝ăăă¨ăăăŽĺŽĺ ¨ć§ăçśćăăăăĄăżăăă°ăŠăăźăŤăăĺ¤ăăŽć ĺ ąăćäžăăăžăă
@jimmyfrasche ăĺŻč˝ăŞăăšăŚăŽĺă示ăĺč¨ĺă¨ăŻç°ăŞăăă¤ăłăżăźăă§ă¤ăšăŻä¸éćă§ăĺăŽăŞăšăăăăăăŞăăăĺ°ăŞăă¨ă使ç¨ă§ăăžăăăă¤ăłăżăźăă§ă¤ăšăĺŽčŁ
ăăăŽăŻă§ăă ăăăŤăăăăłăźăăŽswitch
é¨ĺăŽč¨čż°ăĺ°ăć¨ć¸ŹăŤăŞăăžăă
func F(sum SumInterface) {
switch v := sum {
case Screwdriver:
...
default:
panic ("Someone implementing a new type which gets passed to F and causes a runtime panic 3 weeks into production")
}
}
ăăăăŁăŚăă¤ăłăżăźăă§ă¤ăšăăźăšăŽĺč¨ĺă¨ăăĽăŹăźăˇă§ăłă§äşşă
ăćąăăŚăăĺéĄăŽăťă¨ăăŠăŻăćéăć
ŁçżăŤăăŁăŚč§Łćąşă§ăăăăăŤćăăăžăă ăă¨ăă°ăă¤ăłăżăźăă§ă¤ăšăŤă¨ăŻăšăăźăăăăŚăăŞăăĄă˝ăăăĺŤăžăăŚăăĺ ´ĺăčăăăăăăšăŚăŽďźăŻăăćĺłçăŞĺéżďźĺŽčŁ
ăç解ăăăŽăŻç°Ąĺă§ăă ĺć§ăŤăiotaăăźăšăŽĺćĺăŤé˘ăăăťă¨ăăŠăŽĺéĄăŤĺŻžĺŚăăăăăŤăăĺćĺăŻtype Foo int
ă§ăăă const ( FooA Foo = iota; FooB; FooC )
形ĺźă§ĺŽŁč¨ăăăŚăăăă¨ăăĺç´ăŞčŚĺăŤăăăĺşçŻĺ˛ă§ćŁç˘şăŞăăźăŤăč¨čż°ă§ăăžăă彟ăăŤă¨ăŁăŚăă
ăŻăăăăăŻĺŽéăŽĺč¨ăżă¤ăă¨ĺçă§ăŻăăăžăăďźă¨ăŤăăăăăăŠăăťăŠéčŚă§ăăăăŻăăăăăăžăăăăă¨ăăăăăăĄăźăšăăŻăŠăšăŽăŞăăŹăŻăăľăăźăăŻĺžăăăžăăďźăăăăăŻć˘ĺăŽă˝ăŞăĽăźăˇă§ăłăćĺłăăžăç§ăŽPOVăăăŻăăăćăăăŚăăăăăĺŞăăŚăăăăăŤčŚăăžăă ăăăŚIMOăŻăĺŽéăŤGo 2ăŤĺ ĽăăĺăŤăăăŽăăśă¤ăłăšăăźăšăć˘ç´˘ăă䞥ĺ¤ăăăăžăăĺ°ăŞăă¨ăăăăăăćŹĺ˝ăŤäşşă ăŤă¨ăŁăŚăăăťăŠéčŚă§ăăĺ ´ĺăŻă
ďźăăăŚăĺč¨ăżă¤ăăŽĺŠçšăčŞčăăŚăăăă¨ă埡調ăăăăŽă§ăĺŠçăŽăăăŤăăăăč¨ăćăăĺż čŚăŻăăăžăăăç§ăŻäťăŽäşşăťăŠéăăŻăăžăăăăćŹ çšăčŚăŚăăăăăŁăŚĺăăăźăżă§ç°ăŞăçľčŤăŤéăăďź
@MeroviusăăăŻç´ ć´ăăăăă¸ăˇă§ăłă§ăă
ăŞăăŹăŻăăŽăľăăźăăŤăăăăŠă¤ăăŠăŞă¨ăŞăăŠă¤ăłăăźăŤďźăŞăłăżăźăăłăźăă¸ă§ăăŹăźăżăźăŞăŠďźăć ĺ ąăŤă˘ăŻăťăšăăéçăŤćŁç˘şăŤć¤ĺşă§ăăŞăć ĺ ąăä¸éŠĺăŤĺ¤ć´ăăăă¨ăçŚć˘ă§ăăžăă
ă¨ăŤăăăć˘ç´˘ăăăŽăŻĺ ŹćŁăŞčăăŞăŽă§ăć˘ç´˘ăăŚăżăžăăăă
Goă§ćăä¸čŹçăŞçäźźĺăŽăăĄăăŞăčŚç´ăăă¨ă揥ăŽăăăŤăŞăăžăăďźăăăăçşçé ăŤďź
*T
ăŞăăˇă§ăłăŽăăăŽT
T
ďźinterface{}
ăŻăćéăŽăżă¤ăăŽăťăăăŽă°ăŠăăăă°ăŤĺśéăăăŚăăžăăăăăăŻăăšăŚăĺč¨ăżă¤ăă¨éĺč¨ăżă¤ăăŽä¸ĄćšăŤä˝żç¨ă§ăăžăă ćĺăŽ2ă¤ăŻäťăŽçŽçă§ä˝żç¨ăăăăă¨ăŻăăŁăăŤăŞăăŽă§ăăăăăĺč¨ăżă¤ăă襨ăăććăŽčޤć¤çĽăĺăĺ
Ľăăă¨äťŽĺŽăăăŽăŻçăŤăăŞăŁăŚăăăăăăăžăăă ă¤ăłăżăźăă§ă¤ăšăŽĺč¨ăŽĺ ´ĺăăăŠăĄăźăżăăŞăżăźăłăăŞăăăĄăłăăźăŤćŹćăăŞăăă¨ăŻăšăăźăăăăŚăăŞăăĄă˝ăăăŤĺśéăăăĺŻč˝ć§ăăăăžăă ĺćĺăŽĺ ´ĺăăăăŻă彟ăăŻăă ăăă¨ăă ăăăăăčŞčăăăăăŤçăŤăăŞăŁăŚType = iota
ă¤ăŞăżăŻăĺźăŽä¸é¨ă¨ăăŚä˝żç¨ăăăŚăăĺ ´ĺăăăăă˘ăăă¤ăžăăăŚăăŞăăŽă§ă
ăŞăăˇă§ăłăŽT
*T
ăŻăé常ăŽăă¤ăłăżăźă¨ĺşĺĽăăăŽăé常ăŤéŁăăă§ăăăă ăăăŤăŻă type O = *T
ă¨ăăčŚĺăä¸ăăăă¨ăă§ăăžăă ă¨ă¤ăŞă˘ăšĺăŻĺăŽä¸é¨ă§ăŻăŞăăăăĺ°ăéŁăăă§ăăăăăăć¤ĺşăăăă¨ăŻĺŻč˝ă§ăă type O *T
ăŻć¤ĺşăç°Ąĺă§ăăăăłăźăă§ăŽćä˝ăŻĺ°éŁă§ăă ä¸ćšăĺŽčĄăăĺż
čŚăŽăăăăŽăŻăăšăŚĺşćŹçăŤĺăŤçľăżčžźăžăăŚăăăăăăăăčŞčăăăă¨ă§ăăźăŤăăĺžăăăăăŽăŻăťă¨ăăŠăăăžăăă ăăăŻçĄčŚăăžăăăă ďźă¸ă§ăăŞăăŻăšăŻtype Optional(T) *T
沿ăŁăä˝ăă訹ĺŻăăĺŻč˝ć§ăéŤăăăăăăŽăăżă°äťăăăĺç´ĺăăžăďźă
ĺćĺăŽć§é ä˝ăŻăăăźăŤă§ć¨čŤăăăŽăéŁăăă§ăăăăăŠăŽăăŁăźăŤăăĺćĺăŽăŠăŽĺ¤ăŤĺŻžĺżăăăŽă§ăăăăă ăăăĺç´ĺăăŚăĺćĺăŽăĄăłăăźăă¨ăŤ1ă¤ăŽăăŁăźăŤăăĺż čŚă§ăăăĺćĺăŽĺ¤ă¨ăăŁăźăŤăăŽĺ¤ăĺăă§ăăĺż čŚăăăă¨ăăčŚĺăŤĺç´ĺă§ăăžăă揥ăŤäžă示ăăžăă
type Which int
const (
A Which = iota
B
C
)
type Sum struct {
Which
A struct{} // has to be included to line up with the value of Which
B struct { X int; Y float64 }
C struct { X int; Y int }
}
ăŞăăˇă§ăłăŽĺăŻĺĺžă§ăăžăăăăăŹăłă°ăă¤ăśăźă§ă2ă¤ăŽăăŁăźăŤăăćĺăŻăăźăŤĺ¤ăă¨ăăçšćŽăŞăąăźăšă使ç¨ă§ăăžăă
ă°ăŠăăăă°ăŽĺč¨ăŤinterface{}
ă使ç¨ăăă¨ă //gosum: int, float64, string, Foo
ăăăŞéćłăŽăłăĄăłăăăŞăă¨ć¤ĺşă§ăăžăăă
ăăăăŻă揥ăŽĺŽçžŠăćă¤çšĺĽăŞăăăąăźă¸ăĺĺ¨ăăĺŻč˝ć§ăăăăžăă
package sum
type (
Type struct{}
Enum int
OneOf interface{}
)
ĺćĺăŻtype MyEnum sum.Enum
ăŽĺ˝˘ĺźăŽĺ ´ĺăŤăŽăżčŞčăăăă¤ăłăżăźăă§ăźăšă¨ć§é ä˝ăŻsum.Type
ĺăčžźăžăăŚăăĺ ´ĺăŤăŽăżčŞčăăă interface{}
type GrabBag sum.OneOf
ăăăŞă°ăŠăăăă°ăŽăżăčŞčăăžăă
éˇć
ăăăăŽ2ă¤ăŽćšćłăŽăŠăĄăă使ç¨ăăŚĺč¨ăżă¤ăăčĺĽăăăăŤé˘äżăŞăăăăăăčŞčăăăă¨ćłĺŽăăăăŽć ĺ ąă使ç¨ăăŚăć§çŻă§ăăăăźăŤăŽç¨ŽéĄă確čŞăăžăă
ăăźăŤă大ăžăăŤçćďźăšăăŞăłăŹăźăŞăŠďźă¨ĺ çďźă´ăŞăłăăŞăŠďźăŤă°ăŤăźăĺă§ăăžăă
ćăĺç´ăŞçćăłăźăăŻăswitchăšăăźăăĄăłăăŤćŹ č˝ăăŚăăăąăźăšăĺ ĽĺăăăăăŽăăźăŤă§ăă ăăăŻçˇ¨éč ă使ç¨ă§ăăžăă ĺč¨ăżă¤ăăĺč¨ăżă¤ăă¨ăăŚčĺĽăăăă¨ăăăăŻç°Ąĺă§ăďźĺ°ăé˘ĺă§ăăăĺŽéăŽçćăă¸ăăŻăŻč¨čŞăľăăźăăŽćçĄăŤăăăăăĺăăŤăŞăăžăďźă
ăăšăŚăŽĺ ´ĺăŤăăăŚăä¸ĺ¤ćĄäťśăŽă1ă¤ăăć¤č¨źăăé˘ć°ăçćăăăă¨ăĺŻč˝ă§ăă
ĺćĺăŽĺ ´ĺăăšăăŞăłăŹăźăŽăăăŞăăźăŤăăăŁă¨ăăĺŻč˝ć§ăăăăžăă https://github.com/golang/go/issues/19814#issuecomment -291002852ă§ăăăă¤ăăŽĺŻč˝ć§ăŤă¤ăăŚč¨ĺăăžăăă
ć大ăŽçćăăźăŤăŻăăăŽć ĺ ąă使ç¨ăăŚăăĺŞăăăăˇăłăłăźăăçćă§ăăăłăłăă¤ăŠă§ăăăăžăăžăă§ăă
çžćçšă§ăŻäťăŽăă¨ăŻčăăăăžăăă 誰ăăŽăŚăŁăăˇăĽăŞăšăăŤä˝ăăăăžăăďź
ĺ çăŽĺ ´ĺăćăăăŞĺčŁăŻĺžšĺşçăŞăŞăłăăŁăłă°ă§ăă č¨čŞăľăăźăăăŞăĺ ´ĺăĺŽéăŤăŻ2税éĄăŽăŞăłăăŁăłă°ăĺż čŚă§ăă
1ăŻäşç´°ăŞăă¨ă§ăăă2ăŻ100ďź ć¤č¨źă§ăăďźĺŽĺ ¨ă§ăŞăăă¨ăçĄčŚăăŚăďźăăłăźăă使ç¨ăăăăšăŚăŽăłăźăăăăŽăŞăłăżăźăĺŽčĄăăăă¨ăćĺž ă§ăăŞăăăăăăšăŚăŽĺŻč˝ăŞçść ă¨ăăăŠăŤăăŽăąăźăšăĺż čŚăŤăŞăăžăă
2ăŻăĺč¨ăŤĺŻžăăŚçĄĺšăŞçść ăçćăăĺŻč˝ć§ăŽăăăăšăŚăŽăłăźăăĺć ăžăăŻčĺĽăăăă¨ăŤăăŁăŚĺ¤ăĺŽéăŤčż˝čˇĄăăăă¨ăŻă§ăăžăăă§ăăăăĺč¨ăżă¤ăăĺăčžźăă§ăăăăă使ç¨ăăŚé˘ć°ăĺźăłĺşăĺ ´ĺăŞăŠăĺ¤ăăŽĺç´ăŞă¨ăŠăźăăăŁăăăăĺŻč˝ć§ăăăăžăă ăpkg.Fďźvďźăä˝ćăăžăăăăpkg.Fďźv.EmbeddedFieldďźăćĺłăăžăăăăžăăŻă2ăpkg.FăŤć¸ĄăăăŽă§ăpkg.Bă使ç¨ăăŚăă ăăăă ć§é ä˝ăŽĺ ´ĺăăăŠăĄăăăŞăłăŤĺăćżăăXăŽĺ ´ĺăŻăăŁăźăŤăFăăźă䝼ĺ¤ăŽĺ¤ăŤč¨ĺŽăăăăŞăŠăŽé常ăŤćç˝ăŞĺ ´ĺăé¤ăăŚăä¸ĺşŚăŤ1ă¤ăŽăăŁăźăŤăăč¨ĺŽăăăă¨ăăä¸ĺ¤ćĄäťśă埡ĺśăăăă¨ăŻăăžăă§ăăžăăă§ăăă "ă ăăăąăźă¸ăŽĺ¤é¨ăăĺ¤ăĺăĺ Ľăăĺ ´ĺăŻăçćăăăć¤č¨źé˘ć°ă使ç¨ăăăăăŤčŚćąăăăĺŻč˝ć§ăăăăžăă
ăă1ă¤ăŽĺ¤§ăăŞăă¨ăŻăgodocăŤčĄ¨ç¤şăăăăă¨ă§ăă godocăŻăă§ăŤconst / iotaăă°ăŤăźăĺăăŚăăăďź20131ăŻă¤ăłăżăźăă§ă¤ăšăŽçäźźĺč¨ăŤĺ˝šçŤăĄăžăă ä¸ĺ¤ćĄäťśăćĺŽăă䝼ĺ¤ăŤăĺŽçžŠă§ć示ăăăŚăăŞăć§é ä˝ăăźă¸ă§ăłă¨ăŻĺŽéăŤăŻä˝ăŽé˘äżăăăăžăăă
ăŞăăŠă¤ăłăăźăŤďźăŞăłăżăźăăłăźăă¸ă§ăăŹăźăżăźăŞăŠďźăĺć§ă§ăă
ăăăăéçăŞć ĺ ąăĺĺ¨ăăžăăăăŽăăăŤĺăˇăšăă ďźăžăăŻĺć ďźăŻĺż čŚăăăžăăăčŚĺăŻćŁĺ¸¸ăŤćŠč˝ăăžăă ă¤ăłăżăźăă§ă¤ăšăŤă¨ăŻăšăăźăăăăŚăăŞăăĄă˝ăăăĺŤăžăăŚăăĺ ´ĺăéçăăźăŤăŻăăăăŻăăźăşăăľă ă¨ăăŚćąăďźĺšćçăŤăăă§ăăăăďźăĺż čŚăŞĺć/ăłăźăçćăĺŽčĄăăăă¨ăé¸ćă§ăăžăă ĺć§ăŤăiota-enumsăŽčŚĺăăăăžăă
ăŞăăŹăŻăăŻĺŽčĄćĺć ĺ ąç¨ă§ă-ăăăŚăăćĺłă§ăăłăłăă¤ăŠăźăŻăăă§ć ŁäžăŤăăĺč¨ăćŠč˝ăăăăăăŤĺż čŚăŞć ĺ ąăćśĺťăăžăďźé˘ć°ăžăăŻĺŽŁč¨ăăăĺăžăăŻĺŽŁč¨ăăăĺŽć°ăŽăŞăšăă¸ăŽă˘ăŻăťăšăćäžăăŞăăăďźăĺŽéăŽĺč¨ăăăăĺŻč˝ăŤăăăă¨ăŤĺćăăççąă§ăă
ďźăžăăFTRăŻăăŚăźăšăąăźăšăŤăăŁăŚăŻăéçăŤć˘çĽăŽć ĺ ąă使ç¨ăăŚĺż čŚăŞăŠăłăżă¤ă ć ĺ ąăçćăăăăźăŤă使ç¨ăăăă¨ăă§ăăžăăăă¨ăă°ăĺż čŚăŞăżă°ăĄă˝ăăăćă¤ăżă¤ăăĺćăăăŤăăŻă˘ăăăăźăăŤăçćăăăă¨ăă§ăăžăăăăăăăŚăźăšăąăźăšăăŠăăŞăăăăăăŞăăŽă§ăăăăŽĺŽç¨ć§ăčŠäžĄăăăŽăŻéŁăăă§ăďźă
ăăă§ăç§ăŽčłŞĺăŻćĺłçăŤă§ăăďźĺŽčĄćăŤăăŽć ĺ ąăĺŠç¨ă§ăăăăăŤăăăă¨ăŽăŚăźăšăąăźăšăŻä˝ă§ăăăăďź
ă¨ăŤăăăć˘ç´˘ăăăŽăŻĺ ŹćŁăŞčăăŞăŽă§ăć˘ç´˘ăăŚăżăžăăăă
ç§ăăăăăć˘ćąăăăă¨č¨ăŁăă¨ăăç§ăŻăăăăăĺćăăç犺ä¸ă§ăăăăŤă¤ăăŚč°čŤăăăă¨ăăćĺłă§ăŻăŞăăăăăăăŽčŚĺă使ç¨ăăăăăăăŠăăťăŠćç¨/ĺż čŚ/ĺŽç¨çă§ăăăă確čŞăăăăźăŤăĺŽčŁ ăăăă¨ăăćĺłă§ăăă
çľé¨ăŹăăźăăŽĺŠçšăŻă
ăăăŽăăăŤć˘ĺăŽăĄăŤăăşă ă使ç¨ăăăă¨ăăŚăăăé¨ĺăăšăăăăăŚăăžăă ăăŞăăŻéçăŞçś˛çž ć§ăćăĄăă-ĺč¨ăŽăă§ăăŻďźĺéĄďźă ă¨ăŻăšăăźăăăăŚăăŞăăĄă˝ăăă¨ăŽă¤ăłăżăźăă§ăźăšăčŚă¤ăăçś˛çž ć§ăĺŽčĄăăăăźăŤăä˝ćăăžă-使ç¨ăăăŚăăăżă¤ăăšă¤ăăăăă§ăăŻăăăă°ăăăŽéăăŽăăźăŤă使ç¨ăăžăďźć˘ĺăŽăĄăŤăăşă ă使ç¨ăăžăďźă ăăă夹ćăăă¨ăăăć¸ăăŞăăă
ç§ăŻĺ¤§ĺŁ°ă§čăăŚăăŚăăăźăŤă使ç¨ăăĺŻč˝ć§ăŽăăăăăăŽčăăŤĺşăĽăăŚéçčŞčćŠč˝ăŽä˝ćĽăéĺ§ăăžăăă ç§ăŻăćéťăŽăăĄăŤăăŁăźăăăăŻăăăĺ¤ăăŽă˘ă¤ăă˘ăć˘ăăŚăăă¨ćăăžăďźăăăŚăăăăŻĺć ăŤĺż čŚăŞć ĺ ąăĺçćăăăă¨ă§ĺ ąăăăžăăďźă
FWIWăăăăăŞăăč¤éăŞăąăźăšăĺăŤçĄčŚăăŚăćŠč˝ăăăăŽăŤçŚçšăĺ˝ăŚăăŞăďźaďźă¤ăłăżăźăă§ăźăšăŽă¨ăŻăšăăźăăăăŚăăŞăăĄă˝ăăă¨bďźĺşç¤ă¨ăŞăĺă¨ăăŚintăćăĄăĺä¸ăŽĺŽć°ăćă¤ĺç´ăŞconst-iota-enum-ćĺž ăăăăăŠăźăăăăŽĺŽŁč¨ă ăăźăŤă使ç¨ăăăŤăŻăăăă2ă¤ăŽĺéżçăŽăăăăă使ç¨ăăĺż čŚăăăăžăăăIMOăŻĺéĄăăăžăăďźăłăłăă¤ăŠăăźăŤă使ç¨ăăăŤăŻăĺč¨ăć示çăŤä˝żç¨ăăĺż čŚăăăăăăĺéĄăŞăăăă§ăďźă
ăăăŻééăăŞăéĺ§ăăăŽăŤéŠăăĺ ´ćă§ăăăĺ¤ć°ăŽăăăąăźă¸ăťăăă§ĺŽčĄăă誤ć¤çĽ/誤ć¤çĽăăăă¤ăăăă確čŞăăĺžă§ăă¤ă¤ăŤă¤ăłă§ăăžăă
https://godoc.org/github.com/jimmyfrasche/closed
ăžă é常ăŤé˛čĄä¸ăŽä˝ćĽă§ăă ăłăłăšăăŠăŻăżăźăŤăăŠăĄăźăżăźăčż˝ĺ ăăĺż čŚăăŞăăă¨ăç´ćăăăă¨ăŻă§ăăžăăă ăăăăăăšăăăăĺ¤ăăŽăă°ăăăăžăă ăăăăăăă§éăśăŤăŻĺĺă§ăă
cmds / closed-exporeră§ăŽä˝żç¨äžăăăăă¤ăłăăźăăăšă§ćĺŽăăăăăăąăźă¸ă§ć¤ĺşăăăăăšăŚăŽéăăăżă¤ăăä¸čŚ§čĄ¨ç¤şăăăžăă
ă¨ăŻăšăăźăăăăŚăăŞăăĄă˝ăăă使ç¨ăăŚăăšăŚăŽă¤ăłăżăźăă§ă¤ăšăć¤ĺşăĺ§ăăžăăăăăăăăŻăăŞăä¸čŹçă§ăăăćăăăŤĺč¨ĺă§ăăăăŽăăăă°ăăăă§ăŞăăăŽăăăăžăă 犺ăŽăżă°ăĄă˝ăăăŽčŚĺăŤéĺŽăăă¨ăĺ¤ăăŽĺč¨ăżă¤ăă夹ăăăăăă严ćšăĺĽă ăŤč¨é˛ăăĺč¨ăżă¤ăăĺ°ăčś ăăŚéăăăżă¤ăăŤăăăąăźă¸ăä¸čŹĺăăăă¨ăŤăăžăăă
ĺćĺă使ç¨ăăŚăéăŤé˛ăżăĺŽçžŠăăăĺăŽăăšăŚăŽéăăăăťăăĺŽć°ăč¨é˛ăăžăăă çşčŚăăăăăăăťăăăĺ ŹéăăäşĺŽă§ăă
ăă税ăŽăăźăŤăźăłăĄăłăăĺż čŚăŤăŞăăăăăŞăăˇă§ăłăŽć§é ä˝ăĺŽçžŠć¸ăżăŽçŠşăŽă¤ăłăżăźăă§ă¤ăšăŻăžă ć¤ĺşăăăžăăăăstdlibăŤăăăăŽăŻçšĺĽăŞĺ ´ĺăŤä˝żç¨ăăăžăă
ă¨ăŻăšăăźăăăăŚăăŞăăĄă˝ăăă使ç¨ăăŚăăšăŚăŽă¤ăłăżăźăă§ă¤ăšăć¤ĺşăĺ§ăăžăăăăăăăăŻăăŞăä¸čŹçă§ăăăćăăăŤĺč¨ĺă§ăăăăŽăăăă°ăăăă§ăŞăăăŽăăăăžăă
ćäžăăăŞăăŁăäžăăăă¤ăćäžăăŚăăă ăăă°ĺŠăăăžăă
@Meroviusçłă訳ăăăžăăăăăŞăšăăäżćăăŚăăžăăă§ăăă stdlib.shďźcmds / closed-explorerĺ ďźăĺŽčĄăăŚăăăăčŚă¤ăăžăăă 揥ĺăăă§éăśă¨ăăŤčŻăäžăŤĺşăăăăăăăăăć稿ăăžăă
ĺč¨ĺă¨ăăŚç§ăčć ŽăăŚăăŞăăŽăŻăăăă¤ăăŽĺŽčŁ ăŽ1ă¤ăăăŠă°ă¤ăłăăăăăŤä˝żç¨ăăăŚăăăăšăŚăŽă¨ăŻăšăăźăăăăŚăăŞăă¤ăłăżăźăă§ă¤ăšă§ăăăă¤ăłăżăźăă§ă¤ăšăŽĺ 厚ăŻä˝ăć°ăŤăăăćşčśłăăăăŽăăăŁăă ăă§ăă ăăăăŻĺč¨ă§ăŻăŞăă¤ăłăżăźăă§ăźăšă¨ăăŚé常ăŤä˝żç¨ăăăŚăăžăăăăă¨ăŻăšăăźăăăăŞăăŁăăăăŤăăžăăžéăăăăžăăă ăăăăăăăŻéăăŽăŞăĺşĺĽă§ăăăç§ăŻăăăŤčŞżćťăăĺžăăă¤ă§ăčăăĺ¤ăăăă¨ăă§ăăžăă
@jimmyfrascheăăăăŻăŻăăźăşăăľă ă¨ăăŚéŠĺăŤćąăăăăšăă ă¨ç§ăŻä¸ťĺźľăăžăă 彟ăăĺçăżă¤ăăć°ăŤăăŞăĺ ´ĺďźă¤ăžăăă¤ăłăżăźăă§ă¤ăšăŽăĄă˝ăăăĺźăłĺşăă ăăŽĺ ´ĺďźăéçăŞăłăżăźăŻăăăšăŚăŽăšă¤ăăăçś˛çž çă§ăăăăăăćĺĽăč¨ăăŞăă ăăă¨ç§ăŻä¸ťĺźľăăžă-ăăăăŁăŚăăăăăćąăăă¨ăŤăă¤ăăšé˘ăŻăăăžăăăŻăăźăşăăľă ă¨ăăŚă OTOHăćă ăżă¤ăăĺăćżăăŚăąăźăšăççĽăăĺ ´ĺăä¸ĺšłăč¨ăăŽăŻćŁăăă§ăăă-ăăăŻăžăăŤăŞăłăżăźăćăžăăăă¨ăŤăŞăŁăŚăă税éĄăŽăă¨ă§ăă
ĺ ąç¨ä˝ăżă¤ăăăĄă˘ăŞä˝żç¨éăăŠăŽăăăŤĺć¸ă§ăăăăć˘ćąăăăăăŽčŻăč¨čăčż°ăšăăă¨ćăăžăă ç§ăŻGoă§ă¤ăłăżăźăăŞăżăźăä˝ćăăŚăăžăăăValuesăŻăăžăăžăŞĺă¸ăŽăă¤ăłăżăźăŤăŞăĺŻč˝ć§ăăăăăăĺż ăă¤ăłăżăźăă§ă¤ăšă¨ăăŚĺŽčŁ ăăăValueĺăăăăžăă ăăăŻăăăăă[]ĺ¤ăCă§ă§ăăăăăŤĺ°ăăŞăăăăżă°ă§ăă¤ăłăżăăăăŻăăăŽăŤćŻăšăŚ2ĺăŽăĄă˘ăŞăćśč˛ťăăăă¨ăćĺłăăžăă
č¨čŞäťć§ă§ăŻăăăŤă¤ăăŚč¨ĺăăĺż čŚăŻăăăžăăăăä¸é¨ăŽĺ°ăăŞĺ ąç¨ä˝ăżă¤ăă§ăŻé ĺăŽăĄă˘ăŞä˝żç¨éăĺĺăŤĺć¸ăăăă¨ăŻăĺ ąç¨ä˝ăŤă¨ăŁăŚăăŞă誏ĺžĺăŽăăč°čŤăŤăŞăĺŻč˝ć§ăăăăžăăďź ç§ăŽçĽăéăăäťćĽăŽĺ˛ç˘ă§ăŻä¸ĺŻč˝ăŞăă¨ăăăăă¨ăă§ăăžăă ĺŻžç §çăŤăă¤ăłăżăźăă§ă¤ăšăŽä¸ăŤăŚăăŞăłăĺŽčŁ ăăă¨ăăăă°ăŠă ăŽćŁç˘şć§ă¨ç解ć§ăŤĺ˝šçŤă¤ĺŻč˝ć§ăăăăžăăăăăˇăłăŹăăŤă§ăŻä˝ăć°ăăăă¨ăŻăăăžăăă
ăăăŠăźăăłăšăăšăăŻčĄăŁăŚăăžăăă ç 犜ăŽćšĺć§ăććăăă ăă§ăă
䝣ăăăŤăĺ¤ăunsafe.Pointeră¨ăăŚĺŽčŁ ă§ăăžăă
2018ĺš´2ć6ćĽ15:54ăăBrianSlesinskyă [email protected]ăŻćŹĄăŽăăăŤć¸ăăŚăăžăă
ĺ ąç¨ä˝ăżă¤ăăăŠăŽăăăŤĺć¸ă§ăăăăć˘ćąăăăăăŽčŻăč¨čăčż°ăšăăă¨ćăăžă
ăĄă˘ăŞä˝żç¨éă ç§ăŻGoă§ă¤ăłăżăăŞăżăć¸ăăŚăăŚăăăŽĺ¤ĺăćăŁăŚăăžă
ĺ¤ăŻăă¤ăłăżăŤăŞăĺŻč˝ć§ăăăăăăĺż ăă¤ăłăżăźăă§ă¤ăšă¨ăăŚĺŽčŁ ăăăžă
ăăžăăžăŞăżă¤ăăŤă ăăăŻăăăăă[]ĺ¤ă2ĺăŽéăĺ ăăăă¨ăćĺłăăžă
ăăŞăăă§ăăăăăŤĺ°ăăŞăăăăżă°ă§ăă¤ăłăżăăăăŻăăăă¨ă¨ćŻčźăăăĄă˘ăŞ
Că§ăăăăŻăăăăăŽăăă§ăăďźč¨čŞäťć§ăŻăăăŤă¤ăăŚč¨ĺăăĺż čŚăŻăăăžăăăăăĄă˘ăŞăĺć¸ăăŚăăăăă§ă
ä¸é¨ăŽĺ°ăăŞĺ ąç¨ä˝ăżă¤ăă§é ĺăĺĺăŤä˝żç¨ăăă¨ăăăŞăăŽĺŻč˝ć§ăăăăžă
çľĺăŤĺŻžăă誏ĺžĺăŽăăč°čŤďź ăăăŻăăŞăăŤç§ăăăéăä˝ăăăăăă¨ăĺŻč˝ăŤăăžă
äťćĽăŽĺ˛ç˘ă§ăŻä¸ĺŻč˝ă ă¨çĽăŁăŚăăžăă ĺŻžç §çăŤă
ă¤ăłăżăźăă§ăźăšăŽä¸é¨ăŻăăăă°ăŠă ăŽćŁç˘şć§ă¨
ç解ăăăăă§ăăăăăˇăłăŹăăŤă§ăŻä˝ăć°ăăăă¨ăŻăăžăăăăăăŠăźăăłăšăăšăăŻčĄăŁăŚăăžăăă ćšĺć§ăććăăă ă
ăŞăľăźăăâ
ăăŞăăč¨ĺăăăăŽă§ăăŞăăŻăăăĺăĺăŁăŚăăžăă
ăăŽăĄăźăŤăŤç´ćĽčżäżĄăăGitHubă§čĄ¨ç¤şăăŚăă ăă
https://github.com/golang/go/issues/19412#issuecomment-363561070 ăăžăăŻăăĽăźă
ăšăŹăă
https://github.com/notifications/unsubscribe-auth/AGGWBz-L3t0YosVIJmYNyf2iQ-YgIXLGks5tSLv9gaJpZM4MTmSr
ă
@skybrianăăăŻăĺč¨ĺăŽĺŽčŁ ăŤé˘ăăŚăŻăăŞă
ĺč¨ăżă¤ăăŻăăăăăżă°äťăĺ ąç¨ä˝ăŤăŞăăăšăŠă¤ăšĺ ă§çžĺ¨ă¨ĺăăăăăŽăšăăźăšăĺ ăăĺŻč˝ć§ăăăăžăă ăšăŠă¤ăšăĺ質ă§ăŞăéăăäťăŻăăĺ ˇä˝çăŞăšăŠă¤ăšăżă¤ăă使ç¨ăăăă¨ăă§ăăžăă
ăăăăă é常ăŤçšćŽăŞăąăźăšă§ăŻăçšăŤćéŠĺăăă°ăĄă˘ăŞăĺ°ăçŻç´ă§ăăăăăăăžăăăăĺŽéăŤĺż čŚăŞĺ ´ĺăŻćĺă§ćéŠĺăăăă¨ăă§ăăăăă§ăă
@ DemiMarieunsafe.PointerăŻAppEngineă§ćŠč˝ăăžăăăăăăăŽĺ ´ĺăăăŹăăźă¸ăłăŹăŻăżăźăĺ°çĄăăŤăăăŤăăăăăăăŻăăăă¨ăŻă§ăăžăăă ăă¨ăăăăĺŻč˝ă§ăăŁăă¨ăăŚăăăăăŻćăĄéăłă§ăăŞăă§ăăăă
@MeroviusăŻăăăăăŻăăăăĄă˘ăŞăŹă¤ă˘ăŚăăç解ăăăŤăŻăăŠăłăżă¤ă ă¨ăŹăăźă¸ăłăŹăŻăżăźăĺ¤ć´ăăĺż čŚăăăăžăă ăăăăă¤ăłăă§ăă ăă¤ăłăżăźăŻGoăŠăłăżă¤ă ăŤăăŁăŚçŽĄçăăăăăăă¤ăłăżăźăă§ăźăšăăăĺŽĺ ¨ăŞćšćłă§ĺŽčĄăăăĺ ´ĺăŻăăŠă¤ăăŠăŞăźăăłăłăă¤ăŠăźă§ĺŽčĄăăăă¨ăŻă§ăăžăăă
ăăăăéŤéă¤ăłăżăăŞăżăä˝ćăăăă¨ăŻăžăăŞăŚăźăšăąăźăšă§ăăăă¨ă厚ćăŤčŞăăžăă ăăăăäťăŤăăăăžăăďź č¨čŞćŠč˝ăăăć°ăŤăăăčŻăćšćłăŻăäťćĽăŽGoă§ăŻç°ĄĺăŤă§ăăŞăăă¨ăčŚă¤ăăăă¨ă ă¨ćăăăžăă
ăăăŻćŹĺ˝ă§ăă
ç§ăŽčăă§ăŻăGoăŻé訳ăć¸ăăŽăŤćéŠăŞč¨čŞă§ăŻăăăžăăă
ăăŽăăăŞă˝ăăăŚă§ă˘ăŽé常ăŤĺçăŞăăă éŤć§č˝ăĺż
čŚăŞĺ ´ĺăŻă
ăăăăŤăźăăŻă˘ăťăłăăŞă§ä˝ćăăĺż
čŚăăăăžăă ä˝ăççąăŻăăăžăă
App Engineă§ĺä˝ăăă¤ăłăżăăŞăżăä˝ćăăĺż
čŚăăăăžăăďź
2018ĺš´2ć6ćĽĺĺž6ć15ĺăăBrianSlesinskyă [email protected]ăŻćŹĄăŽăăăŤć¸ăăŚăăžăă
@DemiMarie https://github.com/demimarieunsafe.Pointerăă˘ăăŞă§ćŠč˝ăăŞă
ă¨ăłă¸ăłăăăăŚăăăăŤăăăăăăŞăă§ăŻăăăăăăăŻăăăă¨ăŻă§ăăžăă
ăŹăăźă¸ăłăŹăŻăżăźăĺ°çĄăăŤăăžăă ăăăĺŻč˝ă§ăăŁăă¨ăăŚăăăăă§ăŻăŞăă§ăăă
ăăźăżăăŤă
@metroviusăŻăăăŠăłăżă¤ă ă¨ăŹăăźă¸ăłăŹăŻăżăźăĺ¤ć´ăăĺż
čŚăăăăžă
ăăăŻăăăăĄă˘ăŞăŽăŹă¤ă˘ăŚăăç解ăăă ăăăăă¤ăłăă§ăă ăă¤ăłăżăŻ
GoăŠăłăżă¤ă ăŤăăŁăŚçŽĄçăăăăăă
ĺŽĺ
¨ăŞćšćłă¨ăăŚăăŠă¤ăăŠăŞăăłăłăă¤ăŠă§ăăăčĄăăă¨ăŻă§ăăžăăă
ăăăăç§ăŻăăăŤéŤéă¤ăłăżăăŞăżăć¸ăăă¨ăŻçăă使ç¨ćłă§ăăăă¨ăčŞăăžă
ĺ ´ĺă ăăăăäťăŤăăăăžăăďź ăăć°ă辡ăăăăčŻăćšćłăŽăăă§ă
č¨čŞćŠč˝ăŻăäťćĽăŽGoă§ăŻç°ĄĺăŤĺŽčĄă§ăăŞăăă¨ăčŚă¤ăăăă¨ă§ăă
â
ăăŞăăč¨ĺăăăăŽă§ăăŞăăŻăăăĺăĺăŁăŚăăžăă
ăăŽăĄăźăŤăŤç´ćĽčżäżĄăăGitHubă§čĄ¨ç¤şăăŚăă ăă
https://github.com/golang/go/issues/19412#issuecomment-363598572 ăăžăăŻăăĽăźă
ăšăŹăă
https://github.com/notifications/unsubscribe-auth/AGGWB65jRKg_qVPWTiq8LbGk3YM1RUasks5tSN0tgaJpZM4MTmSr
ă
@rogpeppeăŽććĄăŻé常ăŤé ĺçă ă¨ćăăžăă ăžăă@ griesemerăŤăăŁăŚăă§ăŤçšĺŽăăăŚăăăĄăŞăăăŤĺ ăăŚăčż˝ĺ ăŽăĄăŞăăăĺźăĺşăĺŻč˝ć§ăăăăŽă§ăŻăŞăăă¨ćăăžăă
ććĄăŻćŹĄăŽăăăŤčż°ăšăŚăăžăăăĺč¨ăżă¤ăăŽăĄă˝ăăăťăăăŻăăĄă˝ăăăťăăăŽĺ
ąéé¨ĺăäżćăăžăă
ĺăăĄă˝ăăăé¤ăăăăšăŚăŽăłăłăăźăăłăăżă¤ăăŽ
ĺĺăç°ăŞă署ĺăă
ăăăăĺăŻĺăŞăăĄă˝ăăăťăăă§ăŻăăăžăăă ĺč¨ăżă¤ăăăăăŽăłăłăăźăăłăăżă¤ăă§ăľăăźăăăăŚăăćä˝ăŽĺ ąéé¨ĺăăľăăźăăăŚăăĺ ´ĺăŻăŠăăŞăăžăăďź
ăă¨ăă°ă揥ăŽăă¨ăčć ŽăăŚăă ăăă
var x int|float64
揥ăŽăă¨ăăăžăăăă¨ăăčăă§ăă
x += 5
ăăăŻăăăŤăżă¤ăăŽăšă¤ăăăć¸ăĺşăăŽă¨ĺăă§ăă
switch i := x.(type) {
case int:
x = i + 5
case float64:
x = i + 5
}
ĺĽăŽăăŞă˘ăłăăŤăŻăăłăłăăźăăłăăżă¤ăčŞä˝ăĺč¨ăżă¤ăă§ăăăżă¤ăăšă¤ăăăĺŤăžăăžăă
type Num int | float64
type StringOrNum string | Num
var x StringOrNum
switch i := x.(type) {
case string:
// Do string stuff.
case Num:
// Would be nice if we could use i as a Num here.
}
ăžăăĺč¨ĺă¨ĺĺśç´ă使ç¨ăăă¸ă§ăăŞăăŻăˇăšăă ăŽéăŤăŻăćŹĺ˝ăŤç´ ć´ăăăç¸äšĺšćăăăĺŻč˝ć§ăăăă¨ćăăžăă
var x int|float64
var x, y int | float64
ăŠăă§ăăďź ăăăăčż˝ĺ ăăă¨ăăŽăăă§ăŽăŤăźăŤăŻä˝ă§ăăďź ăŠăŽć夹ăŽăăĺ¤ćăčĄăăăăŽă§ăăďźăăăŚăăŽççąďźďź çľćăŽăżă¤ăăŻăŠăăŞăăžăăďź
GoăŻăďźCăŽăăăŤďźĺźăŽčŞĺĺ¤ćăćĺłçăŤčĄăăžăăăăăăăŽčłŞĺăŤçăăăŽăŻç°Ąĺă§ăŻăŞăăăă°ăŤă¤ăŞăăăžăă
ăăăŚăăăŤćĽ˝ăăăăăŤďź
var x, y, z int|string|rune
x = 42
y = 'a'
z = "b"
fmt.Println(x + y + z)
fmt.Println(x + z + y)
fmt.Println(y + x + z)
fmt.Println(y + z + x)
fmt.Println(z + x + y)
fmt.Println(z + y + x)
int
ă string
ăăăăłrune
ăăšăŚăŤă +
ćźçŽĺăăăăžăă ä¸č¨ăŽĺ°ĺˇă¨ăŻä˝ă§ăăăăŞăăăăŚä˝ăăăăçľćăĺŽĺ
¨ăŤćˇˇäšąăăŞăăăăŤăăăŤăŻăŠăăăă°ăăă§ăăďź
var x, y int | float64
ăŠăă§ăăďź ăăăăčż˝ĺ ăăă¨ăăŽăăă§ăŽăŤăźăŤăŻä˝ă§ăăďź ăŠăŽć夹ăŽăăĺ¤ćăčĄăăăăŽă§ăăďźăăăŚăăŽççąďźďź çľćăŽăżă¤ăăŻăŠăăŞăăžăăďź
@MeroviusăŻăć夹ăŽĺ¤ăĺ¤ćăćéťçăŤčĄăăăăă¨ăŻăăăžăăăăç§ăŽč¨čéŁăăăăŽĺ°čąĄăăŠăŽăăăŤä¸ăăăă¨ăă§ăăăăŻăăăăžăă ăăă§ăŻăĺç´ăŞx + y
ăŻăćéťçăŞĺ¤ćăŽĺŻč˝ć§ă示ĺăăŚăăăăăăłăłăă¤ăŤăăăžăăă ăă ăă揥ăŽăăăăăăłăłăă¤ăŤăăăžăă
z = int(x) + int(y)
z = float64(x) + float64(y)
ĺć§ăŤăxyzăŽäžăŻăćéťçăŞĺ¤ćăĺż čŚăŤăŞăĺŻč˝ć§ăăăăăăăłăłăă¤ăŤăăăžăăă
ăăľăăźăăăăŚăăćä˝ăŽäş¤ĺˇŽçšăăľăăźăăăŚăăăă¨ăăăŽăŻăăăă¨ăŽăăăŤčăăăžăăăç§ăćĺłăăŚăăăă¨ăĺŽĺ ¨ăŤăŻäźăăŚăăžăăă ăăăšăŚăŽăłăłăăźăăłăăżă¤ăç¨ăŤăłăłăă¤ăŤăăăăŽăăăŞăăŽăčż˝ĺ ăăă¨ăăăăăŠăŽăăăŤćŠč˝ăăă¨ćăăă誏ćăăăŽăŤĺ˝šçŤăĄăžăă
ĺĽăŽäžăŻăăăšăŚăŽăłăłăăźăăłăăżă¤ăăăšăŠă¤ăšă¨ăăăă§ăăĺ ´ĺă§ăă ăżă¤ăăšă¤ăăăĺż čŚă¨ăăăŤăĺč¨ăżă¤ăă§lenăĺźăłĺşăăă¨ăă§ăăă¨äžżĺŠă§ăă
intăstringăruneăŽăăšăŚăŤ+ćźçŽĺăăăăžăă ä¸č¨ăŽĺ°ĺˇă¨ăŻä˝ă§ăăăăŞăăăăŚä˝ăăăăçľćăĺŽĺ ¨ăŤćˇˇäšąăăŞăăăăŤăăăŤăŻăŠăăăă°ăăă§ăăďź
ăĺč¨ĺăăăŽăłăłăăźăăłăĺă§ăľăăźăăăăŚăăćä˝ăŽĺ ąéé¨ĺăăľăăźăăăŚăăĺ ´ĺăŻăŠăăŞăăžăăďźăă¨ăăăă¨ăčż˝ĺ ăăăăŁăă ăă§ăă ăăżă¤ăăŻăĺ¤ăŽăťăăăăăăăăŽĺ¤ăŤĺşćăŽćä˝ăăăłăĄă˝ăăă¨ă¨ăăŤćąşĺŽăăăă¨ăăGoSpecăŽăżă¤ăăŽčŞŹćăŤč§Śçşăăăžăăă
ç§ăč¨ăăăăŁăăŽăŻăĺăŻĺăŞăĺ¤ăăĄă˝ăăă§ăŻăŞăăăăsumĺăŻăăăŽăłăłăăźăăłăĺăăäťăŽăăŽăŽĺ ąéć§ăćăăăă¨ăăĺŻč˝ć§ăăăă¨ăăăă¨ă§ăă ăăŽăăăŽäťăŽăăŽăăŻăĺăŞăćźçŽĺăŽăťăăăăă垎ĺŚăŞéăăăăăžăă
ĺĽăŽäžăŻănilă¨ăŽćŻčźă§ăă
var x []int | []string
fmt.Println(x == nil) // Prints true
x = []string(nil)
fmt.Println(x == nil) // Still prints true
严ćšăŽăłăłăăźăăłăăżă¤ăăŻĺ°ăŞăă¨ă1ă¤ăŽăżă¤ăănilăŤç¸ĺ˝ăăăăăăżă¤ăăšă¤ăăăŞăă§ĺč¨ăżă¤ăănilă¨ćŻčźă§ăăžăă ăăĄăăăăăăŻçžĺ¨ăŽă¤ăłăżăźăă§ăźăšăŽĺä˝ă¨ăŻĺ¤ĺ°ççžăăŚăăžăăă httpsďź//github.com/golang/go/issues/22729ăŤăăă¨ćŞăăă¨ă§ăŻăŞăăăăăăžăă
硨éďźĺçć§ăăšăăŻăăăĺŻĺŽšă§ăăă1ă¤äťĽä¸ăŽăłăłăăźăăłăăżă¤ăăăăŽć˝ĺ¨çăŞä¸č´ăŽăżăĺż čŚă¨ăăăăăăăă§ăŻćŞăäžă§ăă ăăŽçšă§ĺ˛ăĺ˝ăŚăăăŠăźăŞăłă°ăăžăă
ĺéĄăŻăçľćăaďźčŞĺĺ¤ćă¨ĺăĺéĄăćąăăŚăăăăbďźçŻĺ˛ă漾獯ăŤďźăăăŚIMOă桡䚹ăăŚďźĺśéăăăăă¨ă§ăăă¤ăžăăăăšăŚăŽćźçŽĺăŻăăăăăĺăŞăăŞăăŠăŤă§ăăćŠč˝ăăžăăă
ăžăăĺĽăŽĺéĄăăăăžăăăăă訹ĺŻăăă¨ăć§ćăżă¤ăăŽé˛ĺăŤĺŻžăăĺ ç˘ć§ăăăăŤĺśéăăăžăăä¸ä˝äşćć§ăçśćăăŞăăčż˝ĺ ă§ăăăżă¤ăăŻăć§ćăżă¤ăăŽăăšăŚăŽćä˝ă訹ĺŻăăăżă¤ăă ăă§ăă
ăăăăăšăŚăŻăďźăăăăă°ďźé常ăŤĺ°ăăŞĺ ˇä˝çăŞĺŠçăŽăăăŤăç§ăŤăŻćŹĺ˝ăŤĺäťăŤćăăžăă
çžĺ¨ăä¸ä˝äşćć§ăçśćăăŞăăčż˝ĺ ă§ăăăżă¤ăăŻăć§ćăżă¤ăăŽăăšăŚăŽćä˝ă訹ĺŻăăăżă¤ăăŽăżă§ăă
ăăăăăăŤă¤ăăŚăć確ăŤč¨ăă¨ăăăăŻăăăŠăĄăźăżăźăćĄĺźľăăăăĺăžăăŻĺ¤ć°ăčżăăăăžăăŻâŚăˇăłă°ăŤăăłĺăăĺč¨ăŤćĄĺźľăăăăŠăăăćąşĺŽă§ăăŞăăă¨ăćĺłăăžăă ć°ăăăżă¤ăăčż˝ĺ ăăă¨ăä¸é¨ăŽćä˝ďźĺ˛ăĺ˝ăŚăŞăŠďźăăłăłăă¤ăŤăŤĺ¤ąćăăăăă§ăăl
@MeroviusăŻăăĺč¨ăżă¤ăăŽăĄă˝ăăăťăăăŻăăĄă˝ăăăťăăăŽĺ
ąéé¨ĺăäżćăăŚăăăăăĺ
ăŽććĄăŤăŻäşćć§ăŽĺéĄăŽăăŞă˘ăłăăăă§ăŤĺĺ¨ăăăă¨ăŤćł¨ćăăŚăă ăăă
ăăăăŁăŚăăăŽăĄă˝ăăăťăăăĺŽčŁ
ăăŞăć°ăăăłăłăăźăăłăăżă¤ăăčż˝ĺ ăăă¨ăä¸ä˝äşćć§ăŽăŞăĺ¤ć´ăŤăŞăăžăă
ăăăăăăŤă¤ăăŚăć確ăŤč¨ăă¨ăăăăŻăăăŠăĄăźăżăźăćĄĺźľăăăăĺăžăăŻĺ¤ć°ăčżăăăăžăăŻâŚăˇăłă°ăŤăăłĺăăĺč¨ăŤćĄĺźľăăăăŠăăăćąşĺŽă§ăăŞăăă¨ăćĺłăăžăă ć°ăăăżă¤ăăčż˝ĺ ăăă¨ăä¸é¨ăŽćä˝ďźĺ˛ăĺ˝ăŚăŞăŠďźăăłăłăă¤ăŤăŤĺ¤ąćăăăăă§ăăl
ĺ˛ăĺ˝ăŚăŽĺä˝ăŻ@rogpeppeă§čŞŹćăăăŚăă
ä˝ă¨ăăŁăŚăăăżă¤ăăšă¤ăăăŽĺ¤ă§ăŽĺč¨ăżă¤ăăŽĺä˝ăŤé˘ăăŚăĺ ăŽrogpeppeććĄăć確ăŤăăĺż čŚăăăă¨ćăăžăă ĺ˛ăĺ˝ăŚă¨ăĄă˝ăăăťăăăŤă¤ăăŚăŻčŞŹćăăžăăăăăă ăă§ăă ĺšłçăŻăŠăă§ăăďź ă¤ăłăżăźăă§ăźăš{}ăăăăăžăăăăă¨ćăăžăă
var x int | float64
fmt.Println(x == "hello") // compilation error?
x = 0.0
fmt.Println(x == 0) // true or false? I vote true :-)
ăăăăŁăŚăăăŽăĄă˝ăăăťăăăĺŽčŁ ăăŞăć°ăăăłăłăăźăăłăăżă¤ăăčż˝ĺ ăăă¨ăä¸ä˝äşćć§ăŽăŞăĺ¤ć´ăŤăŞăăžăă
ăĄă˝ăăăŻăă¤ă§ăčż˝ĺ ă§ăăžăăăćźçŽĺăăŞăźăăźăăźăăăŚć°ăăĺăĺŚçăăăă¨ăŻă§ăăžăăă ăăăŻăžăăŤéăă§ă-彟ăăŽććĄă§ăŻătype-assertion / -switchă§ăŠăăă解é¤ăăŞăéăăsum-valueă§ä¸čŹçăŞăĄă˝ăăăĺźăłĺşăďźăžăăŻĺ˛ăĺ˝ăŚăďźăă¨ăăă§ăăžăăă ăăăăŁăŚăčż˝ĺ ăăĺăŤĺż čŚăŞăĄă˝ăăăăăéăăăăăŻé大ăŞĺ¤ć´ăŤăŻăŞăăžăăă ăăŞăăŽććĄă§ăŻăăŚăźăśăźăăŞăźăăźăăźăă§ăăŞăćźçŽĺă使ç¨ăăĺŻč˝ć§ăăăăăăăăă§ăé大ăŞĺ¤ć´ăŤăŞăăžăă
ďźăżă¤ăăťăšă¤ăăăŻăăăăŽć°ăăăżă¤ăăćăŁăŚăăŞăăŽă§ăç§ăŻăŠăĄăăăŽĺ˝ĺăŽććĄăŤčłćăăŚăăŞăăăćŁç˘şăŤççąă§ăăăăŞăăŻăĺč¨ăŤç¨ŽéĄăčż˝ĺ ăăă¨ăăžă äşćć§ăŤĺ˝ąéżăăĺ¤ć´ăŤăŞăăă¨ăććăăăĺ ´ĺăăăăžă- ăIăžăăŤăăŽççąă§ăŻăăźăşăăľă ăćăžăŞăďź
ĺ˛ăĺ˝ăŚăŽĺä˝ăŻă@ rogpeppeă§čŞŹćăăăŚăăă¨ăăăŽăžăžăŤăŞăăžă
彟ăăŽććĄăŻăĺč¨ĺ¤ă¸ăŽĺ˛ăĺ˝ăŚăŤă¤ăăŚăŽăżčŞŹćăăŚăăžăăç§ăŻăĺč¨ĺ¤ăăďźăăŽć§ćčŚç´ ăŽ1ă¤ă¸ăŽďźĺ˛ăĺ˝ăŚăŤă¤ăăŚčŞŹćăăŚăăžăă 彟ăăŽććĄăăăă訹ĺŻăăŚăăŞăăă¨ăŤĺćăăžăăăéăăŻă彟ăăŽććĄăŻăăŽĺŻč˝ć§ăčż˝ĺ ăăăă¨ă§ăŻăŞăă¨ăăăă¨ă§ăă ă¤ăžăăç§ăŽä¸ťĺźľăŻăĺŽéăŤăŻăăăăăĺĺžăă使ç¨ćłăĺłăăĺśéăăăŚăăăăăăăŞăăććĄăăăťăăłăăŁăŻăšăŻçšăŤćçă§ăŻăŞăă¨ăăăă¨ă§ăă
fmt.Println(x == "hello") // compilation error?
ăăăŻăăăă彟ăăŽććĄăŤăčż˝ĺ ăăăă§ăăăă ă¤ăłăżăźăă§ăźăšăŤăŻăĺçăŽçšćŽăŞăąăźăšăăă§ăŤăă
éă¤ăłăżăźăă§ăźăšăżă¤ăXăŽĺ¤xă¨ă¤ăłăżăźăă§ăźăšăżă¤ăTăŽĺ¤tăŻăăżă¤ăXăŽĺ¤ăćŻčźĺŻč˝ă§ăăăXăTăĺŽčŁ ăăŚăăĺ ´ĺăŤćŻčźĺŻč˝ă§ăătăŽĺçăżă¤ăăXă¨ĺä¸ă§ăăătăŽĺçĺ¤ăxăŤçăăĺ ´ĺăăăăăŻçăăăŞăăžăă ă
fmt.Println(x == 0) // true or false? I vote true :-)
ăăăăééăŁăŚăăžăă ä¸ăăăăŚăăăăŻäźźăŚăăžă
var x int|float64 = 0.0
y := 0
fmt.Println(x == y)
ďźä¸č¨ă§çľčŤäťăăăăăŤďźăłăłăă¤ăŤă¨ăŠăźă§ăăĺż čŚăăăăžăăăăŽčłŞĺăŻăĺćĺŽăăăŚăăŞăć°ĺ¤ĺŽć°ă¨ćŻčźăăĺ ´ĺăŤăŽăżĺŽéăŤćĺłăăăăžăă ăăŽćçšă§ăăăăäťć§ăŤăŠăŽăăăŤčż˝ĺ ăăăăăŤăăŁăŚç°ăŞăăžăă ăăăŻăă¤ăłăżăźăă§ă¤ăšăżă¤ăăŤĺŽć°ăĺ˛ăĺ˝ăŚăăŽă¨äźźăŚăăăăăăăăŠăŤăăŽăżă¤ăăŤăăĺż čŚăăăă¨ä¸ťĺźľăăăă¨ăă§ăăžăďźăăŽĺ ´ĺăćŻčźăŻfalseăŤăŞăăžăďźă ăŠăŽIMOăĺéĄăŞăăŽăăç§ăăĄăŻäťćĽăă§ăŤĺăĺ ĽăăŚăăžăă ăă ăăĺăŞăĺŽć°ăŽäťć§ăŤăąăźăšăčż˝ĺ ăăŚăăăăăĺč¨ăŤĺ˛ăĺ˝ăŚ/ćŻčźăăĺ ´ĺăăŤăăźăăăăŽćšćłă§ĺéĄă解湺ăăăă¨ăă§ăăžăă
ăă ăăăŠăĄăăŽćšćłă§ăăăŽčłŞĺăŤçăăăŤăŻăć§ćčŚç´ ăŤă¨ăŁăŚćĺłăŽăăĺč¨ăżă¤ăă使ç¨ăăăăšăŚăŽĺźă訹ĺŻăăĺż čŚăŻăăăžăăă
ăăăăçš°ăčżăăŤăŞăăžăăăç§ăŻĺč¨ăŤă¤ăăŚĺĽăŽććĄăćŻćăăăă¨ă丝埾ăăŚăăăăă§ăŻăăăžăăă ç§ăŻăăăŤĺ寞ăăŚăăă
fmt.Println(x == "hello") // compilation error?
ăăăŻăăăă彟ăăŽććĄăŤăčż˝ĺ ăăăă§ăăăă
č¨ćŁďźäťć§ăŤăŻăăšăăźăăĄăłăăĺŤăžăăŚăăăăăăăŽăłăłăă¤ăŤă¨ăŠăźăŻăă§ăŤăŤăăźăăăŚăăžă
ăăăăŽćŻčźăŤăăăŚăă珏1ăŞăăŠăłăăŻçŹŹ2ăŞăăŠăłăăŽăżă¤ăăŤĺ˛ăĺ˝ăŚĺŻč˝ă§ăăĺż čŚăăăăăăŽéăĺć§ă§ăă
@MeroviusăăŞăăŻç§ăŽććĄăŽĺ¤ç¨ŽăŤă¤ăăŚăăă¤ăăŽčŻăçšăčż°ăšăŚăăžăă ăă䝼ä¸ăŽč°čŤăŻć§ăăžăăăĺ ăŽććĄăŤăĺć§ăŤĺ˝ăŚăŻăžăăŽă§ă0ăŽčłŞĺă¨ăŽćŻčźăŤă¤ăăŚăăĺ°ă芳ăă誏ćăăăă¨ćăăžăă
fmt.Println(x == 0) // true or false? I vote true :-)
ăăăăééăŁăŚăăžăă ä¸ăăăăŚăăăăŻäźźăŚăăžă
var x int|float64 = 0.0
y := 0
fmt.Println(x == y)
ăłăłăă¤ăŤă¨ăŠăźă§ăăĺż čŚăăăăžăďźä¸č¨ă§çľčŤäťăăăăăŤďźă
ćĺăŽčĄăvar x float64 = 0.0
ĺ¤ć´ăăă¨ăĺăççąă使ç¨ăăŚăfloat64ă0ă¨ćŻčźăăăă¨ăŻčޤăă§ăăă¨ä¸ťĺźľă§ăăăăăăăŽäžăŻăăžă誏ĺžĺăăăăžăăă ďźăă¤ăăźăă¤ăłăďźďźaďź0.0ăŻintăŤĺ˛ăĺ˝ăŚĺŻč˝ă§ăăăăăćĺăŽčĄă§float64ďź0ďźăćĺłăăŚăăă¨ćăăžăăďźbďźx == yăŻăăăŽäžă§ăŻăłăłăă¤ăŤă¨ăŠăźă§ăŻăăăžăăăăă ăăfalseă¨ĺşĺăăăžăăďź
ăăăăŻă¤ăłăżăźăă§ă¤ăšĺăŤĺŽć°ăĺ˛ăĺ˝ăŚăăŽă¨äźźăŚăăăŽă§ăăăăŠăŤăăŽĺăŤăăĺż čŚăăăăă¨ăăăăŞăăŽčăăŻăă誏ĺžĺăăăă¨ćăăžăďźĺč¨ĺăćĺłăăă¨äťŽĺŽăăžăďźăăăăăŁăŚăäžăŻćŹĄăŽăăăŤăŞăăžăă
var x,y int|float64 = float64(0), 0
fmt.Println(x == y)
// false
ăăăăç§ăŻăžă x == 0
ăçĺŽă§ăăăšăă ă¨ä¸ťĺźľăăžăă ç§ăŽăĄăłăżăŤă˘ăăŤăŻăăżă¤ăăă§ăăă ăé
ă0ăŤä¸ăăăăă¨ăăăăŽă§ăă ç§ăŻăăăă¤ăłăżăźăă§ăźăšăŽçžĺ¨ăŽćŻăčăăŤĺăăŚăăăă¨ăç解ăăŚăăžăăăăăăžăăŤç§ăăăăć辡ăăççąă§ăă ăăăăĺ¤ăăŽăăĄăşăăŤă¤ăŞăăŁăŚăăŞăăă¨ăŤĺćăăžăăăă¤ăłăżăźăă§ă¤ăšănilă¨ćŻčźăăă¨ăăĺć§ăŽĺéĄăŤăăăăăŞăăŽćˇˇäšąăçăăŚăăžăă ĺč¨ăżă¤ăăĺĺ¨ăăĺ¤ăçĺźăťăăłăăŁăŻăšăäżćăăăŚăăĺ ´ĺă0ă¨ćŻčźăăăăăŤĺć§ăŽćˇˇäšąăčŚăăăă¨ćăăžăă
ćĺăŽčĄăvarx float64 = 0.0ăŤĺ¤ć´ăăă¨ăĺăççąă使ç¨ăăŚăfloat64ă0ă¨ćŻčźăăăă¨ăŻčޤăă§ăăă¨ä¸ťĺźľă§ăăăăăăăŽäžăŻăăžă誏ĺžĺăăăăžăăă
ç§ăŻăăăăšăă ă¨ăă彟ăăŽććĄăăŠăŽăăăŤĺŽčĄăăăăăŤă¤ăăŚăŽĺç´ăă¨ćç¨ć§ăŽéăŽćăĺŻč˝ć§ăŽéŤăăăŹăźăăŞăă¨ăăŚç§ăčŞčăăŚăăăă¨ăčăăă¨ăăăăăăă
float64(0)
ăint(0)
ă¨ćŻčźăăăă¨ďźă¤ăžăăĺč¨ăvar x float64 = 0.0
罎ăćăăăăäžďźăŻfalse
ă§ăŻăŞăăă¨ăŤćł¨ćăăŚăă ăăăăă ăăăăăŻăłăłăă¤ăŤćă§ăăă¨ăŠăźďźăăăšăă§ăďźă ăăăŻăžăăŤç§ăŽăă¤ăłăă§ă; ăăŞăăŽććĄăŻăĺăŞăăŽĺŽć°ă¨çľăżĺăăăĺ ´ĺăŤăŽăżćŹĺ˝ăŤĺ˝šçŤăĄăžăăăă䝼ĺ¤ăŽĺ ´ĺăŻăłăłăă¤ăŤăăăŞăăăă§ăă
ďźaďź0.0ăŻintăŤĺ˛ăĺ˝ăŚĺŻč˝ă§ăăăăăćĺăŽčĄă§float64ďź0ďźăćĺłăăŚăăă¨ćăăžăă
確ăăŤďźĺŽć°ĺźăŽçžĺ¨ăŽăăăăŠăŤăăżă¤ăăăŤčżăăťăăłăăŁăŻăšăćłĺŽăăŚăăžăăăăçžĺ¨ăŽčĄ¨çžăăăăćĺłăăŞăăă¨ăŤĺćăăžăďźă
ďźbďźx == yăŻăăăŞăăŽäžă§ăŻăłăłăă¤ăŤă¨ăŠăźă§ăăŁăŚăŻăŞăăžăăă ăă ăăfalseă¨ĺşĺăăăăŻăă§ăăďź
ăăăăăłăłăă¤ăŤćă¨ăŠăźă§ăăĺż
čŚăăăăžăă e1
ăsumĺĺźă§ăăćä˝e1 == y
ăŻăĺźăć§ćčŚç´ ĺăŽäťťćăŽé¸ćă§ăłăłăă¤ăŤăăăĺ ´ĺăŤăŽăżč¨ąĺŻăăăăšăă§ăăă¨ăăŞăăŻč¨ăăžăăă ç§ăŽäžă§ăŻă x
ăżă¤ăăŻint|float64
ă y
ăżă¤ăăŻint
ă§ă float64
ă¨int
ăŻćŻčźă§ăăžăăăăăŽćĄäťśăŻăćăăăŤéĺăăŚăăžăă
ăăŽăłăłăă¤ăŤăčĄăăŤăŻăć§ćčŚç´ ăŽĺäťăĺźă罎ăćăăăă¨ăăłăłăă¤ăŤăăĺż čŚăăăă¨ăăćĄäťśăĺé¤ăăĺż čŚăăăăžăă ăăŽćçšă§ăăăăăŽĺźă§ä˝żç¨ăăăă¨ăăŤĺăăŠăŽăăăŤăăă˘ăźăăžăăŻĺ¤ćăăăăăŤă¤ăăŚăŽăŤăźăŤăč¨ĺŽăăĺż čŚăăăăžăďźăC桡䚹ăă¨ăĺźă°ăăžăďźă
éĺťăŽăłăłăťăłăľăšăŻăĺč¨ĺăŻă¤ăłăżăźăă§ă¤ăšĺăŤăăžăčż˝ĺ ăăăŞăă¨ăăăăŽă§ăăă
ăăăăŞăăăăŻăźăŻăľăźăăšăăŚăźăăŁăŞăăŁăŞăŠăGoăŽăťă¨ăăŠăŽăŚăźăšăąăźăšăŤăŻĺ˝ăŚăŻăžăăžăăă ăăăăăˇăšăă ă大ăăăŞăă¨ăăăăă彚çŤă¤ĺŻč˝ć§ăéŤăăŞăăžăă
ç§ăŻçžĺ¨ăĺ¤ăăŽăă¸ăăŻăäťăăŚĺŽčŁ
ăăăăăźăżć´ĺć§äżč¨źăĺăăéŤĺşŚăŤĺćŁăăăăľăźăăšăä˝ćăăŚăăăăăăăäžżĺŠăŞçśćłăŤäšăčžźăżăžăăă ăăăăŽNPDăŻăăľăźăăšă大ăăăŞăăăăăĺĺ˛ăăăăăŽéŠĺăŞćšćłăčŚĺ˝ăăăŞăăăăç
ŠăăăăŞăăăăžăăă
ă¤ăžăăGoăŽĺăˇăšăă ăŽäżč¨źăŻăä¸čŹçăŞăăŞăăăŁăăăăăŻăźăŻăľăźăăšăăăč¤éăŞăăŽăŤăŻĺ°ăĺźąăăăžăă
ăăăăRustăŽčŠąăŻăHaskellăŽĺ ´ĺă¨ĺăăăăŤăNPDă¨ă¨ăŠăźĺŚçăŤĺč¨ĺă使ç¨ăăăă¨ăŻćŞăčăă§ăăăă¨ă示ăăŚăăžăăĺ ¸ĺçăŞčŞçśăŞĺ˝äť¤ăŻăźăŻăăăźăăăăHaskellishăŽă˘ăăăźăăŻăăăŤăăžăéŠĺăăžăăă
ćŹäźźăłăźăăŽiotuils.WriteFile
ăăăŞé˘ć°ăć¤č¨ăăŚăă ăăă ĺ˝äť¤ăăăźăŻćŹĄăŽăăăŤăŞăăžă
file = open(name, os.write)
if file is error
return error("cannot open " + name + " writing: " + file.error)
if file.write(data) is error:
return error("cannot write into " + name + " : " + file.error)
return ok
ăăăŚăăăRustă§ăŠăŽăăăŤčŚăăă
match open(name, os.write)
file
match file.write(data, os.write)
err
return error("cannot open " + name + " writing: " + err)
ok
return ok
err
return error("cannot write into " + name + " : " + err)
ĺŽĺ ¨ă§ăăéăă§ăă
ăăăŚç§ăŽććĄďź
type result[T, Err] oneof {
default T
Error Err
}
ăăă°ăŠă ăăŠăŽăăăŤčŚăăăďź result[void, string]
= !void
ďź
file := os.Open(name, ...)
if !file {
return result.Error("cannot open " + name + " writing: " + file.Error)
}
if res := file.Write(data); !res {
return result.Error("cannot write into " + name + " : " + res.Error)
}
return ok
ăăă§ăăăăŠăŤăăŽăăŠăłăăŻĺżĺă§ăăăă¨ăŠăźăăŠăłăăŤăŻ.Error
ă§ă˘ăŻăťăšă§ăăžăďźçľćăă¨ăŠăźă§ăăăă¨ăăăăŁăăďźă ăăĄă¤ăŤăćŁĺ¸¸ăŤéăăăăă¨ăăăăă¨ăăŚăźăśăźăŻĺ¤ć°čŞä˝ăäťăăŚăăĄă¤ăŤăŤă˘ăŻăťăšă§ăăžăă ćĺăŤă file
ăćŁĺ¸¸ăŤéăăăăă¨ă確čŞăăăăăăă§ăŞăĺ ´ĺăŻçľäşăăžăďźăăăăŁăŚă䝼éăŽăšăăźăăĄăłăă§ăŻăăăĄă¤ăŤăă¨ăŠăźă§ăŻăŞăăă¨ăăăăăžăďźă
ă茧ăŽă¨ăăăăăŽă˘ăăăźăăŻĺ˝äť¤ĺăŽăăăźăçśćăăĺăŽĺŽĺ ¨ć§ăćäžăăžăă NPDăŽĺŚçăŻăĺć§ăŽćšćłă§ĺŽčĄă§ăăžăă
type Reference[T] oneof {
default T
nil
}
// Reference[T] = *T
ĺŚçăŻçľćă¨ĺć§ă§ă
@sirkon ăăăŞăăŽRustăŽäžăŻăRustăŽăăăŞĺç´ăŞĺč¨ĺăŤä˝ăĺéĄăăăăă¨ăç§ăŤç´ĺžăăăžăăă ăăăăĺč¨ăżă¤ăăŽăăżăźăłăăăăłă°ăŻă if
ăšăăźăăĄăłăă使ç¨ăăŚăăGoăŤäźźăăăŽăŤăŞăĺŻč˝ć§ăăăăă¨ă示ĺăăŚăăžăă ä˝ăăŽăăăŞăăŽďź
ferr := os.Open(name, ...)
if err(e) := ferr { // conditional match and unpack, initializing e
return fmt.Errorf("cannot open %v: %v", name, e)
}
ok(f) := ferr // unconditional match and unpack, initializing f
werr := f.Write(data)
...
ďźĺč¨ăżă¤ăăŽç˛žçĽă§ăŻăăąăźăšă1ă¤ă ăćŽăŁăŚăăăăăăłăłăă¤ăŠăźăçĄćĄäťśăŽä¸č´ă常ăŤćĺăăăă¨ă訟ćă§ăăŞăĺ ´ĺăăłăłăă¤ăŤă¨ăŠăźăŤăŞăăžăăďź
ĺşćŹçăŞă¨ăŠăźăă§ăăŻăŽĺ ´ĺăăăăŻ1čĄéˇăăăă1ă¤ăŽăăźăŤăŤĺ¤ć°ă厣č¨ăăăăăč¤ć°ăŽćťăĺ¤ăăăćšĺăăăŚăăăăăŤăŻčŚăăžăăă ăă ăăďźifăšăăźăăĄăłăăčż˝ĺ ăăăă¨ă§ďźč¤ć°ăŽăąăźăšăŤćĄĺźľăăćšăéŠĺă§ăăăăłăłăă¤ăŠăźăŻăăšăŚăŽăąăźăšăĺŚçăăăŚăăăă¨ă確čŞă§ăăžăă
@sirkon
ăăăăŞăăăăŻăźăŻăľăźăăšăăŚăźăăŁăŞăăŁăŞăŠăGoăŽăťă¨ăăŠăŽăŚăźăšăąăźăšăŤăŻĺ˝ăŚăŻăžăăžăăă ăăăăăˇăšăă ă大ăăăŞăă¨ăăăăă彚çŤă¤ĺŻč˝ć§ăéŤăăŞăăžăă
[âŚ]
ă¤ăžăăGoăŽĺăˇăšăă ăŽäżč¨źăŻăä¸čŹçăŞăăŞăăăŁăăăăăŻăźăŻăľăźăăšăăăč¤éăŞăăŽăŤăŻĺ°ăĺźąăăăžăă
ăăŽăăăŞçşč¨ăŻăä¸ĺż čŚăŤĺŻžçŤçă§č称çă§ăă Goă§ć¸ăăăé常ăŤĺ¤§čŚć¨Ąă§éčŚăŞăľăźăăšăăăăăăăăăăŻăĄăăŁă¨ćĽăăăăTBHă§ăăăăžăă ăžăăéçşč ăŽăăŞăăŽé¨ĺăGoogleă§ĺăăŚăăăă¨ăčăăă¨ă大čŚć¨Ąă§éčŚăŞăľăźăăšăä˝ćăăăŽăŤéŠăăŚăăĺ ´ĺăŻăéçşč ăăăŞăăăăăăçĽăŁăŚăăă¨ćłĺŽăăĺż čŚăăăăžăă GoăŻăăšăŚăŽăŚăźăšăąăźăšăăŤăăźăăŚ
NPDăŽĺŚçăĺć§ăŽćšćłă§čĄăăă¨ăă§ăăžă
ăăăŻăăăŞăăŽă˘ăăăźăăĺŽéăŤăŻéčŚăŞäžĄĺ¤ăăăăăăŞăăă¨ăćŹĺ˝ăŤç¤şăăŚăăă¨ćăăžăă ăććăŽă¨ăăăéćĽĺç
§ç¨ăŤç°ăŞăć§ćăčż˝ĺ ăăă ăă§ăă ăăăăAFAICTăŻăăăă°ăŠăăźănilĺ¤ă§ăăŽć§ćă使ç¨ăăăă¨ă匨ăăăăŽăŻä˝ăăăăžăăďźăăăăăžă ăăăăŻăŤăŞăăžăďźă ă¤ăžăă *p
ă使ç¨ăăŚćĺšăŞăăšăŚăŽăăă°ăŠă ăŻă p.T
ă使ç¨ăăŚăćĺšă§ăďźăžăăŻp.default
ă§ăăďźăăŞăăŽă˘ă¤ăă˘ăĺ
ˇä˝çăŤä˝ă§ăăăăĺ¤ćăăăŽăŻéŁăăă§ăďźă
ĺč¨ăżă¤ăăă¨ăŠăźĺŚçă¨nil-dereferencesăŤčż˝ĺ ă§ăă1ă¤ăŽĺŠçšăŻăăłăłăă¤ăŠăźăăăăżăźăłăăăăłă°ăŤăăŁăŚćä˝ăĺŽĺ ¨ă§ăăăă¨ă訟ćăăĺż čŚăăăăă¨ă埡ĺśă§ăăăă¨ă§ăă ăăŽć˝čĄăççĽăăććĄăŻăăăźăăŤăŤéčŚăŞć°ăăăăŽăăăăăăŞăăăă§ăďźăăăăăă¤ăłăżăźăă§ăźăšăäťăăŚăŞăźăăłăľă ă使ç¨ăăăăăćŞăă§ăďźăăăăăĺŤăććĄăŻăžăăŤăăŞăăăéăăă¨čĄ¨çžăăăăŽă§ăă
@Merovius
ăăăŚăăăŽéçşč ăŽăăŞăăŽé¨ĺăă°ăźă°ăŤă§ĺăăŚăăăă¨ăčăăă¨ăăăŞăăŻĺ˝źăăăăŞăăăăăçĽăŁăŚăăă¨äťŽĺŽăăăšăă§ăă
俥č ăŻĺš¸ăă§ăă
ăććăŽă¨ăăăéćĽĺç §ç¨ăŤç°ăŞăć§ćăčż˝ĺ ăăă ăă§ăă
ăžă
var written int64
...
res := os.Stdout.Write(data) // Write([]byte) -> Result[int64, string] â !int64
written += res // Will not compile as res is a packed result type
if !res {
// we are living on non-default res branch thus the only choice left is the default
return Result.Error(...)
}
written += res // is OK
@skybrian
ferr := os.Open(...)
ăăŽä¸éĺ¤ć°ăŻăç§ăăăŽčăăé˘ăăăă¨ă埡ăăăăŽă§ăă ă茧ăŽă¨ăăăç§ăŽă˘ăăăźăăŻçšăŤă¨ăŠăźă¨ăźăĺŚçăŽăăăŽăăŽă§ăă ăăăăŽĺ°ăăŞăżăšăŻăŻé常ăŤéčŚă§ăăăIMOăŤçšĺĽăŞćł¨ćăćăĺż čŚăăăăžăă
@sirkonăăŞăăŻăŠăăăäşşă¨çŽă¨çŽă§čŠąăăă¨ăŤăťă¨ăăŠčĺłăăŞăăăă§ăă ăăŽăžăžăŤăăŚăăăžăă
äźčŠąă礟ĺćŁăăäżăĄăéĺťşč¨çăŞăłăĄăłăăéżăăžăăăă ç§ăăĄăŻçŠäşăŤă¤ăăŚćčŚăç°ăŤăăăă¨ăă§ăăžăăăăăă§ăçŤć´žăŞč¨čŞŹăçśćăăžăă https://golang.org/conductă
ăăăŚăăăŽéçşč ăŽăăŞăăŽé¨ĺăă°ăźă°ăŤă§ĺăăŚăăăă¨ăčăăă¨ăăăŞăăŻĺ˝źăăăăŞăăăăăçĽăŁăŚăăă¨äťŽĺŽăăăšăă§ă
ă°ăźă°ăŤă§ăăŽăăăŞč°čŤăăăăă¨ăă§ăăă¨ăŻćăăŞăă
@hasufellăăŽçˇăŻăă¤ăĺşčşŤă§ăé˘ćĽĺŽăŽă¨ă´ă¨ĺˇ¨ĺ¤§ăŞçŽĄçă
@sirkonĺăăă¨ăăăŞăăŤă
ăăăăăăăžăăă çĽç樊ĺ¨ăŻăăăžăăă ăă ćąşĺŽć¨Šăăăăžăă ăăăäšăčśăăŞăăă
äźčŠąăăŞăťăăăăăăăŤăăă¤ăăŽăłăĄăłăăé襨示ăŤăăžăďźăăăŚăăăăăŹăźăŤăŤćťăăă¨ăăŚăăă@agnivadeăŤćčŹăăžăďźă
çăăăç§ăăĄăŽGopherăŽäžĄĺ¤čŚłăŤç §ăăăŚăăăăăŽč°čŤăŤăăăăăŞăăŽĺ˝šĺ˛ăčć ŽăăŚăă ăăăăłăăĽăăăŁăŽčŞ°ăăăăăăčŚçšăćăŁăŚăăăç§ăăĄăŻăäşăăăŠăŽăăăŤč§Łéăă寞ĺżăăăăŤă¤ăăŚćŹćă¨ć ĺăŤĺŞăăăšăă§ăă
ăăŽăăŁăšăŤăăˇă§ăłăŤç§ăŽ2ăťăłăăčż˝ĺ ăââăăŚăă ăăă
ăĄă˝ăăăťăă䝼ĺ¤ăŽćŠč˝ďźă¤ăłăżăźăă§ă¤ăšăŽĺ ´ĺăŞăŠďźăŤăăŁăŚăăăžăăžăŞăżă¤ăăă°ăŤăźăĺăăćšćłăĺż čŚă§ăă ć°ăăă°ăŤăźăĺćŠč˝ă§ăŻăăĄă˝ăăăćăăŞăăăŞăăăŁăďźăžăăŻĺşćŹďźăżă¤ăă¨ăă¤ăłăżăźăă§ă¤ăšăżă¤ăăé˘éŁăăéĄäźźă¨ăăŚĺéĄă§ăăăăăŤăăĺż čŚăăăăžăă ăăŞăăăŁăĺďźăăźăŤăć°ĺ¤ăćĺĺăăăăŤăŻ[] byteă[] intăŞăŠďźăăăŽăžăžäżćă§ăăžăăăĺĺŽçžŠăŤăăŁăŚăăĄăăŞăźăŤă°ăŤăźăĺăăăŚăăĺéăŽéăăăć˝čąĄĺăăăă¨ăă§ăăžăă
_family_ĺăŽăăăŞăăŽăč¨čŞăŤčż˝ĺ ăăăă¨ăăĺ§ăăăžăă
ć§ć
ĺćăŻăäťăŽĺă¨ĺăăăăŤĺŽçžŠă§ăăžăă
type theFamilyName family {
someType
anotherType
}
ćŁĺźăŞć§ćăŻćŹĄăŽăăăŤăŞăăžăă
FamilyType = "family" "{" { TypeName ";" } "}" .
ĺćăŻăé˘ć°ăˇă°ăăăŁĺ ă§ĺŽçžŠă§ăăžăă
func Display(s family{string; fmt.Stringer}) { /* function body */ }
ă¤ăžăă1čĄăŽĺŽçžŠă§ăŻăăżă¤ăĺăŽéăŤăťăăłăăłăĺż čŚă§ăă
ăăĄăăŞăżă¤ăăŽăźăĺ¤ăŻănilă¤ăłăżăźăă§ă¤ăšăŽĺ ´ĺă¨ĺć§ăŤnilă§ăă
ďźĺ é¨ă§ăŻăăăĄăăŞăŽć˝čąĄĺăŽčĺžăŤăăĺ¤ăŻăă¤ăłăżăźăă§ă¤ăšăŽăăăŤĺŽčŁ ăăăžăăďź
ć¨čŤ
é˘ć°ăŽĺźć°ă¨ăăŚăăžăăŻé˘ć°ăŽćťăĺ¤ă¨ăăŚćĺšăŞĺăćĺŽăă犺ăŽă¤ăłăżăźăă§ă¤ăšăăăćŁç˘şăŞăăŽăĺż čŚă§ăă
ććĄăăăă˝ăŞăĽăźăˇă§ăłăŻăăłăłăă¤ăŤćăŤĺŽĺ ¨ăŤăă§ăăŻăăăĺŽčĄćăŤčż˝ĺ ăŽăŞăźăăźăăăăčż˝ĺ ăăăă¨ăŞăăăăĺŞăăĺĺŽĺ ¨ć§ăĺŻč˝ăŤăăžăă
éčŚăŞăŽăŻă_GoăłăźăăŻăăčŞĺˇąćć¸ĺăăĺż čŚăăăă¨ăăăă¨ă§ă_ă é˘ć°ăĺźć°ă¨ăăŚĺăăă¨ăă§ăăăăŽăŻăăłăźăčŞä˝ăŤçľăżčžźăžăăŚăăĺż čŚăăăăžăă
ăłăźăăĺ¤ăăăă¨ăăinterface {}ăŻä˝ăč¨ăăŞăăă¨ăăäşĺŽă誤ăŁăŚćŞç¨ăăžăă Goă§ăăŽăăăŤĺşă使ç¨ăăăŚăăďźăăăŚćŞç¨ăăăŚăăďźć§é ăăŞăăă°ăĺ¤ăăŽăă¨ăčĄăăă¨ăă§ăăŞăăŽăŻĺ°ăćĽăăăăăă¨ă§ăăă¨_nothing_ăŻč¨ăăžăă
ăăă¤ăăŽäž
sql.Rows.Scan
é˘ć°ăŽăăăĽăĄăłăăŤăŻăé˘ć°ăŤć¸ĄăăăĺŻč˝ć§ăŽăăăżă¤ăăŽčŠłç´°ă示ă大ăăŞăăăăŻăĺŤăžăăŚăăžăă
Scan converts columns read from the database into the following common Go types and special types provided by the sql package:
*string
*[]byte
*int, *int8, *int16, *int32, *int64
*uint, *uint8, *uint16, *uint32, *uint64
*bool
*float32, *float64
*interface{}
*RawBytes
any type implementing Scanner (see Scanner docs)
ăžăă sql.Row.Scan
é˘ć°ăŽĺ ´ĺăăăăĽăĄăłăăŤăŻă芳細ăŤă¤ăăŚăŻRows.ScanăŽăăăĽăĄăłăăĺç
§ăăŚăă ăăăă¨ăăćăĺŤăžăăŚăăžăă 芳細ăŤă¤ăăŚăŻă_ăăŽäťăŽé˘ć°_ăŽăăăĽăĄăłăăĺç
§ăăŚăă ăăă ăăăŻGoăŤäźźăăăŽă§ăŻăăăžăăăĺŽéă Rows.Scan
ăŻ*RawBytes
ĺ¤ăĺăăă¨ăă§ăăžăăă Row.Scan
ăŻĺăăă¨ăă§ăăŞăăăăăăŽćăŻćŁăăăăăžăăă
ĺéĄăŻăăłăłăă¤ăŠă埡ĺśă§ăăŞăäżč¨źăĺä˝ăłăłăăŠăŻăăŤă¤ăăŚăłăĄăłăăŤé źăăăăĺžăŞăăă¨ăĺ¤ăăă¨ă§ăă
é˘ć°ăŽăăăĽăĄăłăăŤăăăŽé˘ć°ăäťăŽé˘ć°ă¨ĺăăăăŤćŠč˝ăăă¨č¨čźăăăŚăăĺ ´ĺďźăäťăŽé˘ć°ăŽăăăĽăĄăłăăĺç
§ăăŚăă ăăăďźăăăŽé˘ć°ăćă
誤ç¨ăăăăă¨ăŻăťăźééăăăăžăăă ç§ăŽăăăŤăăťă¨ăăŠăŽäşşăŻă Row.Scan
ăăă¨ăŠăźăĺăĺăŁăĺžă§ăŽăżă *RawBytes
ăRow.Scan
ĺźć°ă¨ăăŚč¨ąĺŻăăăŚăăŞăăă¨ăŤć°äťăăăŤéăăăăžăăă ăsqlďźRawBytesăŻRow.Scană§ăŻč¨ąĺŻăăăŚăăžăăăă¨č¨ăŁăŚăăžăďźă ĺăˇăšăă ăăăŽăăăŞééăă訹ăăŽăŻć˛ăăăă¨ă§ăă
䝣ăăăŤă揥ăŽăăŽă使ç¨ă§ăăžăă
type Value family {
*string
*[]byte
*int; *int8; *int16; *int32; *int64
*uint; *uint8; *uint16; *uint32; *uint64
*bool
*float32; *float64
*interface{}
*RawBytes
Scanner
}
ăăŽăăăŤă渥ăăăĺ¤ăŻćĺŽăăăăăĄăăŞăŽăżă¤ăăŽ1ă¤ă§ăăĺż
čŚăăăă Rows.Scan
é˘ć°ĺ
ăŽăżă¤ăăšă¤ăăăŻäşćăăŞăăąăźăšăăăăŠăŤăăŽăąăźăšăĺŚçăăĺż
čŚăŻăăăžăăă Row.Scan
é˘ć°ăŤăŻĺĽăŽăăĄăăŞăăăăžăă
cloud.google.com/go/datastore.Property
ć§é ä˝ăŤăżă¤ăinterface{}
ăĺ¤ăăăŁăźăŤăăăăă揥ăŽăăšăŚăŽăăăĽăĄăłăăĺż
čŚăŞăă¨ăčć
ŽăăŚăă ăăă
// Value is the property value. The valid types are:
// - int64
// - bool
// - string
// - float64
// - *Key
// - time.Time
// - GeoPoint
// - []byte (up to 1 megabyte in length)
// - *Entity (representing a nested struct)
// Value can also be:
// - []interface{} where each element is one of the above types
// This set is smaller than the set of valid struct field types that the
// datastore can load and save. A Value's type must be explicitly on
// the list above; it is not sufficient for the underlying type to be
// on that list. For example, a Value of "type myInt64 int64" is
// invalid. Smaller-width integers and floats are also invalid. Again,
// this is more restrictive than the set of valid struct field types.
//
// A Value will have an opaque type when loading entities from an index,
// such as via a projection query. Load entities into a struct instead
// of a PropertyLoadSaver when using a projection query.
//
// A Value may also be the nil interface value; this is equivalent to
// Python's None but not directly representable by a Go struct. Loading
// a nil-valued property into a struct will set that field to the zero
// value.
ăăăŻćŹĄăŽăăăŤăŞăăžăă
type PropertyVal family {
int64
bool
string
float64
*Key
time.Time
GeoPoint
[]byte
*Entity
nil
[]int64; []bool; []string; []float64; []*Key; []time.Time; []GeoPoint; [][]byte; []*Entity
}
ďźăăăăŠăŽăăăŤăŻăŞăźăăźă2ă¤ăŽăăĄăăŞăźăŤĺĺ˛ă§ăăăćłĺă§ăăžăăďź
json.Token
ăżă¤ăăŻä¸č¨ăŽă¨ăăă§ăă ăżă¤ăĺŽçžŠăŻćŹĄăŽăăăŤăŞăăžăă
type Token family {
Delim
bool
float64
Number
string
nil
}
ç§ăćčżĺ°ăăă¤ĺžăĺĽăŽäžďź
sql.DB.Exec
ă sql.DB.Query
ăŞăŠăŽé˘ć°ăăžăăŻinterface{}
ĺŻĺ¤ĺĺźć°ăŞăšăăĺăĺăé˘ć°ăĺźăłĺşăĺ ´ĺăĺčŚç´ ăŻçšĺŽăŽăťăăĺ
ăŽĺăćăŁăŚăăĺż
čŚăăăăăăčŞä˝ăŻăăă§ăŻăăăžăăăăšăŠă¤ăš_ă []interface{}
ăăăăŽăăăŞé˘ć°ăŤĺźć°ă渥ăă¨ăăŻăăspreadăćźçŽĺă使ç¨ăăăă¨ăĺżăăŞăă§ăă ăăă DB.Exec("some query with placeholders", emptyInterfaceSlice)
ă¨č¨ăăŽăŻééăŁăŚăăžăă ćŁăăćšćłăŻćŹĄăŽă¨ăăă§ăă DB.Exec("the query...", emptyInterfaceSlice...)
ăăă§ă emptyInterfaceSlice
ăżă¤ăăŻ[]interface{}
ă§ăă ăăŽăăăŞééăăä¸ĺŻč˝ăŤăăă¨ăŹăŹăłăăŞćšćłăŻăăăŽé˘ć°ăŤValue
ĺŻĺ¤ĺźć°ăă¨ăăăăă¨ă§ăăăăă§ă Value
ăŻä¸č¨ăŽăăăŤăăĄăăŞă¨ăăŚĺŽçžŠăăăžăă
ăăăăŽäžăŽăă¤ăłăăŻă interface{}
ăŽä¸ćŁç˘şăăŽăăăŤă_ĺŽéăŽééăăčĄăăăŚăă_ă¨ăăăă¨ă§ăă
var x int | float64 | string | rune
z = int(x) + int(y)
z = float64(x) + float64(y)
x
ăŽăżă¤ăăŻă int()
渥ăăă¨ăă§ăăăăŽă¨ĺŽéăŤăŻäşćć§ăăŞăăăăăăăŻééăăŞăăłăłăă¤ăŠă¨ăŠăźă§ăăăŻăă§ăă
ç§ăŻfamily
ăćă¤ă¨ăăčăă弽ăă§ăă ăăăŻĺşćŹçăŤăăŞăšăăăăĺăŤĺśç´ăăăďźĺśç´ăăăďźďźă¤ăłăżăźăă§ă¤ăšă§ăăăăłăłăă¤ăŠăźăŻĺ¸¸ăŤä¸č´ăăŚăăăă¨ă確čŞăă寞ĺżăăcase
ăŽăăźăŤăŤăłăłăăăšăĺ
ă§ĺ¤ć°ăŽĺăĺ¤ć´ă§ăăžăă
ĺéĄăŻăäżč¨źăŽăăăŤăłăĄăłăăŤé źăăăăĺžăŞăăă¨ă§ăă
ăłăłăă¤ăŠă埡ĺśă§ăăŞăĺä˝ăłăłăăŠăŻăă
ăăăç§ăĺ°ăĺŤăăŤăŞăĺ§ăăççąă§ă
func foo() (..., error)
ăŠăăŞç¨ŽéĄăŽă¨ăŠăźăčżăăăăŽăăăăăŞăăăă§ăă
ĺ
ˇčąĄĺăŽäťŁăăăŤă¤ăłăżăźăă§ăźăšăčżăäťăŽăăă¤ăăŽăăŽă ăăă¤ăăŽćŠč˝
net.Addr
ăčżăă¨ăă˝ăźăšăłăźăă調ăšăŚăĺŽéăŤčżăăănet.Addr
税éĄăçšĺŽăăéŠĺăŤä˝żç¨ăăăŽăĺ°ăéŁăăĺ ´ĺăăăăžăă ĺ
ˇä˝çăŞĺăčżăăă¨ăŤăŻăăăťăŠăă¤ăăšé˘ăŻăăăžăăďźă¤ăłăżăźăă§ă¤ăšăĺŽčŁ
ăăŚăăăăăă¤ăłăżăźăă§ă¤ăšă使ç¨ă§ăăĺ ´ćăŞăăŠăă§ă使ç¨ă§ăăăăďźă
ĺžă§ăăĄă˝ăăăćĄĺźľăăŚĺĽăŽç¨ŽéĄăŽnet.Addr
ăčżăăăăŤč¨çťăăžăă ăăăăăăŞăăŽĺ ´ĺ
APIăŻă OpError
čżăă¨čż°ăšăŚăăžăăăăăŞăăăăŽé¨ĺăăăłăłăă¤ăŤćăăŽäťć§ăŤĺ
ĽăăŚăżăžăăăďź
äžăă°ďź
OpError is the error type usually returned by functions in the net package. It describes the operation, network type, and address of an error.
ăă¤ăăŽďź ăŠăŽé˘ć°ăăăŽă¨ăŠăźăčżăăăćŁç˘şăŤćăăŚăăăžăăă ăăăŚăăăăŻăżă¤ăăŽăăăĽăĄăłăă§ăăăé˘ć°ă§ăŻăăăžăăă Read
ăŽăăăĽăĄăłăăŤăŻăOpErrorăčżăăăă¨ăŻăŠăăŤăč¨čźăăăŚăăžăăă ăžăăăăŞăăăăăăăŞă
err := blabla.(*OpError)
ĺĽăŽç¨ŽéĄăŽă¨ăŠăźăčżăăăă¨ăŻăŠăăˇăĽăăžăă ă ăăăăăăăăé˘ć°ĺŽŁč¨ăŽä¸é¨ă¨ăăŚčŚăăăŽă§ăă ĺ°ăŞăă¨ă*OpError | error
ăŻă
ăăŽăăăŞă¨ăŠăźăçşçăăă¨ăăłăłăă¤ăŠăŻăăă§ăăŻăăăŚăăŞăĺă˘ăľăźăˇă§ăłăĺŽčĄăăŞăăăăŤăăŚăĺ°ćĽăăă°ăŠă ăăŻăŠăăˇăĽăăăŞăăăăŤăăžăă
ă¨ăăă§ďźăăšăąăŤăŽĺĺ¤ĺăŽăăăŞăˇăšăă ăŻăžă čć ŽăăăŚăăžăăăďź ăžăăŻăăçšć§ăăăźăšăŽĺăˇăšăă ăăăŞăăĄďź
func calc(a < add(a, a) a >, b a) a {
return add(a, b)
}
func drawWidgets(widgets []< widgets.draw() error >) error {
for _, widgets := range widgets {
err := widgets.draw()
if err != nil {
return err
}
}
return nil
}
a < add(a, a) a
ăŻăăaăŽăżă¤ăăä˝ă§ăăăé˘ć°addďźtypeof aătypeof aďźtypeof aďźăĺĺ¨ăăĺż
čŚăăăăă¨ăćĺłăăžăă < widgets.draw() error>
ăŻăăăŚăŁă¸ă§ăăăŽăżă¤ăăä˝ă§ăăăă¨ăŠăźăčżăăĄă˝ăăćçťăćäžăăĺż
čŚăăăăăă¨ăćĺłăăžăă ăăăŤăăăăăä¸čŹçăŞé˘ć°ăä˝ćă§ăăăăăŤăŞăăžăă
func Sum(a []< add(a,a) a >) a {
sum := a[0]
for i := 1; i < len(a); i++ {
sum = add(sum,a[i])
}
return sum
}
ďźăăăŻĺžćĽăŽăă¸ă§ăăŞăăŻăă¨ĺăă§ăŻăŞăăă¨ăŤćł¨ćăăŚăă ăăďźă
ĺžă§ĺĽăŽç¨ŽéĄăŽ
net.Addr
ăčżăăăăŤăĄă˝ăăăćĄĺźľăăäşĺŽăăăĺ ´ĺăé¤ăăŚăĺ ˇčąĄĺăčżăăă¨ăŤăŻăăăťăŠăă¤ăăšé˘ăŻăăăžăăďźă¤ăłăżăźăă§ă¤ăšăĺŽčŁ ăăŚăăăăăă¤ăłăżăźăă§ă¤ăšă使ç¨ă§ăăĺ ´ćăŞăăŠăă§ă使ç¨ă§ăăžăďźă ă
ăžăăGoăŤăŻăăŞă˘ăłăăŽăľăăżă¤ăăăŞăăăăĺż
čŚăŤĺżăăŚfunc() *FooError
ăfunc() error
ă¨ăăŚä˝żç¨ăăăă¨ăŻă§ăăžăăă ăăăŻăă¤ăłăżăźăă§ă¤ăšăŽćşčśłĺşŚăŤă¨ăŁăŚçšăŤéčŚă§ăă ăăăŚćĺžăŤăăăăŻăłăłăă¤ăŤăăăžăăďź
func Foo() (FooVal, FooError) {
// ...
}
func Bar(f FooVal) (BarVal, BarError) {
// ...
}
func main() {
foo, err := Foo()
if err != nil {
log.Fatal(err)
}
bar, err := Bar(foo) // Type error: Can not assign BarError to err (type FooError)
if err != nil {
log.Fatal(err)
}
}
ă¤ăžăăăăăćŠč˝ăăăăŤăŻďźăŠăăăăăăĺŻč˝ă§ăăă°ďźăăŻăăăŤéŤĺşŚăŞĺć¨čŤăĺż čŚ
ăžăăGoăŤăŻăăŞă˘ăłăăŽăľăăżă¤ăăăŞăăăăĺż čŚăŤĺżăăŚfuncďźďź* FooErrorăfuncďźďźă¨ăŠăźă¨ăăŚä˝żç¨ăăăă¨ăŻă§ăăžăăă ăăăŻăă¤ăłăżăźăă§ă¤ăšăŽćşčśłĺşŚăŤă¨ăŁăŚçšăŤéčŚă§ăă ăăăŚćĺžăŤăăăăŻăłăłăă¤ăŤăăăžăăďź
ăăăŻGoă§ćŁĺ¸¸ăŤćŠč˝ăăă¨ćăŁăŚăăžăăăăçžĺ¨ăŽćšćłă§ăŻerror
使ç¨ăăă ăăŞăŽă§ăăăăŤééăăăă¨ăŻăăăžăăă ăăăăăŻăăăăŽĺ ´ĺăăăăăŽĺśéăŤăăăĺŽéăŤăŻăćťăĺă¨ăăŚerror
ă使ç¨ăăĺż
čŚăăăăžăă
func main() {
foo, err := Foo()
if err != nil {
log.Fatal(err)
}
bar, err := Bar(foo) // Type error: Can not assign BarError to err (type FooError)
if err != nil {
log.Fatal(err)
}
}
ç§ăŻăăăĺŻč˝ăŤăăč¨čŞăçĽăăžăăăďźă¨ă˝ăŠăłăé¤ăăŚďźăăăŞăăăăŞăăă°ăŞăăŞăăŽăŻăăżă¤ăăŻăźăŤăăďźĺşćŹçăŤăŻvariable -> type
ăăăă§ăďźăçśćăăăă¨ă ăă§ăă -ăăżă¤ăăŻăźăŤăăă§ăżă¤ăăć´ć°ăăă ăăŽĺ¤ć°ăĺ˛ăĺ˝ăŚăžăă
ăăăčĄăăăăŤč¤éăŞĺć¨čŤăŻĺż čŚăŞăă¨ćăăžăăăĺ¤ć°ăŽĺă追补ăăĺż čŚăăăăžăăăă¨ăŤăăăăăăĺż čŚăăăă¨ćăăžăă
var int i = 0;
i = "hi";
確ăăŤăăŠăŽĺ¤ć°/厣č¨ăŤăŠăŽăżă¤ăăăăăăčŚăăŚăăĺż
čŚăăăăžăă i = "hi"
ĺ ´ĺăŻă i
ăăżă¤ăăŤăăŻă˘ăăăăčĄăŁăŚăćĺĺăĺ˛ăĺ˝ăŚăăă¨ăă§ăăăăŠăăă確čŞăăĺż
čŚăăăăžăă
ăżă¤ăăă§ăăŤăźăăľăăźăăăŚăăŞă䝼ĺ¤ăŤă func () *ConcreteError
ăfunc() error
ĺ˛ăĺ˝ăŚăăă¨ăč¤éăŤăăĺŽéçăŞĺéĄăŻăăăžăăďźĺŽčĄćăŽççą/ăłăłăă¤ăŤăăăăłăźăăŽççąăŞăŠďźďź çžĺ¨ă揥ăŽăăăŞé˘ć°ă§ăŠăăăăĺż
čŚăăăă¨ćăăžăă
type MyFunc func() error
type A struct {
}
func (_ *A) Error() string { return "" }
func NewA() *A {
return &A{}
}
func main() {
var err error = &A{}
fmt.Println(err.Error())
var mf MyFunc = MyFunc(func() error { return NewA() }) // type checks fine
//var mf MyFunc = MyFunc(NewA) // doesn't type check
_ = mf
}
func (a, b) c
ç´é˘ăăŚăăăă func (x, y) z
ĺĺžăăĺ ´ĺăĺŽčĄăăĺż
čŚăăăăŽăŻă z
ăc
ďźăăăła
ă b
ăŻx
ă y
ăŤĺ˛ăĺ˝ăŚĺŻč˝ă§ăăĺż
čŚăăăăžăăăăăŻăĺ°ăŞăă¨ăĺăŹăăŤă§ăŻč¤éăŞĺć¨čŤăĺż
čŚă¨ăăžăăďźăżă¤ăăŻăĺĽăŽăżă¤ăăŤĺ˛ăĺ˝ăŚĺŻč˝/äşćć§ăăăăžăďźă ăăĄăăăăăăăŠăłăżă¤ă /ăłăłăă¤ăŤă§ĺéĄăĺźă辡ăăăăŠăă...ăăăăžăăăăĺ°ăŞăă¨ăĺăŹăăŤăĺłĺŻăŤčŚăă¨ăăŞăăăăč¤éăŞĺć¨čŤăäź´ăăŽăăăăăžăăă ăżă¤ăăă§ăăŤăźăŻă x
ăa
ăŤĺ˛ăĺ˝ăŚăăă¨ăă§ăăăăŠăăăăă§ăŤçĽăŁăŚăăăăă x
func () x
ăfunc () a
ĺ˛ăĺ˝ăŚăăă¨ăă§ăăăăŠăăăç°ĄĺăŤăăăăžăă ăăĄăăăăăăç°ĄĺăŤä¸ĺŻč˝ăŤăŞăĺŽéçăŞççąďźăŠăłăżă¤ă 襨çžăŤă¤ăăŚčăăďźăăăăăăăăžăăă ďźăăăĺŽéăŽăżă¤ăăă§ăăŻă§ăŻăŞăăăăă§ăŽćŹĺ˝ăŽć ¸ĺżă ă¨ćăăžăďźă
çčŤçăŤăŻăďźä¸č¨ăŽăšăăăăăŽăăăŤďźé˘ć°ăčŞĺçăŤăŠăăăăăă¨ă§ăŠăłăżă¤ă ăŽĺéĄăĺéżă§ăăžăďźăŠăăăăăfuncăŻfuncă¨çăăăŞăăăďź_ć˝ĺ¨çăŤĺˇ¨ĺ¤§ăŞ_ćŹ çšăăăăžăăăŠăăăăžăďźă
ç§ăŻăăăĺŻč˝ăŤăăč¨čŞăçĽăăžăăďźăžăăesolangsăé¤ăăŚďź
ćŁç˘şă§ăŻăăăžăăăă埡ĺăŞĺăˇăšăă ăĺăăč¨čŞăŻé常ăĺŽéăŤăŻĺ¤ć°ăăăă§ăďźăăăăŁăŚăčĺĽĺăĺĺŠç¨ăăćŠč˝ăŻĺŽéăŤăŻĺż
čŚăăăžăăďźă FWIWăăă¨ăă°HaskellăŽĺăˇăšăă ăŻăăăăăžăĺŚçă§ăăă¨ç§ăŻä¸ťĺźľăăžă-ĺ°ăŞăă¨ăFooError
ăžăăŻBarError
äťăŽăăăăăŁă使ç¨ăăŚăăŞăéăăăăăăšăă§ăerr
ăerror
ĺă§ăăă¨ć¨ć¸ŹăăăăăĺŚçăăăă¨ăă§ăăžăă ăăĄăăăçš°ăčżăăžăăăăăăŻćśçŠşăŽăăŽă§ăăăŞăăŞăăăăŽćŁç˘şăŞçśćłăŻé˘ć°ĺč¨čŞăŤç°ĄĺăŤç§ťčĄă§ăăŞăăăă§ăă
ă¨ăŤăăăăăăĺż čŚăăăă¨ćăăžă
éăăŻăăăŞăăŽäžă§ăŻă i
ăŽćĺăŽčĄăŽĺžăŤć確ă§ăăç解ăăăŚăăăżă¤ăďź int
ăăă string
ăĺ˛ăĺ˝ăŚăă¨ăżă¤ăă¨ăŠăźăçşçăăăă¨ă§ăăăăăŤ
ăżă¤ăăă§ăăŤăźăăľăăźăăăŚăăŞă䝼ĺ¤ăŤă
func () *ConcreteError
ăfunc() error
ĺ˛ăĺ˝ăŚăăă¨ăč¤éăŤăăĺŽéçăŞĺéĄăŻăăăžăăďźĺŽčĄćăŽççą/ăłăłăă¤ăŤăăăăłăźăăŽççąăŞăŠďźďź
ĺŽç¨çăŞĺéĄăŻăăăžăăă func
ĺ ´ĺăăăăă解湺ă§ăăă¨ćăăžăďźă¤ăłăżăźăă§ă¤ăšăŽĺă渥ăăŽäťçľăżă¨ĺć§ăŤăă˘ăł/ăŠăăăłă°ăłăźăăçşčĄăăăă¨ă§ďźă GoăŽĺˇŽç°ăŤă¤ăăŚĺ°ăć¸ăăä¸é¨ăŤčĄ¨ç¤şăăăĺŽéçăŞĺéĄăŽăăă¤ăă誏ćăăžăă ăă ăăčż˝ĺ ăă䞥ĺ¤ăăăă¨ăŻĺŽĺ
¨ăŤăŻç˘şäżĄăăŚăăžăăă ă¤ăžăăăăčŞä˝ă§éčŚăŞĺéĄă解湺ă§ăăăăŠăăăŻăăăăžăăă
ăăĄăłăŻă¨ăăĄăłăŻăŽćŻčźăĺ°çĄăăŤăăĺŻč˝ć§ăŽăă大ăăŞćŹ çšăăăăžăďźăŠăăăăăăăĄăłăŻăŻăŠăăăăăăăĄăłăŻă¨çăăăŞăăăďźă
funcsăŻćŻčźă§ăăžăăă
ă¨ăŤăăăTBHăăăăŻăăšăŚăăŽĺéĄăŽăăăăŻăăĺ°ăĺ¤ăăŚăăăăă§ă:)
ĺčďźç§ăŻăăăăăŁăă ăă§ăă ăăăŻčŻăăăăžăăăăăăăŻç˘şăăŤăżă¤ăăťăźăă§ăă ďźďź19814 FWIWă§ăĺăăă¨ăă§ăăžăďź
ç§ăŻăăźăăŁăźăŤĺ°ăé ăăŚăăžăăăç§ă4ĺš´éăŽGoăŽĺžă§ç§ăŽć°ćăĄăăăŞăă¨ĺ ąćăăăă¨ćăăžăďź
éĺť4ĺš´éă§ăç§ăŻăăăŤé˘éŁăăĺ¤ăăŽĺéĄăçşčŚăăžăăă
nil
ćăăă¤ăłăżăźăćănil䝼ĺ¤ăŽă¤ăłăżăźăă§ăźăšďźăGoăŻç°ĄĺăŞč¨čŞă§ăăă¨ăăăšăăźăăĄăłăăćŞăĺčŤăŽăăăŤčăăăăăäşşă
ăŽĺ°çă桡䚹ăăăžăďźănil
ďźăŻăďźďźăă ăăăăăăăšăŚăŽĺéĄă俎ćŁăăăăăŤĺż čŚăŞĺ¤ć´ăŤăŻăçăŤĺžćšäşćć§ăŽăŞăGo 2.0.0ďźGo2ă§ăŻăŞăďźăăźă¸ă§ăłăĺż čŚă§ăăăăăăŻĺŽçžăăăŞăă¨ćăăžăă ă¨ăăă...
ă¨ăŠăźĺŚçăŻćŹĄăŽăăăŤăŞăăžăă
// Divide returns either a float64 or an arbitrary error
func Divide(dividend, divisor float64) float64 | error {
if dividend == 0 {
return errors.New("dividend is zero")
}
if divisor == 0 {
return errors.New("divisor is zero")
}
return dividend / divisor
}
func main() {
// type-switch statements enforce completeness:
switch v := Divide(1, 0).(type) {
case float64:
log.Print("1/0 = ", v)
case error:
log.Print("1/0 = error: ", v)
}
// type-assertions, however, do not:
divisionResult := Divide(3, 1)
if v, ok := divisionResult.(float64); ok {
log.Print("3/1 = ", v)
}
if v, ok := divisionResult.(error); ok {
log.Print("3/1 = error: ", v.Error())
}
// yet they don't allow asserting types not included in the union:
if v, ok := divisionResult.(string); ok { // compile-time error!
log.Print("3/1 = string: ", v)
}
}
ă¤ăłăżăźăă§ăźăšăŻăčĺĽăăăĺ ąç¨ä˝ăŽäťŁăăă§ăŻăŞăă 2ă¤ăŽĺŽĺ ¨ăŤç°ăŞăĺçŠă§ăă ăłăłăă¤ăŠăźăŻăčĺĽăăăĺ ąç¨ä˝ăŽĺăšă¤ăăăĺŽĺ ¨ă§ăăăă¨ă確čŞăăžăăă¤ăžăăăąăźăšăŻăăšăŚăŽĺŻč˝ăŞĺăăŤăăźăăžăăăăăä¸čŚăŞĺ ´ĺăŻăĺă˘ăľăźăˇă§ăłăšăăźăăĄăłăă使ç¨ă§ăăžăă
_nilĺ¤ă¸ăŽnil䝼ĺ¤ăŽă¤ăłăżăźăă§ăźăš_ăŤă¤ăăŚäşşă
ăĺŽĺ
¨ăŤćˇˇäšąăăŚăăăŽăăăčŚăăăžăďź https ďź error
ă¤ăłăżăźăă§ă¤ăšănil
ćăăŤăšăżă ă¨ăŠăźăżă¤ăăŽăă¤ăłăżăćăăŚăăă¨ăäşşă
ăŻćˇˇäšąăăžăăăăăăă¤ăłăżăźăă§ă¤ăšăçĄĺšăŤăăăă¨ăééăă ăŁăă¨ćăççąăŽ1ă¤ă§ăă
ă¤ăłăżăźăă§ăźăšăŻĺäťäżăŽăăăŞăăŽă§ă芹ăăŚăăă¨ăăŻäşşéă ă¨çĽăŁăŚăăžăăăGoă§ăŻćŽľăăźăŤăŽăăŁăŽăĽă˘ă§ăăĺŻč˝ć§ăăăă芹ăăăăăă¨ăăă¨çŞçśä¸çăĺ´ŠĺŁăăžăă
čĺĽăŚăăŞăłăŻăŞăăˇă§ăłďźĺ¤ĺăżă¤ăďźăŤä˝żç¨ăăăăšăă§ăăăă¤ăłăżăźăă§ăźăšăŤnil
ăă¤ăłăżăźă渥ăă¨ăăăăŻăçşçăăăŻă
type CustomErr struct {}
func (err *CustomErr) Error() string { return "custom error" }
func CouldFail(foo int) error | nil {
var err *customErr
if foo > 10 {
// you can't return a nil pointer as an interface value
return err // this will panic!
}
// no error
return nil
}
func main() {
// assume no error
if err, ok := CouldFail().(error); ok {
log.Fatalf("it failed, Jim! %s", err)
}
}
ăă¤ăłăżă¨ĺ¤ĺăżă¤ăăŻäşćć§ăăăăžăăă ăŞăăˇă§ăłĺăŤăă¤ăłăżăźă使ç¨ăăă¨ăAPIă桡䚹ăăăăăä¸éŠĺă§ăă
// P returns a pointer to T, but it's not clear whether or not the pointer
// will always reference a T instance. It might be an optional T,
// but the documentation usually doesn't tell you.
func P() *T {}
// O returns either a pointer to T or nothing, this implies (but still doesn't guarantee)
// that the pointer is always expected to not be nil, in any other case nil is returned.
func O() *T | nil {}
揥ăŤăJSONăăăăžăă ăă ăăăłăłăă¤ăŠăŻä˝żç¨ĺăŤăŚăăŞăłăăă§ăăŻăăăăăŤĺźˇĺśăăăăăăăăŻăŚăăŞăłă§ăŻçşçăăžăăă ĺż é ăăŁăźăŤăďźăă¤ăłăżăźĺăŽăăŁăźăŤăăĺŤăďźăJSONăăăĽăĄăłăăŤĺŤăžăăŚăăŞăĺ ´ĺăJSONă˘ăłăăźăˇăŁăŠăźăŻĺ¤ąćăăăŻăă§ăă
type DataModel struct {
// Optional needs to be type-checked before use
// and is therefore allowed to no be included in the JSON document
Optional string | nil `json:"optional,omitempty"`
// Required won't ever be nil
// If the JSON document doesn't include it then unmarshalling will return an error
Required *T `json:"required"`
}
PS
çžĺ¨ăé˘ć°ĺč¨čŞăŽč¨č¨ăŤăĺăçľăă§ăăžăăăăăăăăă§ăŽă¨ăŠăźĺŚçăŤčĺĽăăăĺ
ąç¨ä˝ă使ç¨ăăćšćłă§ăă
read = (s String) -> (Array<Byte> or Error) => match s {
"A" then Error<NotFound>
"B" then Error<AccessDenied>
"C" then Error<MemoryLimitExceeded>
else Array<Byte>("this is fine")
}
main = () -> ?Error => {
// assume the result is a byte array
// otherwise throw the error up the stack wrapped in a "type-assertion-failure" error
r = read("D") as Array<Byte>
log::print("data: %s", r)
}
ăă¤ăăăăĺŽçžăăăŽă漽ăăżăŤăăŚăăžăă ă ăăç§ăĺ°ăĺŠăăăă¨ăă§ăăăăŠăăčŚăŚăżăžăăăďź
ăăśăĺéĄăŻăç§ăăĄăććĄă§ăŤăăźăăăăŚăăăă¨ă§ăă 䞥ĺ¤ăŽĺ¤§é¨ĺăăăăăĺç´ĺăăăăăźă¸ă§ăłă使ç¨ăăŚăçćçăŤč¨čŞăŤčż˝ĺ ăăăŽăăŻăăăŤç°ĄĺăŤăŞăăăăŤăăăă¨ăă§ăăžăă
ç§ăŽčŚč§Łă§ăŻăăăŽç°ĄçĽĺăăăăăźă¸ă§ăłăŻnil
é˘éŁăăŚăăă ăă§ăă 丝ăŞă˘ă¤ăă˘ăŻćŹĄăŽă¨ăăă§ăďźăťă¨ăăŠăăšăŚăăłăĄăłăă§ăă§ăŤč¨ĺăăăŚăăžăďźďź
<any pointer type> | nil
nil
ăăă˘ăă¤ăłăżĺăŤĺ˛ăĺ˝ăŚăăă¨ăçŚć˘ăăžăă nilăĺ˛ăĺ˝ăŚăĺ ´ĺăăżă¤ăăŻ<pointer type> | nil
ĺż
čŚăăăăžăă äžăă°ďźvar n *int = nil // Does not compile, wrong type
var n *int | nil = nil // Ok!
var set map[string] bool = nil // Does not compile
var set map[string] bool | nil = nil // Ok!
var myFunc func(int) err = nil // Nope!
var myFunc func(int) err | nil = nil // All right.
ăăăă丝ăŞă˘ă¤ăă˘ă§ăă 䝼ä¸ăŻă丝čŚăŞăăŽăăć´žçăăă˘ă¤ăă˘ă§ăă
| nil
čĺĽăżă¤ăăčż˝ĺ ăăĺż
čŚăăăăžăvar maybeAString *string // Wrong: invalid initial value
var maybeAString *string | nil // Good
var value int = 42
var barePointer *int = &value // Valid
var nilablePointer *int | nil = &value // Valid
nilablePointer = barePointer // Valid
barePointer = nilablePointer // Invalid: Incompatible types
nilablePointer
ăŤbarePointer
ăç§ăăĄăŻä˝ăăăĺż
čŚăăăăžăďźswitch val := nilablePointer.(type) {
case *int:
barePointer = val // Yeah! Types are compatible now. It is imposible that "val = nil"
case nil:
// Do what you need to do when nilablePointer is nil
}
䝼ä¸ă§ăă čĺĽăăăĺ
ąç¨ä˝ăŻăăŁă¨ĺ¤ăăŽç¨éăŤä˝żç¨ă§ăăăă¨ăçĽăŁăŚăăžăăďźçšăŤă¨ăŠăźăčżăĺ ´ĺďźăä¸č¨ăŽĺ
厚ăŤĺşĺˇăăăă¨ă§ăĺ°ăŞăĺ´ĺă§č¨čŞăŤĺ¤§ăăŞäžĄĺ¤ăăăăăăă¨ăă§ăăžăăĺż
čŚäťĽä¸ăŤč¤éăŤăăžăă
ăăŽĺç´ăŞććĄă§ç§ăčŚăĺŠçšďź
nil pointer dereference
ă¨ăŠăźăĺăłçşçăăăă¨ăŻăăăžăăă đĽmap | nil
ăŤăŞăăžăăăăŽĺ ´ĺăăżă¤ăăšă¤ăăă使ç¨ăăĺż
čŚăăăăžăđăăăăăăăŤăŻĺ¤ăăŽäžĄĺ¤ăăăăăăă1ă¤ăŽçĄĺ˝˘ăŽăăŽăăăăžăăăăăŻăéçşč ăŽĺŽĺżă§ăă ăă¤ăłăżăźăé˘ć°ăăăŁăłăăŤăăăăăŞăŠăăăźăă§ăăăă¨ăĺżé ăăĺż čŚăăŞăăŞăŠăăŻăšăăćčŚă§ä˝ćĽăăăéăă ăăăăă¨ăă§ăăžăă _ç§ăŻăăăŤăéăćăă§ăăăďź_đ
ăăŽĺç´ăŞăăźă¸ă§ăłăŽććĄăăĺ§ăăăă¨ăŽĺŠçšăŻăĺ°ćĽçăŤĺŽĺ ¨ăŞććĄăŤé˛ăăă¨ăăžăăŻćŽľéçăŤé˛ăăă¨ăăă匨ăăŞăăă¨ă§ăďźç§ăŤă¨ăŁăŚăŻăčĺĽăăăă¨ăŠăźăŞăżăźăłăĺŻč˝ăŤăă揥ăŽčŞçśăŞăšăăăă§ăďź ăăăăäťăŻăăăĺżăăžăăăďźă
1ă¤ăŽĺéĄăŻăăăŽĺç´ăŞăăźă¸ă§ăłăŽććĄă§ăăĺžćšäşćć§ăăŞăăă¨ă§ăăă gofix
ă§ç°ĄĺăŤäżŽćŁă§ăăžăăăăšăŚăŽăă¤ăłăżăźĺ厣č¨ă<pointer type> | nil
罎ăćăăă ăă§ăă
ăŠăćăăžăăďź ăăăĺ ăĺ˝ăŚăč¨čŞă¸ăŽnil-safetyăŽçľăżčžźăżăăšăăźăă˘ăăă§ăăăă¨ăéĄăŁăŚăăžăă ăăŽćšćłďźăčĺĽăăăĺ ąç¨ä˝ăăäťăăŚďźăŻăăăăéćăăăăăŽăăĺç´ă§ăăç´äş¤ăăćšćłă§ăăăăăŤćăăăžăă
@alvaroloes
ăă˘ăă¤ăłăżĺăŽĺ¤ć°ă厣č¨ăăŚăĺćĺăăŞăăžăžăŤăăăă¨ăŻă§ăăžăăă
ăăăĺéĄăŽć ¸ĺżă§ăă ăăăŻGoăčĄăăă¨ă§ăŻăăăžăă-ăăšăŚăŽăżă¤ăăŤăŻăźăĺ¤ăăăŞăŞăăăăăžăă ăăă§ăŞăăă°ăăăŞăăŻä˝ăŤçăăŞăăă°ăŞăăŞăă§ăăăăäžăă°make([]T, 100)
ăŻä˝ăăăžăăďź ăăŞăăč¨ĺăăäťăŽăă¨ďźäžăă°ăć¸ăčžźăżă§ăăăăŻăŤăŞănilăăăďźăŻăăăŽĺşćŹçăŞăŤăźăŤăŽçľćă§ăă ďźä˝čŤă§ăăănil-slicesăăăăăăăĺŽĺ
¨ă§ăăă¨č¨ăăŽăŻćŹĺ˝ă§ăŻăŞăă¨ćăăžă-nil-sliceă¸ăŽć¸ăčžźăżăŻnil-mapă¸ăŽć¸ăčžźăżă¨ĺăăăăăăăăŻăŤăŞăăžăďźă
č¨ăćăăă°ăăăŞăăŽććĄăŻăGoč¨čŞăŽăăŞăĺşćŹçăŞč¨č¨ä¸ăŽćąşĺŽăăăăŞă大ăăé¸čąăăŚăăăăăĺŽéăŤăŻăăăťăŠĺç´ă§ăŻăăăžăăă
GoăčĄăăăéčŚăŞăă¨ăŻăĺăŤăăšăŚăŤăźăĺ¤ăä¸ăăăŽă§ăŻăŞăăăźăĺ¤ăćç¨ăŤăăăă¨ă ă¨ćăăžăă ăźăăăăăŻăźăĺ¤ă§ăăă彚ăŤçŤăĄăžăăă ĺŽéăăăăŻć厳ă§ăă ăăăăŁăŚă彚ăŤçŤăăŞăĺ ´ĺăŤăźăĺ¤ă訹ĺŻăăŞăăŽăŻăŞăă§ăăă ăăŽçšă§Goăĺ¤ć´ăăăă¨ăŻćçă§ăăăććĄăŻç˘şăăŤăăăťăŠĺç´ă§ăŻăăăžăăă
ä¸č¨ăŽććĄăŻăSwiftăŞăŠăŽăŞăăˇă§ăł/éăŞăăˇă§ăłăŽăăăŞăăŽăŽăăăŤčŚăăžăă ăăŁăăăă§ăăă揥ăŽçšăé¤ăăžăă
<pointer type> | nil
罎ăćăăăă¨ăŻă§ăăžăăăăăăăŁăŚă彚ăŤçŤăăŞăĺ ´ĺăŤăźăĺ¤ă訹ĺŻăăŞăăŽăŻăŞăă§ăăă
ä¸č¨ăĺç §ă ăăăŻăĺŽăčŚăăăăŽăŽä¸ăŤăŻăăăăŤé˘éŁăăé常ăŤéčŚăŞăłăšăăăăăă¨ăćĺłăăžăă
ăăŽçšă§Goăĺ¤ć´ăăăă¨ăŻćçă§ă
ăăăŤăŻĺŠçšăăăăžăăăăăăŻćçă§ăăăă¨ă¨ĺăă§ăŻăăăžăăă ăžăă厳ăăăăžăă ăŠăĄăăéăăăŻă弽ăżă¨ăăŹăźăăŞă揥珏ă§ăă GoăŽăăśă¤ăăźăŻăăăé¸ăłăžăăă
FTRăăăăŻăăŽăšăŹăăăŽä¸čŹçăŞăăżăźăłă§ăăăĺč¨ăżă¤ăăŽćŚĺżľăŤĺŻžăă丝ăŞĺčŤăŽ1ă¤ă§ăăă¤ăžăăăźăĺ¤ăä˝ă§ăăăăč¨ăĺż čŚăăăăžăă ăăŽăăăć°ăăă˘ă¤ăă˘ăŻć示çăŤĺŻžĺŚăăĺż čŚăăăăžăă ăăăăăăă¤ăŠă¤ăŠăăăă¨ăŤăćčżăăăŤć稿ăăŚăăăťă¨ăăŠăŽäşşăŻăăšăŹăăăŽćŽăăŽé¨ĺăčŞăă§ăăăăăăŽé¨ĺăçĄčŚăăĺžĺăăăăžăă
đ¤ăăďź ç§ăŻčŞĺăčŚéăăŚăăćăăăŞä˝ăăăăăă¨ăçĽăŁăŚăăžăăă ăăźďź ăăˇăłăăŤăă¨ăăč¨čăŤăŻč¤éăŞćĺłăăăăžăă ăăŚăç§ăŽĺăŽăłăĄăłăăăăĺç´ăŞăĺčŞăčŞçąăŤĺé¤ăăŚăă ăăă
ă¤ăŠă¤ăŠăăăăăăăăăăŞăăă ç§ăŽćĺłăŻĺ°ăĺŠăăăă¨ăăăă¨ă§ăăă ç§ăŻăšăŹăăăŤă¤ăăŚăăăăăŤĺŞăăŚăăžăăăăăăŤč˛ťăăä˝ćăŻăăžăăăăžăăă
ĺéĄăŤćťăă¨ăăăă匨ăăŚăă丝ăŞççąăŻăźăĺ¤ă§ăăăăăŤćăăăžăă
ăă°ăăčăăŚĺ¤ăăŽăŞăăˇă§ăłăç ´ćŁăăĺžăäťĺ 䞥ĺ¤ăăăăč¨ĺăă䞥ĺ¤ăăăă¨ç§ăćăĺŻä¸ăŽăă¨ăŻćŹĄăŽă¨ăăă§ăă
ćŁăăćăĺşăă°ăăŠăŽăżă¤ăăŽăźăĺ¤ăăăăŽăĄă˘ăŞçŠşéă0ă§ĺăăăă¨ă§ć§ćăăăžăă
ăă§ăŤăĺçĽăŽăăăŤăăăăŻéăă¤ăłăżăźĺăŤăŻĺéĄăăăžăăăăăă¤ăłăżăźĺăŽăă°ăŽĺĺ ă§ăă
type S struct {
n int
}
var s S
s.n // Fine
var s *S
s.n // runtime error
var f func(int)
f() // runtime error
ă ăăăăăç§ăăĄăďź
ăăăŻĺĽăŽĺéĄă§ç¤şĺăăăŚăăă¨ćăăžăăă確ăă§ăŻăăăžăăă ăăŽććĄăŽä¸ťăŞćĺśçšăŤĺŻžĺŚăăŚăăăŽă§ăăăăŤć¸ăăžăă
䝼ä¸ăŻăăă¤ăłăżĺăŽăźăĺ¤ăŽăŞăšăă§ăăĺŻč˝ć§ăăăăžăă ăăăăŽăźăĺ¤ăŻăĺ¤ăŤă˘ăŻăťăšăăĺ ´ĺăŤăŽăżä˝żç¨ăăăăă¨ăŤćł¨ćăăŚăă ăăă ăăăăĺçăźăĺ¤ăă¨ĺźăśăă¨ăă§ăăăăăŻăă¤ăłăżĺăŽăăăăăŁăŤăăăžăăă
| ăă¤ăłăżĺ| ăźăĺ¤| ĺçăźăĺ¤| ăłăĄăłă|
| --- | --- | --- | --- |
| * T | nil
| newďźTďź|
| [] T | nil
| [] T {} |
| map [T] U | nil
| map [T] U {} |
| func
| nil
| noop | ăăăăŁăŚăé˘ć°ăŽĺçăźăĺ¤ăŻä˝ăăăăăźăĺ¤ăčżăăžăă ćťăĺ¤ăŞăšăăerror
ă§çľäşăăă¨ăé˘ć°ăăćä˝ăŞăăă§ăăă¨ăăăăăŠăŤăăŽă¨ăŠăźăčżăăăžăă
| chan T
| nil
| makeďźchan Tďź|
| interface
| nil
| -| ä¸č¨ăŽnoop
é˘ć°ă§ăăšăŚăŽăĄă˝ăăăĺćĺăăăăăăŠăŤăăŽĺŽčŁ
|
| čĺĽăăăĺ
ąç¨ä˝| nil
| ćĺăŽăżă¤ăăŽĺçăźăĺ¤| |
çžĺ¨ăăăăăŽăżă¤ăăĺćĺăăăă¨ăçžĺ¨ăŽăăăŤnil
ăŤăŞăăžăă éăăŻă nil
ăŤă˘ăŻăťăšăăçŹéă§ăă ăăŽćçšă§ăĺçăźăĺ¤ă使ç¨ăăăžăă ăăă¤ăăŽäžďź
type S struct {
n int
}
var s *S
if s == nil { // true. Nothing different happens here
...
}
s.n = 1 // At this moment the go runtime would check if it is nil, and if it is,
// do "s = new(S)". We could say the code would be replaced by:
/*
if s == nil {
s = new(S)
}
s.n = 1
*/
// -------------
var pointers []*S = make([]*S, 100) // Everything as usual
for _,p := range pointers {
p.n = 1 // This is translated to:
/*
if p == nil {
p = new(S)
}
p.n = 1
*/
}
// ------------
type I interface {
Add(string) (int, error)
}
var i I
n, err := i.Add("yup!") // This method returns 0, and the default error "Noop"
if err != nil { // This condition is true and the error is returned
return err
}
ç§ăŻăăăăĺŽčŁ ăŽčŠłç´°ă¨čľˇăăăăĺéĄăčŚéăăŚăăžăăăćĺăŤăăŽă˘ă¤ăă˘ăŤçŚçšăĺăăăăăŁăăŽă§ăă
丝ăŞćŹ çšăŻăăă¤ăłăżĺăŽĺ¤ăŤă˘ăŻăťăšăăăăłăŤnil-checkăčż˝ĺ ăăăăă¨ă§ăă ăăăăç§ăŻč¨ăă§ăăăďź
ăăăŤăăăĺăŽăłăĄăłăă§čŞŹćăăăăšăŚăŽĺŠçšăĺžăăăžăăăăăŤăĺ¤ăŤă˘ăŻăťăšăăăăăŤĺăšă¤ăăă使ç¨ăăĺż čŚăăŞăďźčĺĽăăăĺ ąç¨ä˝ăŽăżďźăgoăłăźăă揥ăŽăăăŤăŻăŞăźăłăŤäżă¤ăă¨ăă§ăăžăăäťă§ăă
ăŠăćăăžăăďź ăăăăă§ăŤč°čŤăăăŚăăĺ ´ĺăŻă芍ăłçłăä¸ăăžăă ăžăăăăŽăłăĄăłăććĄăŻăčĺĽăăăĺ
ąç¨ä˝ăăănil
é˘éŁăăŚăăăă¨ăčŞčăăŚăăžăă ăăănilé˘éŁăŽĺéĄăŤç§ťăăăăăăžăăăăç§ăč¨ăŁăăăăŤăčĺĽăăăĺ
ąç¨ä˝ăŽä¸ťăŞĺéĄă§ăăćç¨ăŞăźăĺ¤ă俎ćŁăăăă¨ăăăăăăăăŤć稿ăăžăăă
ĺéĄăŤćťăă¨ăăăă匨ăăŚăă丝ăŞççąăŻăźăĺ¤ă§ăăăăăŤćăăăžăă
ăăăŻă寞ĺŚăăĺż
čŚăŽăăéčŚăŞćčĄçççąăŽ1ă¤ă§ăă ç§ăŤă¨ăŁăŚăŽä¸ťăŞççąăŻă掾éçăŞäżŽĺžŠăćĺşă¨ăăŚä¸ĺŻč˝ăŤăŞăăă¨ă§ăďźä¸č¨ăĺç
§ďźă ă¤ăžăăç§ĺäşşă¨ăăŚăŻăăăăăăŠăŽăăăŤĺŽčŁ
ăăăă¨ăăĺéĄă§ăŻăŞăăăăŽćŚĺżľăŤć šćŹçăŤĺ寞ăăŚăăă¨ăăăă¨ă§ăă
ăăăăŤăăăăŠăĄăăŽççąăăăĄă¤ăłăă§ăăăăŻăĺŽéăŤăŻĺĽ˝ăżă¨ĺĽ˝ăżăŽĺéĄă§ăă
ă ăăăăăç§ăăĄăďź
- ăăšăŚăŽăă¤ăłăżăżă¤ăăŤĺ˝šçŤă¤ăźăĺ¤ăĺŽçžŠăăžă
- ĺăăŚä˝żç¨ăăă¨ăăŤăŽăżĺćĺăăžăďźé ĺťśĺćĺďźă
ăă¤ăłăżĺă渥ăă¨ĺ¤ąćăăžăă äžăă°
func F(p *T) {
*p = 42 // same as if p == nil { p = new(T) } *p = 42
}
func G() {
var p *T
F(p)
fmt.Println(p == nil) // Has to be true, as F can't modify p. But now F is silently misbehaving
}
ăăŽč°čŤăŻăžăŁăăć°ăăăăŽă§ăŻăăăžăăă ĺç §ĺăăăŽăăăŤĺä˝ăăăŽăŤăŻççąăăăăGoéçşč ăăăăŤă¤ăăŚčăăŚăăŞăăŁăăăă§ăŻăăăžăă:)
ăăăĺéĄăŽć ¸ĺżă§ăă ăăăŻGoăčĄăăă¨ă§ăŻăăăžăă-ăăšăŚăŽăżă¤ăăŤăŻăźăĺ¤ăăăŞăŞăăăăăžăă ăăă§ăŞăăă°ăäžăă°makeďź[] Tă100ďźăä˝ăăăăŽăçăăĺż čŚăăăăžăăďź
T
ăźăĺ¤ăăŞăĺ ´ĺăăăďźăăăłnew(T)
ďźăŻč¨ąĺŻăăăŞăĺż
čŚăăăăžăă make([]T, 0, 100)
ăăă append
ă使ç¨ăăŚăšăŠă¤ăšăŤăăźăżăĺ
Ľĺăăĺż
čŚăăăăžăă ăă大ăăďź v[:0][:100]
ďźăĺăšăŠă¤ăšăăăă¨ăă¨ăŠăźă§ăăĺż
čŚăăăăžăă [10]T
ăŻĺşćŹçăŤä¸ĺŻč˝ăŞăżă¤ăă§ăďźé
ĺăă¤ăłăżăźăŤăšăŠă¤ăšăă˘ăľăźăăăćŠč˝ăč¨čŞăŤčż˝ĺ ăăăŚăăŞăéăďźă ăžăăä¸ä˝äşćć§ăçśćăăăăăŤăć˘ĺăŽnilableăżă¤ăănilable䝼ĺ¤ă¨ăăŚăăźăŻăăćšćłăĺż
čŚăŤăŞăăžăă
ăăăŻăă¸ă§ăăŞăăŻăšăčż˝ĺ ăăăĺ ´ĺăŤĺéĄăĺźă辡ăăăžăăă¤ăžăăăăçŻĺ˛ăćşăăăŞăéăăăăšăŚăŽĺăăŠăĄăźăżăźăăźăĺ¤ăćăăŞăăăŽă¨ăăŚćąăĺż čŚăăăăžăă ăżă¤ăăŽăľăăťăăăăĺşćŹçăŤăŠăă§ăĺćĺ追补ăĺż čŚăŤăŞăăžăă ăăăŻăăăŽä¸ăŤĺč¨ăżă¤ăăčż˝ĺ ăăŞăăŚăăăăčŞä˝ă§ăăŞă大ăăŞĺ¤ć´ăŤăŞăăžăă ăăăŻç˘şăăŤĺŽčĄĺŻč˝ă§ăăă貝ç¨äžżçĺćăŽč˛ťç¨é˘ăŤĺ¤§ăă貢çŽăăžăă 䝣ăăăŤăĺćĺăĺç´ăŤäżă¤ďźă常ăŤăźăĺ¤ăăăăďźă¨ăăćĺłçăŞé¸ćăŻăĺćĺăŽčż˝čˇĄă1ćĽçŽăăăŽč¨čŞă§čĄăăăĺ ´ĺăăăăĺćĺăč¤éăŤăă役éżăăăăžăă
ăăăŻă寞ĺŚăăĺż čŚăŽăăéčŚăŞćčĄçççąăŽ1ă¤ă§ăă ç§ăŤă¨ăŁăŚăŽä¸ťăŞççąăŻă掾éçăŞäżŽĺžŠăćĺşă¨ăăŚä¸ĺŻč˝ăŤăŞăăă¨ă§ăďźä¸č¨ăĺç §ďźă ă¤ăžăăç§ĺäşşă¨ăăŚăŻăăăăăăŠăŽăăăŤĺŽčŁ ăăăă¨ăăĺéĄă§ăŻăŞăăăăŽćŚĺżľăŤć šćŹçăŤĺ寞ăăŚăăă¨ăăăă¨ă§ăă
ăăăăŤăăăăŠăĄăăŽççąăăăĄă¤ăłăă§ăăăăŻăĺŽéăŤăŻĺĽ˝ăżă¨ĺĽ˝ăżăŽĺéĄă§ăă
ăŻăăăăăăžăăă äťăŽäşşăŽčŚçšăčŚăĺż čŚăăăăžăďźăăŞăăăăăăŚăăŞăă¨č¨ăŁăŚăăăŽă§ăŻăŞăăç§ăŻăă ăă¤ăłăăä˝ăŁăŚăăă ăă§ăďźwink :)彟ăăŻăăă彟ăăŽăăă°ăŠă ăć¸ăăăăŽĺźˇĺăŞä˝ăă¨ăăŚčŚăŚăăžăă GoăŤéŠĺăăžăăďź ăăăŻă˘ă¤ăă˘ăăŠăŽăăăŤĺŽčĄăăăč¨čŞăŤçľąĺăăăăăŤäžĺăăžăăăăăŚăăăŻç§ăăĄĺ ¨ĺĄăăăŽăšăŹăăă§ăăăă¨ăăŚăăăă¨ă§ăďźç§ăŻć¨ć¸Źăăžăďź
ăă¤ăłăżĺă渥ăă¨ĺ¤ąćăăžăă äžďź...ďź
ăăăăăăžăăă ăŞăăăă夹ćăŞăŽă§ăăďź é˘ć°ăăŠăĄăźăżăźăŤĺ¤ă渥ăă ăă§ăăăăăŻăăžăăžnil
ĺ¤ăćă¤ăă¤ăłăżăźă§ăă 揥ăŤăé˘ć°ĺ
ă§ăăŽĺ¤ăĺ¤ć´ăăžăă é˘ć°ăŽĺ¤ă§ăŻăăăăŽĺšćăŻčŚăăăŞăăă¨ăäşćłăăăžăă ăăă¤ăăŽäžăŤă¤ăăŚăłăĄăłăăăăŚăă ăăă
// Augmenting your example with more comments:
func FCurrentGo(p *T) {
// Here "p" is just a value, which happens to be a pointer type. Doing...
*p = 42
// ...without checking first for "nil" is the recipe for hiding a bug that will crash the entire program,
// which is exactly what is happening in current Go code bases
// The correct code would be:
if p == nil {
// panic or return error
}
*p = 42
}
func FWithDynamicZero(p *T) {
// Here, again, p is just a value of a pointer type. Doing...
*p = 42
// would allocate a new T and assign 42. It is true that this doesn't have any effect on the "outside
// world", which could be considered "incorrect" because you expected the function to do that.
// If you really want to be sure "p" is pointing to something valid in the "outside world", then
// check that:
if p == nil {
// panic or return error
}
*p = 42
}
func main() {
var p *T
FCurrentGo(p) // This will crash the program
FWithDynamicZero(p) // This won't have any effect on "p". This is expected because "p" is not pointing
// to anything. No crash here.
fmt.Println(p == nil) // It is true, as expected
}
ĺć§ăŽçśćłăéăă¤ăłăżăźăŹăˇăźăăźăĄă˝ăăă§ăçşçăăŚăăăć°čŚĺĺ Ľč ăGoăĺŽčĄăăăŽăŻćˇˇäšąăăŚăăžăďźăă ăăç解ăăŚăăžăă°ćĺłăăăăžăďźă
type Point struct {
x, y int
}
func (p Point) SetXY(x, y int) {
p.x = x
p.y = y
}
func main() {
p := Point{x: 1, y: 2}
p.SetXY(24, 42)
pointerToP := &Point{x: 1, y: 2}
pointerToP.SetXY(24, 42)
fmt.Println(p, pointerToP) // Will print "{1 2} &{1 2}", which could confuse at first
}
ăăăăŁăŚă揥ăŽăăăăăé¸ćăăĺż čŚăăăăžăă
ăŠăĄăăŽĺ ´ĺă俎ćŁăŻĺăă§ăăä˝ăăčĄăĺăŤnilă確čŞăăŚăă ăăă ăăăăç§ăŤă¨ăŁăŚăŻăAďźăŻăŻăăăŤć厳ă§ăďźă˘ăăŞăąăźăˇă§ăłĺ
¨ä˝ăăŻăŠăăˇăĽăăžăďźďźă
Bďźăăľă¤ăŹăłăă¨ăŠăźăă¨čŚăŞăăă¨ăă§ăăžăăăă¨ăŠăźă¨ăŻčŚăŞăăžăăă ăăăŻăé˘ć°ă¸ăŽăă¤ăłăżăźă渥ăĺ ´ĺăŤăŽăżçşçăăžăăăăăžă§ăŤç¤şăăăăăŤăć§é ä˝ăĺć§ăŤĺä˝ăăĺ ´ĺăăăăžăă ăăăŻăăăăăăăă大ăăŞăĄăŞăăăčć
ŽăăăŤčĄăăžăă
注ďźç§ăŻăčŞĺăŽăă˘ă¤ăă˘ăç˛çŽçăŤćčˇăăăă¨ăăŚăăăŽă§ăŻăŞăăGoăćšĺăăăă¨ăăŚăăăŽă§ăďźăăăŻăă§ăŤćŹĺ˝ăŤčŻăăă¨ă§ăďźă ă˘ă¤ăă˘ă䞥ĺ¤ăŽăŞăăăŽăŤăăäťăŽăă¤ăłăăăăĺ ´ĺăç§ăŻăăăć¨ăŚăŚäťăŽćšĺăŤčăçśăăăă¨ăć°ăŤăăžăă
注2ďźćçľçăŤăăăŽă˘ă¤ăă˘ăŻănilăĺ¤ăŽăżă寞蹥ă¨ăăŚăăăčĺĽăăăĺ ąç¨ä˝ă¨ăŻé˘äżăăăžăăă ă ăăç§ăŻăăăćąćăăŞăăăăŤĺĽăŽĺéĄăä˝ćăăžă
ăŻăăăăăăžăăă äťăŽäşşăŽčŚçšăčŚăŞăăă°ăŞăăžăăďźăăŞăăăăăăŚăăŞăă¨č¨ăŁăŚăăăŽă§ăŻăŞăăăă 丝埾ăăŚăăă ăă§ăďżźďź
ăăăăăăŽĺŁăŻä¸ĄćšăŽéăĺăăžăă ăăŞăăŻăăăăćăă丝ăŞççąăŻ
ăŞăăăă夹ćăŞăŽă§ăăďź
ăă¤ăłăżăă¨ăŁăŚăăé˘ć°ăŻăĺ°ăŞăă¨ăé ťçšăŤăăă¤ăłăżăĺ¤ć´ăăăă¨ăç´ćăăăăă§ăă é˘ć°ăăľă¤ăŹăłăăŤä˝ăăăŞăĺ ´ĺăç§ăŻăăăăă°ă¨čŚăŞăăžăă ăžăăŻăĺ°ăŞăă¨ăăăăŽăăăŤăźăăăăăŻăé˛ăăă¨ă§ăć°ăăăŻăŠăšăŽăă°ăçşçăăă¨ăăăŽăŻç°ĄĺăŞč°čŤă§ăă
ăăăŤä˝ăăćĺž ăăé˘ć°ăŤnilăă¤ăłăżăźă渥ăă¨ăăăăŻăă°ă§ă-ăăăŚăăăŽăăăŞăă°ăŽăăă˝ăăăŚă§ă˘ăéăăŤçśçśăăăăă¨ăŽĺŽéăŽäžĄĺ¤ăŻăăăăžăăă ç§ăŻénilableăă¤ăłăżăŽăľăăźăăćă¤ăă¨ăŤăăăăłăłăă¤ăŤćăŤăăŽăă°ăĺźăăŽăŞăŞă¸ăăŤăŽă˘ă¤ăă˘ăŽĺ¤ăčŚăăă¨ăă§ăăžăăăç§ăŻăăŽăă°ăĺ ¨ăăăŁăăăăăŞăăăăŤă§ăăăăăŤăă¤ăłăă襨示ăăăŚăăžăăă
ă¤ăžăăăăă°ănilableă§ăŞăăă¤ăłăżăŽĺŽéăŽććĄă¨ăŻç°ăŞăĺéĄăŤĺăçľăă§ăăžăăăăŽććĄăŽĺ ´ĺăăŠăłăżă¤ă ăăăăŻăŻĺéĄă§ăŻăŞăăĺăŞăççśă§ăăĺéĄăŻă誤ăŁăŚć¸Ąăăăăă°ă§ăă nil
ăŻăăăăäşćăăăăăŽăă°ăŻĺŽčĄćăŤăŽăżăăŁăăăăăăăŽăŤăŞăăžăă
ĺć§ăŽçśćłăŻăéăă¤ăłăżăźĺ俥ćŠćšĺźă§ăçşçăăŚăăžăă
ç§ăŻăăŽă˘ăăă¸ăźăčłźĺ Ľăăžăăă IMOăć¤č¨ăăăă¨ăŻĺŽĺ ¨ăŤĺççă§ă
func Foo(p *int) { *p = 42 }
func main() {
var v int
Foo(&v)
if v != 42 { panic("") }
}
ćŁăăăłăźăă§ăăăăăŤă čăăăŽăŻĺççă§ăŻăŞăă¨ćăăžă
func Foo(v int) { v = 42 }
func main( ){
var v int
Foo(v)
if v != 42 { panic("") }
}
ćŁăăăă¨ă ăăśăăăăŞăăGoăŽĺŽĺ
¨ăŞĺĺżč
ă§ăăăăăšăŚăŽĺ¤ăĺç
§ă§ăăč¨čŞăăćĽăŚăăĺ ´ĺďźç§ăŻćŁç´ăŤăăăčŚă¤ăăăŽăŤčŚĺ´ăăŚăăžă-Pythonă¨Javaă§ăăăťă¨ăăŠăŽĺ¤ăĺç
§ăăžăďźă ăăăăIMOăŻăăăŽĺ ´ĺăŽćéŠĺăŻçĄé§ă§ăăăäşşă
ăŻăă¤ăłăżăźă¨ĺ¤ăŤăăç¨ĺşŚç˛žéăăŚnil
ăă¤ăłăżăźăéçăŤé˛ăăăăŽĺ
¨ä˝çăŞč°čŤă§ăăăćĺłăăăŤăă¤ăłăżăźăăźăăŤăăĺŽčĄćăŤćŁăăĺ¤čŚłăŽăłăźăă夹ćăăăŽăŻç°Ąĺăăăă¨ăăăă¨ă§ăă
ăŠăĄăăŽĺ ´ĺă俎ćŁăŻĺăă§ăăä˝ăăčĄăĺăŤnilă確čŞăăŚăă ăăă
IMOăŽçžĺ¨ăŽăťăăłăăŁăŻăšăŽäżŽćŁăŻănilăăă§ăăŻăăă誰ăănilă渥ăăĺ ´ĺăŤăă°ă¨čŚăŞăăă¨ă§ăă ăăŞăăŽäžă§ăŻă
// The correct code would be:
if p == nil {
// panic or return error
}
*p = 42
ăăăăç§ăŻăăŽăłăźăăćŁăăă¨ăŻćăăžăăă nil
éĺç
§ăă§ăŤăăăăŻăŤăŞăŁăŚăăăăă nil
checkăŻä˝ăăăžăăă
ăăăăç§ăŤă¨ăŁăŚăŻăAďźăŻăŻăăăŤć厳ă§ăďźă˘ăăŞăąăźăˇă§ăłĺ ¨ä˝ăăŻăŠăăˇăĽăăžăďźďźă
ăăăŻĺéĄăăăžăăăăĺ¤ăăŽäşşăăăăŤĺźˇăĺ寞ăăăă¨ăčŚăăŚăăăŚăă ăăă ç§ăŻĺäşşçăŤăç ´ćăăăăźăżăééăŁă䝎ĺŽăçśăăăăăăăŻăŠăăˇăĽă常ăŤćăžăăă¨čăăŚăăžăă çćłçăŞä¸çă§ăŻăç§ăŽă˝ăăăŚă§ă˘ăŤăŻăă°ăăŞăăăŻăŠăăˇăĽăăăă¨ăăăăžăăă ăăžăçćłçă§ăŻăŞăä¸çă§ăŻăç§ăŽăăă°ăŠă ăŤăŻăă°ăăăăć¤ĺşăăăă¨ăăŤăŻăŠăăˇăĽăăăă¨ă§ĺŽĺ ¨ăŤĺ¤ąćăăžăă ććŞăŽä¸çă§ăŻăç§ăŽăăă°ăŠă ăŤăŻăă°ăăăăăăăăçşçăăă¨ăăŤĺ¤§ćˇˇäšąăĺźă辡ăăçśăăžăă
ăăăăăăŽĺŁăŻä¸ĄćšăŽéăĺăăžăă ăăŞăăŻăăăăćăă丝ăŞççąăŻăă¨č¨ăăžăăă ăăŽĺŁ°ćăŻăç§ăăĄĺ ¨ĺĄăăăŽććĄăŽĺšćăćăăăŠăăăŤă¤ăăŚĺćăăŚăăăă¨ăćĺłăăžăă ç§ăŻç˘şăăŤăăăăčĄăăăçšĺŽăŽććĄă匨ăăćčĄçăŞčŠłç´°ă§ăăăă¨ăŤĺćăăăă¨ăă§ăăžăďźăžăăŻăĺ°ăŞăă¨ăăććĄăŻăăŽčłŞĺăŤă¤ăăŚä˝ăăč¨ăăšăă§ăďźă ăăăăç§ăŻă誰ăăĺŽéăŤăăăćăă§ăăă¨ćłĺŽăăŚăăăăŠăŹăŤăŻăźăŤăăŤéăăŤč°čŤăĺć§ćăăăăŽăŻĺĽ˝ăă§ăŻăăăžăăă
ăžăăç§ăŻăăăć示ăăăăăăžăăă§ăăă ăăăç解ăăăăŽăŞăăç§ăŻćŁăăč¨čăé¸ăă§ăăŞăăăăăăžăăăăăăŚç§ăŻčŹç˝Şăăžăă čăăăă解湺çăŤă¤ăăŚăăă¤ăăŽă˘ă¤ăă˘ăćäžăăăăŁăă ăă§ăăăăă ăă§ăă
ç§ăŻ_ "...ăăă匨ăăŚăă丝ăŞççąăŻ...." _ăăŞăăŽćçŤ ăŤĺşăĽăăŚăăăăă§ă_ "ăăăĺéĄăŽć ¸ĺżă§ă" _ăźăĺ¤ăĺç §ăăŚăăžăă ăăŽăăăăźăĺ¤ăăăă匨ăă丝ăŞăăŽă§ăăă¨ćăăžăăă ă ăăăăăŻç§ăŽćŞă䝎ĺŽă§ăăă
nil
ăľă¤ăŹăłăăŤĺŚçăăăŽăăăłăłăă¤ăŤćăŤăă§ăăŻăăăŽăăŤă¤ăăŚďźăłăłăă¤ăŤćăŤăă§ăăŻăăćšăăăăă¨ăŤĺćăăžăă ăĺçăźăĺ¤ăăŻăall-types-should-have-zero-valueăŽĺéĄăŤĺŻžĺŚăăăă¨ăŤçŚçšăĺ˝ăŚăă¨ăăŽăĺ
ăŽććĄăŽĺăŞăĺ垊ă§ăăă čż˝ĺ ăŽĺćŠăŻăăăă塎ĺĽĺăăăçľĺăŽććĄăŽä¸ťăŞćĺśă§ăăăă¨ç§ăčăăă¨ăăăă¨ă§ăăă
nilé˘éŁăŽĺéĄăŽăżăŤçŚçšăĺ˝ăŚăĺ ´ĺăŻăăłăłăă¤ăŤćăŤnil䝼ĺ¤ăŽăă¤ăłăżăźĺăăă§ăăŻăăăă¨ăăĺ§ăăăžăă
ăăćçšă§ăç§ăăĄďźăç§ăăĄăă¨ăŻăGoăłăăĽăăăŁĺ
¨ä˝ăćăăžăďźăŻăăă税ăŽĺ¤ć´ăĺăĺ
Ľăăĺż
čŚăăăă¨ćăăžăă äžďź nil
ă¨ăŠăźăĺŽĺ
¨ăŤĺéżăăăăăŽéŠĺăŞč§Łćąşçăăăăăăă匨ăăăŽăăăăšăŚăŽăżă¤ăăŽĺ¤ăăźăă§ă0ă§ć§ćăăăŚăăăă¨ăăč¨č¨ä¸ăŽćąşĺŽă§ăăĺ ´ĺăăăŽă˘ă¤ăă˘ăć¤č¨ă§ăăžăăăăă䞥ĺ¤ăăăăăăŽă§ăăă°ăăăŽćąşĺŽăŤăăă¤ăăŽĺžŽčŞżć´ăĺ¤ć´ăĺ ăăăă¨ă§ăă
ç§ăăăăč¨ăŁăŚăă丝ăŞççąăŻăăŞăăŽćă§ă_ "ăăšăŚăŽăżă¤ăăŻăźăĺ¤ăçľć˘çŹŚ" _ă ç§ăŻé常ăăçľć˘çŹŚăć¸ăăăŽăŻĺĽ˝ăă§ăŻăăăžăăă 誤解ăăŞăă§ăă ăăďź ç§ăŻăăŞăăăăŽăăăŤčăăăă¨ăĺŽĺ ¨ăŤĺăĺ ĽăăžăăăăăŻç§ăŽčăćšă§ăďźĺ˝źăăŻăăčŻă解湺çăŤă¤ăŞăăĺŻč˝ć§ăŽăăéăé ăăă¨ăă§ăăăŽă§ç§ăŻć瞊ă弽ăżăžăăă
ćĺžăŤăăăăŤé˘ăăŚďź
ăăăŻĺéĄăăăžăăăăĺ¤ăăŽäşşăăăăŤĺźˇăĺ寞ăăăă¨ăčŚăăŚăăăŚăă ăăă ç§ăŻĺäşşçăŤăç ´ćăăăăźăżăééăŁă䝎ĺŽăçśăăăăăăăŻăŠăăˇăĽă常ăŤćăžăăă¨čăăŚăăžăă çćłçăŞä¸çă§ăŻăç§ăŽă˝ăăăŚă§ă˘ăŤăŻăă°ăăŞăăăŻăŠăăˇăĽăăăă¨ăăăăžăăă ăăžăçćłçă§ăŻăŞăä¸çă§ăŻăç§ăŽăăă°ăŠă ăŤăŻăă°ăăăăć¤ĺşăăăă¨ăăŤăŻăŠăăˇăĽăăăă¨ă§ĺŽĺ ¨ăŤĺ¤ąćăăžăă ććŞăŽä¸çă§ăŻăç§ăŽăăă°ăŠă ăŤăŻăă°ăăăăăăăăçşçăăă¨ăăŤĺ¤§ćˇˇäšąăĺźă辡ăăçśăăžăă
ç§ăŻăăăŤĺŽĺ ¨ăŤĺćăăžăă 大声ă§ĺ¤ąćăăăă¨ăŻăéăăŤĺ¤ąćăăăăă常ăŤĺŞăăŚăăžăă ăă ăăGoăŤăŻĺéĄăăăăžăă
ăăăŻăăŚăăďźé常ăŤĺąéşă§ăăďźăčăăŻăé厳ăŽăŤăă´ăŞĺ
¨ä˝ďź nil
é˘éŁăŽé厳ďźăĺéżăăăă¨ă§ăă
ăăă§ăŻăăăăçš°ăčżăçśăăŚă解湺çăčŚă¤ăăŚăżăžăăăă
ćéă¨ă¨ăăŤăŽăźăăăăă¨ăďź
haskellăŽĺč¨ĺă§ăŻăŞăărustăŽčĺĽăăăĺ
ąç¨ä˝ć§ćă確čŞăăăă¨ćăăžăăăăăŤăăăăăŞă˘ăłăăŽĺ˝ĺăĺŻč˝ăŤăŞăăăăĺŞăăăăżăźăłăăăăłă°ć§ćăŽććĄăĺŻč˝ăŤăŞăăžăă
ĺŽčŁ
ăŻăăżă°ăăŁăźăŤăďźuintăżă¤ăăăăŞă˘ăłăăŽć°ăŤăăŁăŚç°ăŞăăžăďźă¨ăŚăăŞăłăăŁăźăŤăďźăăźăżăäżćăăďźă使ç¨ăăć§é ä˝ăŽăăăŤĺŽčĄă§ăăžăă
ăăŽćŠč˝ăŻăăăŞă˘ăłăăŽăŻăăźăşăăťăăăŤĺż
čŚă§ăďźăłăłăă¤ăŤćăŽăă§ăăŻăŤăăăçść
襨çžăăŻăăăŤç°Ąĺă§ăŻăŞăźăłăŤăŞăăžăďźă ă¤ăłăżăźăă§ă¤ăšă¨ăăŽčĄ¨çžăŤé˘ăă質ĺăŤăăă¨ăă¤ăłăżăźăă§ă¤ăšăŻăăă¤ăăŽčŚäťśăŤéŠĺăăäťťćăŽăżă¤ăăŤé˘ăăăăŽă§ăăăăăĺč¨ăżă¤ăă§ăŽĺŽčŁ
ăŻăĺč¨ăżă¤ăăŽĺĽăŽăąăźăšăăăçľăăŁăŚăŻăŞăăŞăă¨ćăăžăăăĺč¨ăżă¤ăăŽăŚăźăšăąăźăšăŻç°ăŞăăžăă
ć§ćďź
type Type enum {
Tuple (int,int),
One int,
None,
};
ä¸č¨ăŽäžă§ăŻăăľă¤ăşăŻsizeofďźďźintăintďźďźăŤăŞăăžăă
ăăżăźăłăăăăłă°ăŻă揥ăŽăăăŤăć°ăăä˝ćăăăä¸č´ćźçŽĺă使ç¨ăăŚăăžăăŻć˘ĺăŽăšă¤ăăćźçŽĺĺ
ă§ĺŽčĄă§ăăžăă
var a Type
switch (a) {
case Tuple{(b,c)}:
//do something
case One{b}:
//do something else
case None:
//...
}
ä˝ćć§ćďź
var a Type = Type{One=12}
ĺćĺă¤ăłăšăżăłăšăŽć§çŻă§ăŻăćĺŽă§ăăăăŞă˘ăłăăŻ1ă¤ă ăă§ăăăă¨ăŤćł¨ćăăŚăă ăăă
ăźăĺ¤ďźĺéĄďźďź
ĺĺăŻă˘ăŤăăĄăăăé ăŤä¸Śăšćżăăăă¨ăă§ăăžăăĺćĺăŽăźăĺ¤ăŻă丌ăšćżăăăăăĄăłăăźăŞăšăăŽćĺăŽăĄăłăăźăŽăżă¤ăăŽăźăĺ¤ăŤăŞăăžăă
ăźăĺ¤ĺéĄăŽPSă˝ăŞăĽăźăˇă§ăłăŻă丝ăŤĺćăŤăăŁăŚĺŽçžŠăăăžăă
ĺč¨ăŽăźăĺ¤ăćĺăŽăŚăźăśăźĺŽçžŠăŽĺč¨ăăŁăźăŤăăŽăźăĺ¤ă¨ăăŚäżćăăăă¨ăŻăăăăă桡䚹ăĺ°ăŞăă¨ćăăžăă
ĺč¨ăŽăźăĺ¤ăćĺăŽăŚăźăśăźĺŽçžŠăŽĺč¨ăăŁăźăŤăăŽăźăĺ¤ă¨ăăŚäżćăăăă¨ăŻăăăăă桡䚹ăĺ°ăŞăă¨ćăăžăă
ăăăăăźăĺ¤ăä˝ćăăăă¨ăŻăăŁăźăŤă厣č¨ăŽé ĺşăŤäžĺăăžăăç§ăŻăăăăăćŞăă¨ćăăžăă
誰ăăăăśă¤ăłăăăĽăĄăłăăć¸ăăďź
ç§ăŻ1ă¤ăćăŁăŚăăďź
19412-discriminated_unions_and_pattern_matching.md.zip
ç§ăŻăăăĺ¤ć´ăăžăăďź
ĺč¨ăŽăźăĺ¤ăćĺăŽăŚăźăśăźĺŽçžŠăŽĺč¨ăăŁăźăŤăăŽăźăĺ¤ă¨ăăŚäżćăăăă¨ăŻăăăăă桡䚹ăĺ°ăŞăă¨ćăăžăă
äťăç§ăŽććĄă§ăŻăăźăĺ¤ďźĺéĄďźăŤé˘ăăĺćăurandomsăŽä˝ç˝ŽăŤç§ťĺăăžăăă
UPDďźč¨č¨ăăăĽăĄăłăăĺ¤ć´ăăăăă¤ăăźăŞäżŽćŁăčĄăăăžăăă
ćčżă2ă¤ăŽăŚăźăšăąăźăšăăăăçľăżčžźăżăŽĺč¨ĺăĺż čŚă§ăăă
ăŠăĄăăŽĺ ´ĺăă揥ăŽăăăŞăăŽăĺŽčŁ ăăžăăďź2çŞçŽăŽăżăšăŻăŽäžďźă
type Task interface {
task()
}
type SearchAdd struct {
Ctx context.Context
ID string
Attrs Attributes
}
func (SearchAdd) task() {}
type SearchUpdate struct {
Ctx context.Context
ID string
UpdateAttrs UpdateAttributes
}
func (SearchUpdate) task() {}
type SearchDelete struct {
Ctx context.Context
ID string
}
func (SearchDelete) task() {}
ăăŽĺž
task := <- taskChannel
switch v := task.(type) {
case tasks.SearchAdd:
resp, err := search.Add(task.Ctx, &search2.RequestAdd{âŚ}
if err != nil {
log.Error().Err(err).Msg("blah-blah-blah")
} else {
if resp.GetCode() != search2.StatusCodeSuccess {
âŚ
}
}
case tasks.SearchUpdate:
âŚ
case tasks.SearchDelete:
âŚ
}
ăăăŻăťă¨ăăŠčŻăă§ăă ćŞăçšăŻăGoăĺŽĺ ¨ăŞĺĺŽĺ ¨ć§ăćäžăăŞăăă¨ă§ăăă¤ăžăăć°ăăć¤ç´˘ă¤ăłăăăŻăšćä˝ăżăšăŻăčż˝ĺ ăăăĺžăăłăłăă¤ăŤă¨ăŠăźăŻçşçăăžăăă
ĺč¨ăżă¤ăă使ç¨ăăIMHOăŻăé常ă訪ĺč ă¨ăăŁăšăăăăŁăŽăťăăă§č§ŁćąşăăăăăŽç¨ŽăŽăżăšăŻăŽćăć確ăŞă˝ăŞăĽăźăˇă§ăłă§ăă訪ĺč ăŽćŠč˝ăŻĺ¤ăăŞăăĺ°ăăă訪ĺč čŞä˝ăŻĺşĺŽăżă¤ăă§ăă
ç§ăŻćŹĺ˝ăŤä˝ăăŽăăăŞăăŽăćăŁăŚăăă¨äżĄăăŚăăžă
type Task oneof {
// SearchAdd holds a data for a new record in the search index
SearchAdd {
Ctx context.Context
ID string
Attrs Attributes
}
// SearchUpdate update a record
SearchUpdate struct {
Ctx context.Context
ID string
UpdateAttrs UpdateAttributes
}
// SearchDelete delete a record
SearchDelete struct {
Ctx context.Context
ID string
}
}
+
switch task {
case tasks.SearchAdd:
// task is tasks.SearchAdd in this scope
case tasks.SearchUpdate:
case tasks.SearchDelete:
}
Goăçžĺ¨ăŽçść ă§č¨ąĺŻăăŚăăäťăŽăŠăŽă˘ăăăźăăăăă粞çĽçăŤăŻăŻăăăŤGoishăŤăŞăăžăă ăăšăąăŤăŞăăˇăĽăŽăăżăźăłăăăăłă°ăŻĺż čŚăăăžăăăçšĺŽăŽăżă¤ăăžă§ăŽăŚă¤ăšăăă¤ăăłă°ă§ĺĺă§ăă
çăăć§ćććĄăŽăă¤ăłăăéăăă 俎çăăă
2ă¤ăŽăăźă¸ă§ăłă1ă¤ăŻćąç¨ĺč¨ăżă¤ăç¨ăăă1ă¤ăŻĺćç¨ăŽĺč¨ăżă¤ăă§ăă
type Sum oneof {
Tâ TypeDeclâ
Tâ TypeDeclâ
âŚ
Tâ TypeDeclâ
}
ăăă§ă Tâ
⌠Tâ
ăŻă Sum
ă¨ĺăăŹăăŤăŽĺĺŽçžŠă§ăăďź oneof
ăŻăăăăăšăłăźăĺ¤ăŤĺ
Źéăăžăďźă Sum
厣č¨ăăžăTâ
⌠Tâ
ă ăăćşăăăăă¤ăăŽă¤ăłăżăźăă§ăźăšă
ĺŚçăŻ(type)
ăšă¤ăăă¨ĺć§ă§ăăă oneof
ăŞăă¸ă§ăŻăăŤĺŻžăăŚćéťçăŤĺŽčĄăăăăăšăŚăŽăăŞă˘ăłăăăŞăšăăăăŚăăăăŠăăăăłăłăă¤ăŠăźă§ăă§ăăŻăăĺż
čŚăăăăžăă
type Enum oneof {
Value = iota
}
ć示çăŤăŞăšăăăăĺ¤ăŽăżăĺćĺă§ăăăäťăŽăăšăŚăăăă§ăŻăŞăăă¨ăé¤ăăŚăconstsăŽiota
ă¨é常ăŤäźźăŚăăžăă
switch task { case tasks.SearchAdd: // task is tasks.SearchAdd in this scope case tasks.SearchUpdate: case tasks.SearchDelete: }
Goăçžĺ¨ăŽçść ă§č¨ąĺŻăăŚăăäťăŽăŠăŽă˘ăăăźăăăăă粞çĽçăŤăŻăŻăăăŤGoishăŤăŞăăžăă ăăšăąăŤăŞăăˇăĽăŽăăżăźăłăăăăłă°ăŻĺż čŚăăăžăăăçšĺŽăŽăżă¤ăăžă§ăŽăŚă¤ăšăăă¤ăăłă°ă§ĺĺă§ăă
task
ĺ¤ć°ăŽćĺłăćä˝ăăăă¨ăŻă訹厚ă§ăăăăŽăŽăčŻăčăă§ăŻăŞăă¨ćăăžăă
```go switch task { case tasks.SearchAdd: // task is tasks.SearchAdd in this scope case tasks.SearchUpdate: case tasks.SearchDelete: }
Goăçžĺ¨ăŽçść ă§č¨ąĺŻăăŚăăäťăŽăŠăŽă˘ăăăźăăăăă粞çĽçăŤăŻăŻăăăŤGoishăŤăŞăăžăă ăăšăąăŤăŞăăˇăĽăŽăăżăźăłăăăăłă°ăŻĺż čŚăăăžăăăçšĺŽăŽăżă¤ăăžă§ăŽăŚă¤ăšăăă¤ăăłă°ă§ĺĺă§ăă
ăżăšăŻĺ¤ć°ăŽćĺłăćä˝ăăăă¨ăŻă訹厚ă§ăăăăŽăŽăčŻăčăă§ăŻăŞăă¨ćăăžăă
`` `
ăăă§ăŻă訪ĺč ăŽçăăăé ĺźľăŁăŚăă ăăă
@sirkon訪ĺč ăŤă¤ăăŚăŠăăăćĺłă§ăăďź ç§ăŻăăŽć§ćă弽ăă§ăăăăăšă¤ăăăŻćŹĄăŽăăăŤć¸ăĺż čŚăăăăžăďź
switch task {
case Task.SearchAdd:
// task is Task.SearchAdd in this scope
case Task.SearchUpdate:
case Task.SearchDelete:
}
ăžăă Task
䞥ĺ¤ăăŞăĺ ´ĺăŻăŠăăŞăăžăăďź äžăă°ďź
var task Task
nil
ă§ăăăăďź ăăăăăŞăă switch
ăŤăŻčż˝ĺ ăŽcase nil
ă§ăăďź
ăăă¨ăćĺăŽăżă¤ăăŤĺćĺăăăžăăďź ĺ厣č¨ăŽé ĺşă䝼ĺă¨ăŻç°ăŞăćšćłă§éčŚăŤăŞăăăăăăăŻĺäťă§ăăăć°ĺ¤ĺćĺă§ăŻăăăăĺéĄăăăžăăă
ăăăŻswitch task.(type)
ă¨ĺçă ă¨ćăăžăăăăšă¤ăăă§ăŻăăšăŚăŽăąăźăšăĺĺ¨ăăĺż
čŚăăăăžăăăďź ăŽăăăŤ..1ă¤ăŽăąăźăšăčŚéăăĺ ´ĺăăłăłăă¤ăŤă¨ăŠăźă ăžăă default
訹ĺŻăăăŚăăžăăă ăăă§ăăďź
訪ĺč ă¨ăŻăŠăăăćĺłă§ăăďź
ç§ăŻăăăăăăăŽăăăŞç¨ŽéĄăŽćŠč˝ăŽăăăŽGoăŽĺŻä¸ăŽăżă¤ăăťăźăăŞăăˇă§ăłă§ăăăă¨ăćĺłăăžăăă çšĺŽăŽăąăźăšăŽăťăăďźäşĺĺŽçžŠăăăé¸ćč˘ăŽć°ăéăăăŚăăďźăŽĺ ´ĺăŻăăăăŤćŞĺăăžăă
ăžăăăżăšăŻăŽäžĄĺ¤ăăŞăăă¨ăŻä˝ă§ăăăăďź äžăă°ďź
var task Task
ç§ăŻăăăăăŽăăăŤGoă§nilableăżă¤ăă§ăăăšăă ă¨ćăăžă
ăăă¨ăćĺăŽăżă¤ăăŤĺćĺăăăžăăďź
çšăŤćĺłăăăçŽçăŽăăăŤăŻăăžăăŤăĺĽĺŚă ăăă
ăăăŻăšă¤ăăăżăšăŻďźăżă¤ăďźă¨ĺçă ă¨ćăăžăăăăšă¤ăăă§ăŻăăšăŚăŽăąăźăšăĺĺ¨ăăĺż čŚăăăăžăăăďź ăŽăăăŤ..1ă¤ăŽăąăźăšăčŚéăăĺ ´ĺăăłăłăă¤ăŤă¨ăŠăźă
ăŻăăăăă§ăă
ăžăăăăăŠăŤăăŻč¨ąĺŻăăăŚăăžăăă ăăă§ăăďź
ăăăăăăăŠăŤăăŻč¨ąĺŻăăăŚăăžăă ăă ăăăĺ§ăăăžăăă
PSç§ăŻGo @ ianlancetaylorăäťăŽGoăŽäşşă ăĺč¨ĺăŤă¤ăăŚćăŁăŚăăă¨ăăčăăćăŁăŚăăăăă§ăă GoăŻnilĺ¤ăĺśĺžĄă§ăăŞăăăănilnessă使ç¨ăăă¨NPDăçşçăăăăăŞăăăă§ăă
ăźăăŽĺ ´ĺăŻăĺéĄăŞăă¨ćăăžăă case nil
ăswitchăšăăźăăĄăłăăŽčŚäťśă§ăăăă¨ăćăžăăă§ăă ĺăŤif task != nil
ĺŽčĄăăăă¨ăĺéĄăăăžăăăăç§ăŻăăăăăžă弽ăă§ăŻăăăžăăďź|
ăăă訹ĺŻăăăžăăďź
type Foo oneof {
A = 3
B = "3"
C = 3.0
D = struct { E bool }{ true }
}
ăăă訹ĺŻăăăžăăďź
type Foo oneof { A = 3 B = "3" C = 3.0 D = struct { E bool }{ true } }
ăăă¨ăĺŽć°ăŻăăăžăăăăă
type Foo oneof {
A <type reference>
}
ăžă
type Foo oneof {
A = iota
B
C
}
ăžă
type Foo oneof {
A = 1
B = 2
C = 3
}
iotasă¨ĺ¤ăŽçľăżĺăăăŻăăăžăăă ăžăăŻăĺ¤ăŽĺśĺžĄă¨çľăżĺăăăŚăăăăăçš°ăčżăăŞăă§ăă ăăă
FWIWăćć°ăŽă¸ă§ăăŞăăŻč¨č¨ăŤă¤ăăŚç§ăčĺłćˇąăă¨ćăŁăăŽăŻăăźăĺ¤ăŤé˘ăăč˝ă¨ă犴ăéżăăŞăăăĺč¨ĺăŽăŚăźăšăąăźăšăŽĺ°ăŞăă¨ăăăă¤ăăŤĺŻžĺŚăăăăăŽĺĽăŽĺ ´ćă示ăăăă¨ă§ăă ăăćĺłă§ĺăŁă˝ăčŤçĺăłăłăăŠăŻăăĺŽçžŠăăžăăăĺă§ăŻăŞăĺśç´ăč¨čż°ăăăăăăźăĺ¤ăćă¤ĺż čŚăŻăăăžăăďźăăŽĺăŽĺ¤ć°ă厣č¨ă§ăăŞăăăďźă ă¤ăžăăăłăłăă¤ăŤćăŤăăŽăťăăăŽĺăă§ăăŻă使ç¨ăăŚăĺŻč˝ăŞĺăŽéăăăăťăăăĺăĺăé˘ć°ăä˝ćăăăă¨ăŻĺ°ăŞăă¨ăĺŻč˝ă§ăă
ăăĄăăăçžçśăŽăžăžă§ăŻăăăă§ćĺłăăăŚăăăŚăźăšăąăźăšă§ăŻč¨č¨ăŻĺŽéăŤăŻćŠč˝ăăžăăăčŤçĺăŻăĺşăŤăŞăĺăžăăŻăĄă˝ăăăŽăżăăŞăšăăăăăăăžă ĺşăéăăăŚăăžăă ăăăŚăăĄăăăä¸čŹçăŞčăćšă¨ăăŚăăä¸čŹçăŞďźăžăăŻçˇĺçăŞďźé˘ć°ăĺ¤ăă¤ăłăšăżăłăšĺă§ăăŞăăăăăăŞăĺśéăăăŚăăžăă ăăăăIMOăŻăĺč¨ăŽăŚăźăšăąăźăšăŽăăă¤ăăŤĺŻžĺŚăăăăăŽč¨č¨ăšăăźăšăăĺč¨ăżă¤ăčŞä˝ăŽă˘ă¤ăă˘ăăăăŻăăăŤĺ¤§ăăăă¨ă示ăăŚăăžăă ăăăăŁăŚăĺč¨ăŤă¤ăăŚčăăăă¨ăŻăçšĺŽăŽĺéĄă§ăŻăŞăăçšĺŽăŽč§ŁćąşçăŤĺşĺˇăăăă¨ăŤăŞăăžăă
ă¨ăăăă é˘ç˝ăă¨ćăŁăă ăă§ăă
@MeroviusăŻăĺč¨ĺăŽăăă¤ăăŽăŚăźăšăąăźăšăĺŚçă§ăăćć°ăŽćąç¨č¨č¨ăŤă¤ăăŚĺŞăăçšă示ăăŚăăžăă ăă¨ăă°ăăšăŹăăăŽĺĺă§ä˝żç¨ăăăăăŽé˘ć°ăŻćŹĄăŽă¨ăăă§ăă
func addOne(x int|float64) int|float64 {
switch x := x.(type) {
case int:
return x + 1
case float64:
return x + 1
}
}
ăŤăŞăăžăďź
contract intOrFloat64(T) {
T int, float64
}
func addOne(type T intOrFloat64) (x T) T {
return x + 1
}
ĺč¨ĺčŞä˝ăŤé˘ăăéăăă¸ă§ăăŞăăŻăćçľçăŤçé¸ăăĺ ´ĺăăăăăĺ°ĺ Ľăăăă¨ăŽĺŠçšăGoăŞăŠăŽĺç´ăŞč¨čŞăŽăłăšăăä¸ĺăăăŠăăăŤă¤ăăŚç§ăŻäťăăăăăăŤçăăăă§ăăăă
ăă ăăä˝ăăčĄăăăĺ ´ĺăćăĺç´ă§ćˇˇäšąăŽĺ°ăŞăă˝ăŞăĽăźăˇă§ăłIMOăŻă @ ianlancetaylorăŽăĺśéäťăă¤ăłăżăźăă§ă¤ăšăăŽă˘ă¤ăă˘ă§ăăăăăŻăçžĺ¨ăŽăĺśéăŞăăă¤ăłăżăźăă§ă¤ăšă¨ăžăŁăăĺăćšćłă§ĺŽčŁ ăăăžăăăćşčśłăăăă¨ăăă§ăăžăăăćĺŽăăăăżă¤ăăŤăăŁăŚă ĺŽéăă¸ă§ăăŞăăŻăăśă¤ăłăŽćŹăăăŞăźăăĺăĺşăăĺĺśç´ăă¤ăłăżăźăă§ă¤ăšăăăăŻăŽćĺăŽčĄăŤăăĺ ´ĺďź
type intOrFloat64 interface{ type int, float64 }
ăăŽĺ ´ĺăć°ăăăăźăŻăźăďź restrict
ďźăŻăžăŁăăĺż
čŚăŞăăăăăăăŻĺŽĺ
¨ăŞä¸ä˝äşćć§ăăăăžăă ăăă§ăă¤ăłăżăźăă§ă¤ăšăŤăĄă˝ăăăčż˝ĺ ăăăă¨ăŻă§ăăžăăăćĺŽăăăăăšăŚăŽăżă¤ăă§ăĄă˝ăăăăľăăźăăăăŚăăŞăĺ ´ĺăŻăăłăłăă¤ăŤćă¨ăŠăźăŤăŞăăžăă
ĺśéăăăă¤ăłăżăźăă§ă¤ăšăżă¤ăăŽĺ¤ć°ăŤĺ¤ăĺ˛ăĺ˝ăŚăăŽăŤăžăŁăăĺéĄăŻăăăžăăă RHSăŽĺ¤ăŽĺďźăžăăŻĺćĺŽăăăŚăăŞăăŞăăŠăŤăŽăăăŠăŤăăŽĺďźăăćĺŽăăăĺăŽ1ă¤ă¨ĺŽĺ ¨ăŤä¸č´ăăŞăăŁăĺ ´ĺăĺăŤăłăłăă¤ăŤăăăžăăă ă ăăç§ăăĄăŻćăŁăŚăăă§ăăăďź
var v1 intOrFloat64 = 1 // compiles, dynamic type int
var v2 intOrFloat64 = 1.0 // compiles, dynamic type float64
var v3 intOrFloat64 = 1 + 2i // doesn't compile, complex128 is not a specified type
ăżă¤ăăšă¤ăăăćĺŽăăăăżă¤ăă¨ä¸č´ăăŞăĺ ´ĺăŻăłăłăă¤ăŤćă¨ăŠăźăŤăŞăăçś˛çž ć§ăă§ăăŻăĺŽčŁ ăăăĺŻč˝ć§ăăăăžăă ăă ăăĺśéăăăă¤ăłăżăźăă§ă¤ăšĺ¤ăçžĺ¨ăŽăăăŤĺçĺăŽĺ¤ăŤĺ¤ćăăăŤăŻăĺă˘ăľăźăˇă§ăłăĺż čŚă§ăă
ăźăĺ¤ăŻăăăŽă˘ăăăźăă§ăŻĺéĄăŤăŞăăžăăďźăžăăŻăăăăăŤăăăäťćĽăŽä¸čŹçăŞă¤ăłăżăźăă§ă¤ăšăŽĺ ´ĺăťăŠĺéĄăŤăŻăŞăăžăăďźă ĺśéăăăă¤ăłăżăźăă§ă¤ăšăŽăźăĺ¤ăŻnil
ďźçžĺ¨ä˝ăĺŤăžăăŚăăŞăăă¨ăćĺłăăžăďźă§ăăăćĺŽăăăăżă¤ăăŻăăĄăăăĺ
é¨çăŤçŹčŞăŽăźăĺ¤ăćăĄă nil
nilableăżă¤ăăŽĺ ´ĺă
ĺ ăŤčż°ăšăăăăŤăăăăŻăăšăŚĺŽĺ ¨ăŤćŠč˝ăăŚăăăăăŤčŚăăžăăăăłăłăă¤ăŤćăŽĺŽĺ ¨ć§ăŻăăăăŤč¤éăŤăăă ăăŽäžĄĺ¤ăăăăžăăčŞĺăŽăăă°ăŠăăłă°ă§ĺč¨ĺăŽĺż čŚć§ăĺŽéăŤćăăăă¨ăăŞăăŽă§ăçĺăăăăžăă
IIUCă¸ă§ăăŞăăŻăŻĺçăżă¤ăă§ăŻăŞăăăăăăŽĺ ¨ä˝çăŞăă¤ăłăăŻćăçŤăĄăžăăă ăă ăăă¤ăłăżăźăă§ă¤ăšăăłăłăăŠăŻăă¨ăăŚćŠč˝ăăăă¨ă訹ĺŻăăăŚăăĺ ´ĺďźăăăŻçăăăă§ăďźăsumtypeăä˝ă§ăăăďźăăăăăăă§ăŻăŞăăďźďźă§ăăĺžšĺşçăŞăă§ăăŻă¨ĺćĺă解湺ăăžăăă
@ alanfo ă @ MeroviusăăĽăźăăăăă¨ăă ăăŽč°čŤăăăŽćšĺăŤĺăăŁăŚăăăŽăŻčĺłćˇąăăă¨ă§ăă
ç§ăŻăťăăŽä¸çŹčŚçšăĺ¤ăăăŽă弽ăă§ăďźăłăłăăŠăŻăăä¸č¨ăŽăżă¤ăĺśéă訹ĺŻăăăăŠăĄăźăżăźĺăăăă¤ăłăżăźăă§ăźăšă§ĺŽĺ ¨ăŤç˝Žăćăăăă¨ăă§ăăŞăççąăç解ăăăă¨ăăŚăăžăă çžćçšă§ăŻăăăŽăăăŞăĺč¨ăă¤ăłăżăźăă§ă¤ăšăżă¤ăăăĺč¨ăăżă¤ăă¨ăăŚä˝żç¨ăăă¨ăĺŻč˝ăŞĺçĺ¤ăă¤ăłăżăźăă§ă¤ăšăŤĺćăăăŚăăăżă¤ăăŤćŁç˘şăŤĺśéăăĺż čŚăăăăă¨ăé¤ăăŚăćčĄçăŞççąăŻăăăăžăăăĺăă¤ăłăżăźăă§ă¤ăšăăłăłăăŠăŻăä˝ç˝Žă§ä˝żç¨ăăăžăă-ă¤ăłăżăźăă§ă¤ăšăŽĺćĺăŻăĺççăŤćç¨ăŞä¸čŹçăŞĺśéă§ăăăăăŤăĺşăŤăŞăĺă¨ăăŚćŠč˝ăăĺż čŚăăăăžăă
@Goodwine
@MeroviusăĺĺăŽć稿ă§ć確ăŤčŞŹćăăŚăăăăăŤăă¸ă§ăăŞăăŻăŽč¨č¨ăĺč¨ĺă§ăăăăăă¨ăăšăŚăŤĺŻžĺŚăăăă¨ă示ĺăăŚăăžăăă§ăăă çšăŤăă¸ă§ăăŞăăŻăšăŤĺŻžăăŚććĄăăăĺĺśç´ăŻăçľăżčžźăżĺă¨ăăăăăć´žçăăĺăŽăżă寞蹥ă¨ăăŚăăžăă ĺč¨ăżă¤ăăŽčŚłçšăăăĺč
ăŻçăăăĺžč
ăŻĺşăăăžăă
ăă ăăă¸ă§ăăŞăăŻăšăŽč¨č¨ăŤăăăăłăłăă¤ăŠăźă埡ĺśăăéăăăăżă¤ăăŽăťăăă§ĺä˝ăăé˘ć°ăč¨čż°ă§ăăăăăŤăŞăăžăăăăăŻăçžćçšă§ăŻăžăŁăăĺŽčĄă§ăăŞăăă¨ă§ăă
ĺśéăăăă¤ăłăżăźăă§ă¤ăšăŤé˘ăăéăăăłăłăă¤ăŠăŻä˝żç¨ă§ăăćŁç˘şăŞĺăçĽăŁăŚăăăăătypeswitchăšăăźăăĄăłăă§ĺžšĺşçăŞăă§ăăŻăčĄăăă¨ăĺŻč˝ăŤăŞăăžăă
@Griesemer
ăăŠăăă¸ă§ăăŞăăŻč¨č¨ăăăĽăĄăłăăďźăăłăłăăŠăŻăăŽäťŁăăăŤă¤ăłăżăźăă§ă¤ăšă使ç¨ăăŞăççąăăŽăťăŻăˇă§ăłă§ďźă¸ă§ăăŞăăŻĺśç´ă襨çžăăăăăŤĺč ăăăĺŞăăć掾ă¨čŚăŞăăăççąăé常ăŤć確ăŤčŞŹćăăŚăăă¨ćăŁăăŽă§ăăăŞăăŽč¨ăăă¨ăŤć¸ćăăžăă
çšăŤăăłăłăăŠăŻăăŻăżă¤ăăăŠăĄăźăżéăŽé˘äżă襨ăăă¨ăă§ăăăăăĺż čŚăŞăłăłăăŠăŻăăŻ1ă¤ă ăă§ăă ăăŽăżă¤ăăăŠăĄăźăżăŽăăăăăăłăłăăŠăŻăăŤăŞăšăăăăŚăăăĄă˝ăăăŽăŹăˇăźăăżă¤ăă¨ăăŚä˝żç¨ă§ăăžăă
ăăŠăĄăźăżĺăăăŚăăăăŠăăăŤé˘äżăŞăăă¤ăłăżăźăă§ă¤ăšăŤă¤ăăŚăĺăăă¨ăŻč¨ăăžăăă ĺśç´ăăăĺ ´ĺăŻăăżă¤ăăăŠăĄăźăżăă¨ăŤĺĺĽăŽă¤ăłăżăźăă§ă¤ăšăĺż čŚăŤăŞăăžăă
ăăăŤăăăă°ăŠăăŽäžă示ăăăăŤä¸ĺŻč˝ă§ăŻăăăžăăăăă¤ăłăżăźăă§ă¤ăšă使ç¨ăăŚĺăăŠăĄăźăżéăŽé˘äżă襨çžăăăŽăăăĺäťăŤăŞăăžăă
ăă ăăă¤ăłăżăźăă§ă¤ăšăŤĺĺśç´ăčż˝ĺ ăăăăăăćąç¨ĺă¨ĺč¨ĺăŽä¸ĄćšăŽçŽçă§ä˝żç¨ăăăă¨ă§ăă1ă¤ăŽçłă§2çž˝ăŽéłĽă掺ăăăă¨ăă§ăăă¨čăăŚăăĺ ´ĺăŻăďźăăŞăăč¨ĺăăĺéĄăŻĺĽă¨ăăŚďźăăăćčĄçăŤĺŽçžĺŻč˝ă§ăăăă¨ăŻăăăăćŁăăă§ăăăă
ă¸ă§ăăŞăăŻăšăŤé˘ăăéăăă¤ăłăżăźăă§ă¤ăšăżă¤ăăŽĺśç´ăŤăéçľăżčžźăżăăżă¤ăăĺŤăăăă¨ăă§ăăăăŠăăăŻĺŽéăŤăŻĺéĄă§ăŻăŞăă¨ćăăžăăăăăăăćŁç˘şăŞăżă¤ăăŤĺśéăăćšćłăčŚă¤ăăĺż
čŚăăăăžăďźć´žçăżă¤ăăĺć§ă§ăŻăăăžăăďźăăăăăŁăŚăĺč¨ăżă¤ăăŤéŠăăŚăăžăă çžĺ¨ăŽăăźăŻăźăăŤĺşĺˇăăĺ ´ĺăŻăĺžč
ăŤconst type
ă使ç¨ăăăă¨ăă§ăăžăďźăžăăŻconst
ă ăă使ç¨ăăăă¨ăă§ăăžăďźă
@griesemerăăŠăĄăźăżĺăăăă¤ăłăżăźăă§ăźăšăżă¤ăăăłăłăăŠăŻăăŽç´ćĽăŽäťŁćżă§ăŻăŞăççąăŻăăă¤ăăăăžăă
ĺăăŠăĄăźăżăźăŻăäťăŽăăŠăĄăźăżăźĺăăăĺă¨ĺăă§ăă
ăŽăăăŞăżă¤ăă§
type C2(type T C1) interface { ... }
ăżă¤ăăăŠăĄăźăżT
ăŻăă¤ăłăżăźăă§ă¤ăščŞä˝ăŽĺ¤é¨ăŤĺĺ¨ăăžăă T
ă¨ăăŚć¸Ąăăăĺĺźć°ăŻăăłăłăăŠăŻăC1
ăćşăăăăăŤăă§ăŤčŞčăăăŚăăĺż
čŚăăăăă¤ăłăżăźăă§ă¤ăšăŽćŹä˝ăŻT
ăăăŤĺśç´ăăăă¨ăŻă§ăăžăăă ăăăŻăĺĽç´ăŤć¸Ąăăăçľćă¨ăăŚĺĽç´ăŽćŹä˝ăŤăăŁăŚĺśç´ăăăĺĽç´ăăŠăĄăźăżăźă¨ăŻç°ăŞăăžăă ăăăŻăé˘ć°ăŽĺĺăăŠăĄăźăżăźăăäťăŽĺăăŠăĄăźăżăźăŽĺśç´ăŤăăŠăĄăźăżăźă¨ăăŚć¸ĄăĺăŤăĺĺĽăŤĺśç´ăăĺż
čŚăăăăă¨ăćĺłăăžăă
ă¤ăłăżăźăă§ă¤ăšăŽćŹä˝ă§ăŹăˇăźăăźăżă¤ăăŤĺĺăäťăăćšćłăŻăăăžăăă
ă¤ăłăżăźăă§ăźăšă§ăŻă揥ăŽăăăŞăăŽăč¨čż°ă§ăăăăăŤăăĺż
čŚăăăăžăă
type C3(type U C1) interface(T) {
Add(T) T
}
ăăă§ă T
ăŻăŹăˇăźăăźăżă¤ăă示ăăžăă
ä¸é¨ăŽă¤ăłăżăźăă§ă¤ăšăżă¤ăăŻăä¸čŹçăŞĺśç´ă¨ăăŚăăčŞä˝ăćşăăăŞăă§ăăăă
ăŹăˇăźăăźăżă¤ăăŽč¤ć°ăŽĺ¤ăŤäžĺăăćä˝ăŻăĺçăăŁăšăăăă¨äşćć§ăăăăžăăă ăăăăŁăŚăăăăăŽćä˝ăŻă¤ăłăżăźăă§ă¤ăšĺ¤ă§ăŻä˝żç¨ă§ăăžăăă ăăăŻăă¤ăłăżăźăă§ă¤ăšăăăčŞä˝ăćşăăăŞăăă¨ăćĺłăăžăďźăă¨ăă°ăĺăă¤ăłăżăźăă§ă¤ăšăŤăăŁăŚĺśç´ăăăĺăăŠăĄăźăżă¸ăŽĺĺźć°ă¨ăăŚďźă ăăăŻéŠăăšăăă¨ă§ăă 1ă¤ăŽč§ŁćąşçăŻăăăŽăăăŞă¤ăłăżăźăă§ă¤ăšăŽă¤ăłăżăźăă§ă¤ăšĺ¤ăŽä˝ćăăžăŁăă訹ĺŻăăŞăăă¨ă§ăăăăăăŻă¨ăŤăăăăă§ćłĺŽăăăŚăăăŚăźăšăąăźăšă訹ĺŻăăžăăă
ĺşç¤ă¨ăŞăĺĺśç´ă¨ĺIDĺśç´ăĺşĺĽăăăă¨ăŤé˘ăăŚăŻăćŠč˝ăăĺŻč˝ć§ăŽăă1ă¤ăŽćšćłăăăăžăă 揥ăŽăăăŞăŤăšăżă ĺśç´ăĺŽçžŠă§ăăă¨ćłĺăăŚăă ăăă
contract (T) indenticalTo(U) {
*T *U
}
ďźăăă§ăŻăçşćăăă襨č¨ćłă使ç¨ăăŚăĺä¸ăŽĺăăăŹăˇăźăăźăă¨ăăŚćĺŽăăŚăăžăăăŹăˇăźăăźäťăăŽé˘ć°ăăăĄă˝ăăăă¨çşéłăăăăŽă¨ĺăăăăŤăć示çăŞăŹăˇăźăăźĺăćă¤ăłăłăăŠăŻăăăĺśç´ăă¨çşéłăăžăăăłăłăăŠăŻăĺăŽĺžăŽăăŠăĄăźăżăźăŻé常ăŽăżă¤ăăŽăăŠăĄăźăżăźă§ăăăĺśç´ăŽćŹä˝ăŽĺśç´ĺĽăŽĺˇŚĺ´ăŤčĄ¨ç¤şăăăă¨ăŻă§ăăžăăăďź
ăŞăăŠăŤăă¤ăłăżĺăŽĺşăŤăŞăĺăŻăăčŞä˝ă§ăăăăăăăŽĺśç´ăŻT
ăU
ă¨ĺä¸ă§ăăăă¨ăćĺłăăžăă ăăăŻĺśç´ă¨ăăŚĺŽŁč¨ăăăŚăăăăă (identicalTo(int)), (identicalTo(uint)), ...
ăĺśç´čŤçĺă¨ăăŚč¨čż°ă§ăăžăă
ăłăłăăŠăŻăăŻăă税ăŽĺč¨ăżă¤ăă襨çžăăăŽăŤĺ˝šçŤă¤ăăăăăžăăăăăăăă使ç¨ăăŚä¸čŹçăŞĺč¨ăżă¤ăă襨çžăăăă¨ăŻă§ăăŞăă¨ćăăžăă ăăŠăăăăčŚăăăŽăăăĺ ˇä˝çăŞăżă¤ăăăŞăšăăăĺż čŚăăăăăă揥ăŽăăăŞăăŽăć¸ăăă¨ăŻă§ăăžăăă
contract Foo(T, U) {
T U, int64
}
ćŞçĽăŽăżă¤ăă¨1ă¤äťĽä¸ăŽć˘çĽăŽăżă¤ăăŽä¸čŹçăŞĺč¨ăżă¤ăă襨çžăăĺż čŚăăăăŽăŻăŠăă§ăăă č¨č¨ă§ăăŽăăăŞć§ćă訹ĺŻăăăŚăăă¨ăăŚăă严ćšăŽăăŠăĄăźăżăźăäşĺŽä¸ĺăăăŽăŤăŞăăăă使ç¨ăăă¨ĺĽĺŚăŤčŚăăžăă
ă¤ăłăżăźăă§ă¤ăšăĺĺśç´ăĺŤăăăăŤćĄĺźľăăăăăśă¤ăłăŽăłăłăăŠăŻăă罎ăćăăăăăŤä˝żç¨ăăăĺ ´ĺăăăŠăăă¸ă§ăăŞăăŻăăśă¤ăłăăŠăŽăăăŤĺ¤ĺăăăăŤă¤ăăŚăăĺ°ăčăăŚăăžăăă
ç°ăŞăć°ăŽĺăăŠăĄăźăżăźăć¤č¨ăăĺ ´ĺăçśćłăĺćăăăŽăăăăăćăç°Ąĺă§ăă
ăăŠăĄăźăżăŞă
ĺ¤ĺăŞă ďźďź
1ă¤ăŽăăŠăĄăźăż
ăăă§ăŻĺŽéăŽĺéĄăŻăăăžăăă ďźéă¸ă§ăăŞăăŻăŞăăŽă¨ăŻĺŻžç §çăŤďźăăŠăĄăźăżăźĺăăăă¤ăłăżăźăă§ăźăšăŻăă¤ăłăżăźăă§ăźăšăă¤ăłăšăżăłăšĺăăăăăŤăăăčŞä˝ăĺç §ăăĺăăŠăĄăźăżăźăăăł/ăžăăŻäťăŽăăă¤ăăŽçŹçŤăăĺşĺŽĺăĺż čŚăŞĺ ´ĺăŤăŽăżĺż čŚăŤăŞăăžăă
2ă¤äťĽä¸ăŽăăŠăĄăźăżăź
ĺčż°ăŽăăăŤăĺśç´ăĺż čŚăŞĺ ´ĺăŻăĺăżă¤ăăăŠăĄăźăżăĺĺĽăŤĺśç´ăăĺż čŚăăăăžăă
ăăŠăĄăźăżĺăăăă¤ăłăżăźăă§ă¤ăšăŻă揥ăŽĺ ´ĺăŤăŽăżĺż čŚăŤăŞăăžăă
typeăăŠăĄăźăżăźăŻăăčŞä˝ăĺç §ăăžăăă
ă¤ăłăżăźăă§ă¤ăšăŻăăżă¤ăăăŠăĄăźăżăťăŻăˇă§ăłă§_ăă§ăŤĺŽŁč¨ăăăŚăă_ĺĽăŽăżă¤ăăăŠăĄăźăżăĺç §ăăŚăăžăăďźăăăăăăăă§ăăăŻăăŠăăŻăăăăŞăă§ăăăďźă
ă¤ăłăżăźăă§ă¤ăšăă¤ăłăšăżăłăšĺăăăŤăŻăäťăŽăăă¤ăăŽçŹçŤăăĺşĺŽăżă¤ăăĺż čŚă§ăăă
ăăăăŽăăĄďź2ďźăŻăă°ăŠăăŽäžăŽăăăŤç¸äşăŤĺç §ăăĺăăŠăĄăźăżăźăé¤ĺ¤ăăăăăĺŽéăŤăŻĺŻä¸ăŽĺäťăŞăąăźăšă§ăă ä¸ćšăćĺăŤăăăźăăăžăăŻăă¨ăă¸ăă厣č¨ăăăăŠăăăŤăăăăăăăăŽĺśç´ă¤ăłăżăźăă§ăźăšă§ăŻăăăä¸ćšăĺăăŠăĄăźăżăźă¨ăăŚć¸Ąăĺż čŚăăăăžăă
ăă ăăč¨č¨ăăăĽăĄăłăăŤç¤şăăăŚăăăăăŤăăăŠăĄăźăżĺăăăŚăăŞăďźčŞĺčŞčşŤăĺç §ăăŚăăŞăăăďźNodeInterfaceă¨EdgeInterfaceăăăăăŹăăŤă§ĺŽŁč¨ăăăă¨ă§ăăăăĺéżă§ăăžăă厣č¨ăŽé ĺşă 揥ăŤăăăăăŽă¤ăłăżăźăă§ă¤ăšă使ç¨ăăŚăGraphć§é ä˝ăŽĺăăŠăĄăźăżăźă¨ăăăŤé˘éŁăăăNewăăĄă˝ăăăŽĺăăŠăĄăźăżăźăĺśç´ă§ăăžăă
ă§ăăăăĺĽç´ăŽă˘ă¤ăă˘ăăăŁă¨čŻăă¨ăăŚăăăăăŤĺ ćă§ăăŞăĺéĄăăăăăăŤăŻčŚăăžăăă
ăăăăă comparable
ăŻăăłăłăăŠăŻăă§ăŻăŞăăçľăżčžźăżăŽă¤ăłăżăźăă§ăźăšăŤăŞăĺŻč˝ć§ăăăăžăă
ăăĄăăăă¤ăłăżăźăă§ăźăšăŻăăă§ăŤĺŻč˝ă§ăăăăăŤăç¸äşăŤĺăčžźăăă¨ăă§ăăžăă
ă¤ăłăżăźăă§ă¤ăšăĄă˝ăăăŽăŹăˇăźăăźăćĺŽă§ăăŞăăăăăă¤ăłăżăźăĄă˝ăăăŽĺéĄďźăłăłăăŠăŻăă§ăăăăćĺŽăăĺż čŚăăăĺ ´ĺďźăăŠăŽăăăŤĺŚçăăăăŻăăăăžăăă ăăăăăăă¤ăłăżăĄă˝ăăă示ăăăăŤăăăă¤ăăŽçšĺĽăŞć§ćďźăĄă˝ăăĺăŽĺăŤă˘ăšăżăŞăšăŻăäťăăăŞăŠďźăĺż čŚăŤăŞăăžăă
ăăă§@stevenblenkinsopăŽčŚłĺŻăŤçŽăĺăăă¨ăăăŠăĄăźăżăźĺăăăă¤ăłăżăźăă§ăźăšăçŹčŞăŽĺăăŠăĄăźăżăźăăžăŁăăĺśç´ă§ăăŞăĺ ´ĺă
ĺäşşçăŤăŻăä¸é¨ăŽă¤ăłăżăźăă§ă¤ăšăżă¤ăăä¸čŹçăŞĺśç´ă¨ăăŚăăčŞä˝ăćşăăăă¨ăă§ăăŞăăă¨ăŻéŠăăšăăă¨ă§ăŻăŞăă¨ćăăžăă ă¤ăłăżăźăă§ă¤ăšăżă¤ăăŻăŠăŽăăăŞĺ ´ĺă§ăćĺšăŞăŹăˇăźăăźăżă¤ăă§ăŻăŞăăăăăĄă˝ăăăćă¤ăă¨ăŻă§ăăžăăă
çľăżčžźăżé˘ć°ăŽsidentityToďźďźă¨ăăStevenăŽă˘ă¤ăă˘ăŻćŠč˝ăăžăăăĺč¨ĺăćĺŽăăăŽăŤćéăăăăĺŻč˝ć§ăăăăăăŤćăăăžăă ĺăŽčĄĺ ¨ä˝ăćŁç˘şă§ăăă¨ćĺŽă§ăăć§ćăćăžăăă§ăă
ăăĄăăă @ urandomăŻćŁăăă§ăăçžĺ¨ăă¸ă§ăăŞăăŻăăŠăăăĺĺ¨ăăăăăĺ ˇä˝çăŞďźçľăżčžźăżăžăăŻéç´çľăżčžźăżďźĺăŽăżăăŞăšăă§ăăžăă ăă ăăă¸ă§ăăŞăăŻĺă¨ĺč¨ĺăŽä¸ĄćšăŤĺśéäťăă¤ăłăżăźăă§ă¤ăšă䝣ăăăŤä˝żç¨ăăĺ ´ĺăŻăăăăćăăăŤĺ¤ć´ăăĺż čŚăăăăžăă ăăăăŁăŚăăăŽăăăŞăă¨ăçľąä¸ăăăç°ĺ˘ă§č¨ąĺŻăăăăă¨ăćé¤ăăă¤ăăăŻăăăžăăă
interface Foo(T) {
const type T, int64 // 'const' indicates types are exact i.e. no derived types
}
ăŞăç§ăăĄăŻă彟ăăŽä¸ĺ¨ăŽĺĽăŽćŁćŠăçşćăă䝣ăăăŤăč¨čŞăŤĺˇŽĺĽĺăăăéŁĺăĺăŤčż˝ĺ ăăăă¨ăă§ăăŞăăŽă§ăăďź
@griesemerć°äťăăŚăăăăăăăŞăăăć°äťăăŚăăŞăăăăăăžăăăăç§ăŻćĺăăă¤ăłăżăźăă§ăźăšă使ç¨ăăŚĺśç´ăćĺŽăăăă¨ăŤčłćăăŚăăžăă:)ăăŽć稿ă§ç§ăć辡ăăćŁç˘şăŞă˘ă¤ăă˘ăé˛ăăšăéă ă¨ăŻăăŻăćăăžăăďźçšăŤçŠäşăŞăăŹăźăżăźăŤĺŻžĺżăăăă¨ăăĺ§ăăăžăďźă ăăăŚăç§ăŻĺĽç´č¨č¨ăŽćć°ăŽĺ垊ăĺăŽăăŽăăăăŻăăăŤĺĽ˝ăă§ăă ăăăăä¸čŹçăŤăĺśç´ă¨ăăŚăŽďźăăăăćĄĺźľăăăďźă¤ăłăżăźăă§ăźăšăŻĺŽčĄĺŻč˝ă§ăăăć¤č¨ăă䞥ĺ¤ăăăăă¨ăŤĺŽĺ ¨ăŤĺćăăžăă
@urandom
ä¸čŹçăŞĺč¨ăżă¤ăăăăăă§čĄ¨çžă§ăăă¨ăŻćăăžăă
çš°ăčżăăŤăŞăăžăăăç§ăŽăă¤ăłăăŻăăăăă使ç¨ăăŚĺč¨ĺăä˝ćă§ăăăă§ăŻăŞăăăĺč¨ĺăăăăă使ç¨ăăŚč§Łćąşăăăăă¤ăăŽĺéĄă解湺ă§ăăăă¨ăăăă¨ă§ăăă ĺéĄăŽčŞŹćăăĺč¨ăżă¤ăăĺż čŚăă§ăăĺ ´ĺăĺč¨ăżă¤ăăĺŻä¸ăŽč§Łćąşçă§ăăăă¨ăŻéŠăăšăăă¨ă§ăŻăăăžăăă ăăŞăă彟ăă¨ä¸çˇăŤč§ŁćąşăăăĺéĄăŤçŚçšăĺăăăă°ă彟ăăŞăă§ă§ăăăăăăăŞăăă¨ăĺăŤčĄ¨çžăăăăŁăăŽă§ăă
@alanfo
ăăăŤăăăă°ăŠăăŽäžă示ăăăăŤä¸ĺŻč˝ă§ăŻăăăžăăăăă¤ăłăżăźăă§ă¤ăšă使ç¨ăăŚĺăăŠăĄăźăżéăŽé˘äżă襨çžăăăŽăăăĺäťăŤăŞăăžăă
ăăăăĄăŞăăăŻä¸ťčŚłçă ă¨ćăăžăă ĺäşşçăŤăŻăăăŠăĄăźăżăźĺăăăă¤ăłăżăźăă§ăźăšă使ç¨ăăćšăčŞçśă§ăăăă°ăŠăăŽäžăŻé常ăŤčŻăäžă ă¨ćăăžăă ç§ăŤă¨ăŁăŚăă°ăŠăăŻă¨ăłăăŁăăŁă§ăăăä¸ç¨ŽăŽă¨ăă¸ă¨ä¸ç¨ŽăŽăăźăăŽéăŽé˘äżă§ăŻăăăžăăă
ăăăăTBHăç§ăŻăăăăŽăŠăĄăăĺŽéăŤăŻĺ¤ăăĺ°ăŞăăĺäťă ă¨ăŻćăăžăă-ăăŞăăŻăťă¨ăăŠăžăŁăăĺăăă¨ă襨çžăăăăăŤăťă¨ăăŠăžăŁăăĺăăłăźăăć¸ăăžăă ăăăŚFWIWăăăăŤăŻĺ čĄćčĄăăăăžăă HaskellăŽĺăŻăŠăšăŻă¤ăłăżăźăă§ăźăšăŽăăăŤĺä˝ăăăăŽwikič¨äşăććăăŚăăăăăŤăăăŤăăăŠăĄăźăżăźĺăŻăŠăšă使ç¨ăăŚĺéăŽé˘äżă襨çžăăăă¨ăŻăăćŽéăŽăă¨ă§ăă
@stevenblenkinsop
ă¤ăłăżăźăă§ă¤ăšăŽćŹä˝ă§ăŹăˇăźăăźăżă¤ăăŤĺĺăäťăăćšćłăŻăăăžăăă
ăăŞăăăăăŤĺŻžĺŚăăćšćłăŻăusage-siteăŽtype-argumentsă§ăă NS
type Adder(type T) interface {
Add(t T) T
}
func Sum(type T Adder(T)) (vs []T) T {
var t T
for _, v := range vs {
t = t.Add(v)
}
return t
}
ăăăŤăŻăčŞĺˇąĺç §ĺăăŠăĄăźăżăźă訹ĺŻă§ăăăăăŤăçľąĺăăŠăŽăăăŤćŠč˝ăăăăŤă¤ăăŚćł¨ćăĺż čŚă§ăăăćŠč˝ăăăăă¨ăă§ăăă¨ćăăžăă
ăăŞăăŽ1.ă¨3.ç§ăŻćŹĺ˝ăŤç解ăăŚăăžăăăç§ăŻčŞăăŞăăă°ăŞăăžăăă ç§ăŻăăă¤ăăŽĺ ˇä˝çăŞäžăăĺŠçăĺžăă§ăăăă
ă¨ăŤăăăăăŽč°čŤăçśăăăă¨ăŽçľăăăŤăăăč˝ă¨ăăă¨ăŻĺ°ăä¸čŞ ĺŽă§ăăăăăăăăŻăăăăă¸ă§ăăŞăăŻăăśă¤ăłăŽç´°é¨ăéăăŚčŠąăăŽăŤćŁăăĺéĄă§ăŻăăăžăăă ăăŽĺéĄăŽăăśă¤ăłăšăăźăšăĺ°ăĺşăăăăăŤăăăĺăä¸ăăă ăă§ă:)ć°ăăă˘ă¤ăă˘ăĺč¨ăżă¤ăăŤé˘ăăč°čŤăŤćăĄčžźăžăăŚăăăă°ăăçľăŁăăăăŤćăăăăă§ăă
```go switch task { case tasks.SearchAdd: // task is tasks.SearchAdd in this scope case tasks.SearchUpdate: case tasks.SearchDelete: }
Goăçžĺ¨ăŽçść ă§č¨ąĺŻăăŚăăäťăŽăŠăŽă˘ăăăźăăăăă粞çĽçăŤăŻăŻăăăŤGoishăŤăŞăăžăă ăăšăąăŤăŞăăˇăĽăŽăăżăźăłăăăăłă°ăŻĺż čŚăăăžăăăçšĺŽăŽăżă¤ăăžă§ăŽăŚă¤ăšăăă¤ăăłă°ă§ĺĺă§ăă
ăżăšăŻĺ¤ć°ăŽćĺłăćä˝ăăăă¨ăŻă訹厚ă§ăăăăŽăŽăčŻăčăă§ăŻăŞăă¨ćăăžăăăăă§ăŻă訪ĺč ăŽçăăăé ĺźľăŁăŚăă ăăă
Goă§ăŻăăżăźăłăăăăłă°ăă§ăăŞăă¨ćăăŽăŻăŞăă§ăăďź ăăăăłăăăăłă°ăŽäžăăŞăĺ ´ĺăŻăăă¨ăă°Rustăĺç §ăăŚăă ăăă
@Merovius reďźăç§ăŤă¨ăŁăŚăă°ăŠăăŻă¨ăłăăŁăăŁă§ăă
ăăăŻăłăłăă¤ăŤćăŽă¨ăłăăŁăăŁă§ăăăăăă¨ăĺŽčĄćăŤčĄ¨çžăăăăžăăďź ăłăłăăŠăŻăă¨ă¤ăłăżăźăă§ă¤ăšăŽä¸ťăŞéăăŽ1ă¤ăŻăă¤ăłăżăźăă§ă¤ăšăăŠăłăżă¤ă ăŞăă¸ă§ăŻăă§ăăă¨ăăăă¨ă§ăă ăŹăăźă¸ăłăŹăŻăˇă§ăłăŤĺĺ ăăäťăŽăŠăłăżă¤ă ăŞăă¸ă§ăŻăă¸ăŽăă¤ăłăżăŞăŠăćăŁăŚăăžăă ăłăłăăŠăŻăăăă¤ăłăżăźăă§ă¤ăšă¸ăŽĺ¤ćăŻăĺŤăžăăăăźă/é çšă¸ăŽăă¤ăłăżăźďźăăă¤ă§ăăďźďźăćă¤ć°ăăä¸ćăŠăłăżă¤ă ăŞăă¸ă§ăŻăăĺ°ĺ Ľăăăă¨ăćĺłăăžăăăăăŻăă°ăŠăé˘ć°ăŽăłăŹăŻăˇă§ăłăăăĺ ´ĺăŻĺäťăŤćăăžăăé˘ć°ăŽăăźăşăŤĺżăăŚăă°ăŠăăŽăăžăăžăŞé¨ĺăçŹčŞăŽćšćłă§ćăăăŠăĄăźăżăźăĺĺžăăžăă
ăă°ăŠăăăŻăŞăă¸ă§ăŻăăŽăăăŤčŚăăăłăłăăŠăŻăăŻĺŽéăŤăŻçšĺŽăŽăľăă°ăŠăăćĺŽăăŚăăŞăăăăăłăłăăŠăŻăăŤăă°ăŠăăă使ç¨ăăă¨ç´ćă誤解ăăăĺŻč˝ć§ăăăăžăă ăăăŻăć°ĺŚăćłĺžăŽĺ ´ĺă¨ĺć§ăŤăĺžă§ä˝żç¨ăăä¸éŁăŽç¨čŞăĺŽçžŠăăăăăŞăăŽă§ăă ĺ ´ĺăŤăăŁăŚăŻăă°ăŠăăłăłăăŠăŻăă¨ă°ăŠăă¤ăłăżăźăă§ă¤ăšăŽä¸Ąćšăĺż čŚăŤăŞăăă¨ăăăăăăŽçľćă迡ćăŞĺĺăŽčĄçŞăçşçăăžăă ă§ăăé ăŽăŚăŁăşăăăăă䝼ä¸ăŽĺĺăŻćăă¤ăăŞăă
ĺŻžç §çăŤăčĺĽăăăĺ ąç¨ä˝ăŻăŠăłăżă¤ă ăŞăă¸ă§ăŻăă§ăă ĺŽčŁ ăĺśç´ăăăă¨ăŻăăăžăăăăăăăăŽé ĺăăŠăŽăăăŞăăŽăăčăăĺż čŚăăăăžăă Né çŽăŽé ĺăŤăŻNĺăŽčĺĽĺă¨NĺăŽĺ¤ăĺż čŚă§ăăăăăžăăžăŞćšćłă§ĺŽčĄă§ăăžăă ďźJuliaăŤăŻčĺłćˇąă襨çžăăăăčĺĽĺă¨ĺ¤ăĺĽă ăŽé ĺăŤé 罎ăăăă¨ăăăăžăăďź
interface{}
ăšăăźă ă使ç¨ăăŚăçžĺ¨čłăćă§çşçăăŚăăă¨ăŠăźăŽĺć¸ăććĄăăžăăă |
ćźçŽĺăŽéŁçśĺ
Ľĺăĺé¤ăăăŤăŻă揥ăŽăă¨ăăĺ§ăăăžăă
type foobar union {
int
float64
}
ĺ¤ăăŽinterface{}
ăăăŽç¨ŽăŽĺĺŽĺ
¨ć§ăŤç˝Žăćăăă¨ăăăŚăźăšăąăźăšă ăă§ăăăŠă¤ăăŠăŞăŤă¨ăŁăŚĺ¤§ăăŞăĄăŞăăăŤăŞăăžăă ćĺˇăŠă¤ăăŠăŞăŽĺĺăčŚăă ăă§ăăă使ç¨ă§ăăžăă
揥ăŽăăăŞĺéĄďźăăă ecdsa.PrivateKey
ă§ăŻăŞă*ecdsa.PrivateKey
-ăăăŻăecdsa.PrivateKeyăŽăżăăľăăźăăăăŚăăă¨ăăä¸čŹçăŞă¨ăŠăźă§ăă ăăăăć確ăŞĺ
ąç¨ä˝ĺă§ăŞăăă°ăŞăăŞăă¨ăăĺç´ăŞäşĺŽăŻăĺăŽĺŽĺ
¨ć§ăăăŞăĺä¸ăăăă§ăăăă
ăăŽććĄăŻint|float64
ă¨ćŻčźăăŚăăĺ¤ăăŽ_ăšăăźăš_ăĺ ćăăžăăăăŚăźăśăźăŻăăăŤă¤ăăŚčăăĺż
čŚăăăăžăă ăłăźăăăźăšăăăăŻăŞăźăłăŤäżă¤ă
interface{}
ăšăăźă ă使ç¨ăăŚăçžĺ¨čłăćă§çşçăăŚăăă¨ăŠăźăŽĺć¸ăććĄăăžăăă|
ćźçŽĺăŽéŁçśĺ Ľĺăĺé¤ăăăŤăŻă揥ăŽăă¨ăăĺ§ăăăžăătype foobar union { int float64 }
ĺ¤ăăŽ
interface{}
ăăăŽç¨ŽăŽĺĺŽĺ ¨ć§ăŤç˝Žăćăăă¨ăăăŚăźăšăąăźăšă ăă§ăăăŠă¤ăăŠăŞăŤă¨ăŁăŚĺ¤§ăăŞăĄăŞăăăŤăŞăăžăă ćĺˇăŠă¤ăăŠăŞăŽĺĺăčŚăă ăă§ăăă使ç¨ă§ăăžăă揥ăŽăăăŞĺéĄďźăăă
ecdsa.PrivateKey
ă§ăŻăŞă*ecdsa.PrivateKey
-ăăăŻăecdsa.PrivateKeyăŽăżăăľăăźăăăăŚăăă¨ăăä¸čŹçăŞă¨ăŠăźă§ăă ăăăăć確ăŞĺ ąç¨ä˝ĺă§ăŞăăă°ăŞăăŞăă¨ăăĺç´ăŞäşĺŽăŻăĺăŽĺŽĺ ¨ć§ăăăŞăĺä¸ăăăă§ăăăăăăŽććĄăŻ
int|float64
ă¨ćŻčźăăŚăăĺ¤ăăŽ_ăšăăźăš_ăĺ ćăăžăăăăŚăźăśăźăŻăăăŤă¤ăăŚčăăĺż čŚăăăăžăă ăłăźăăăźăšăăăăŻăŞăźăłăŤäżă¤ă
ăăďźăłăĄăłăďźăčŚăŚăă ăăăăăăŻç§ăŽććĄă§ăă
ĺŽéăç§ăăĄăŻä¸ĄćšăŽă˘ă¤ăă˘ăč¨čŞăŤĺ°ĺ Ľăăăă¨ăă§ăăžăă ăăăŤăăăADTăĺŽčĄăăăăăŽ2ă¤ăŽăă¤ăăŁăăŞćšćłăĺĺ¨ăăžăăăć§ćăŻç°ăŞăăžăă
ćŠč˝ăçšăŤăăżăźăłăăăăłă°ăŤă¤ăăŚăŽç§ăŽććĄăŻăĺ¤ăăłăźăăăźăšăŽćŠč˝ăăĺŠçăĺžăäşćć§ă¨č˝ĺăŤă¤ăăŚă§ăă
ăăăăăăéăăŽăăăŤčŚăăžăăă
ăžăăĺč¨ăżă¤ăăŻăăăăŠăŤăĺ¤ă¨ăăŚnil
ăćă¤ăăăŤăăăă¨ăă§ăăžăă ăăĄăăăăăšăŚăŽăšă¤ăăă§nil
ăąăźăšăĺż
čŚăŤăŞăăžăă
ăăżăźăłăăăăłă°ăŻćŹĄăŽăăăŤĺŽčĄă§ăăžăă
- 厣č¨
type U enum{
A(int64),
B(string),
}
-ăăăăłă°
...
var a U
...
switch a {
case A{b}:
//process b here
case B{b}:
//...
case nil:
//...
}
...
ăăżăźăłăăăăłă°ăć°ăŤĺ ĽăăŞăĺ ´ĺăŻăä¸č¨ăŽsirkonăŽććĄăĺç §ăăŚăă ăăă
ăžăăĺč¨ăżă¤ăăŻăăăăŠăŤăĺ¤ă¨ăăŚ
nil
ăćă¤ăăăŤăăăă¨ăă§ăăžăă ăăĄăăăăăšăŚăŽăšă¤ăăă§nil
ăąăźăšăĺż čŚăŤăŞăăžăă
ăłăłăă¤ăŤćăŤéĺ§ăăăŚăăŞăĺ¤ăçŚć˘ăăćšăç°Ąĺă§ăŻăŞăă§ăăăăă ĺćĺăăăĺ¤ăĺż čŚăŞĺ ´ĺăŻăăăăĺč¨ăżă¤ăăŤčż˝ĺ ă§ăăžăă
type U enum {
None
A(string)
B(uint64)
}
...
var a U.None
...
switch a {
case U.None: ...
case U.A(str): ...
case U.B(i): ...
}
ăžăăĺč¨ăżă¤ăăŻăăăăŠăŤăĺ¤ă¨ăăŚ
nil
ăćă¤ăăăŤăăăă¨ăă§ăăžăă ăăĄăăăăăšăŚăŽăšă¤ăăă§nil
ăąăźăšăĺż čŚăŤăŞăăžăăăłăłăă¤ăŤćăŤéĺ§ăăăŚăăŞăĺ¤ăçŚć˘ăăćšăç°Ąĺă§ăŻăŞăă§ăăăăă ĺćĺăăăĺ¤ăĺż čŚăŞĺ ´ĺăŻăăăăĺč¨ăżă¤ăăŤčż˝ĺ ă§ăăžăă
ć˘ĺăŽăłăźăăĺŁăăžăă
ăžăăĺč¨ăżă¤ăăŻăăăăŠăŤăĺ¤ă¨ăăŚ
nil
ăćă¤ăăăŤăăăă¨ăă§ăăžăă ăăĄăăăăăšăŚăŽăšă¤ăăă§nil
ăąăźăšăĺż čŚăŤăŞăăžăăăłăłăă¤ăŤćăŤéĺ§ăăăŚăăŞăĺ¤ăçŚć˘ăăćšăç°Ąĺă§ăŻăŞăă§ăăăăă ĺćĺăăăĺ¤ăĺż čŚăŞĺ ´ĺăŻăăăăĺč¨ăżă¤ăăŤčż˝ĺ ă§ăăžăă
ć˘ĺăŽăłăźăăĺŁăăžăă
ĺč¨ĺăŽć˘ĺăŽăłăźăăŻăăăžăăă ăăăŠăŤăĺ¤ăŻĺčŞä˝ă§ĺŽçžŠăăăăăŽă§ăŞăăă°ăŞăăŞăă¨ćăăžăăă ćĺăŽă¨ăłăăŞăăžăăŻćĺăŽă˘ăŤăăĄăăăé ăăžăăŻä˝ăă
ĺč¨ĺăŽć˘ĺăŽăłăźăăŻăăăžăăă ăăăŠăŤăĺ¤ăŻĺčŞä˝ă§ĺŽçžŠăăăăăŽă§ăŞăăă°ăŞăăŞăă¨ćăăžăăă ćĺăŽă¨ăłăăŞăăžăăŻćĺăŽă˘ăŤăăĄăăăé ăăžăăŻä˝ăă
ç§ăŻćĺăŽčăă§ăăŞăăŤĺćăăžăăăăăăă¤ăăŽĺçăŽĺžăĺ ąç¨ä˝ăŽć°ăăäşç´ĺăŻäťĽĺăŤăăă¤ăăŽăłăźăăăźăšďźĺ ąç¨ä˝ăĺćĺăŞăŠďźă§ä˝żç¨ăăăŚăăĺŻč˝ć§ăăăăžă
nilăăă§ăăŻăă瞊ĺăŻă使ç¨ăăăŽăé常ăŤé˘ĺă ă¨ćăăžăă
Go2.0ă§ăă解湺ă§ăăŞăăŁăä¸ä˝äşćć§ăŽé大ăŞĺ¤ć´ăŽăăă§ă
ĺč¨ĺăŽć˘ĺăŽăłăźăăŻăăăžăăă ăăăŠăŤăĺ¤ăŻĺčŞä˝ă§ĺŽçžŠăăăăăŽă§ăŞăăă°ăŞăăŞăă¨ćăăžăăă ćĺăŽă¨ăłăăŞăăžăăŻćĺăŽă˘ăŤăăĄăăăé ăăžăăŻä˝ăă
ăăăăăăšăŚăăźăăŤăăć˘ĺăŽgoăłăźăăŻăăăăăăăžăă ăăăŻééăăŞăĺ¤ĺăĺŁăăă¨ăŤăŞăăžăă ăăăŤćŞăăă¨ăŤăgofixăĺć§ăŽăăźăŤăŻăĺ¤ć°ăŽĺăďźĺăĺăŽďźOptionsăŤĺ¤ć´ăăăă¨ăăă§ăăăĺ°ăŞăă¨ăéăăłăźăăçćăăžăăäťăŽăăšăŚăŽĺ ´ĺăŻăĺăŤä¸çăŽăăšăŚăĺŁăăŚăăžăăžăă
äťăŤä˝ăăŞăĺ ´ĺăŻă reflect.ZeroăŻä˝ăăčżăĺż čŚăăăăžăă ăăăăăăăăŻăăšăŚč§Łćąşă§ăăćčĄçăŞăăźăăŤă§ăăăă¨ăă°ăĺč¨ăżă¤ăăŽăźăĺ¤ăć確ăŤĺŽçžŠăăăŚăăĺ ´ĺăăăŽăăźăăŤăŻé常ăŤćç˝ă§ăăăăăă§ăŞăĺ ´ĺăŻăăăăăăăăăŻăăŤăŞăăžăă ăă大ăăŞĺéĄăŻăăŞăçšĺŽăŽé¸ćăćŁăăé¸ćă§ăăăŽăăăăăŚăŠăŽé¸ćăč¨čŞĺ ¨ä˝ăŤéŠĺăăăăŠăăăăăăŚăŠăŽăăăŤéŠĺăăăŽăă¨ăăăă¨ă§ăă IMOăăăăăŤĺŻžĺŚăăćĺăŽćšćłăŻăĺč¨ĺăçšĺŽăŽĺéĄăŤĺŻžĺŚăăĺ ˇä˝çăŞăąăźăšăăžăăŻăăăăŽćŹ ĺŚăŤăăŁăŚä˝ćăăăĺéĄăŤă¤ăăŚčŠąăăă¨ă§ăă çľé¨ăŹăăźăăŽ
çšăŤăăăźăĺ¤ăăăŁăŚăŻăŞăăăĺćĺăăăŚăăŞăĺ¤ăŽä˝ćăçŚć˘ăăĺż čŚăăăăă¨ăăăăŠăŤăăŻćĺăŽă¨ăłăăŞă§ăăĺż čŚăăăăăŽä¸Ąćšăä¸č¨ă§ä˝ĺşŚăč¨ĺăăăŚăăăă¨ăŤćł¨ćăăŚăă ăăă ăăăăŁăŚăăăŽăăăŤăăšăă ă¨ćăăăăăă¨ăĺŽéăŤăŻć°ăăć ĺ ąăčż˝ĺ ăăŞăă¨ćăăăŠăăă ăăăăăăăŻăă§ăŤĺˇ¨ĺ¤§ăŞăšăŹăăăăăăŤéˇăăăĺ°ćĽçăŤăăŽä¸ăŽé˘éŁć ĺ ąăčŚă¤ăăăŽăéŁăăăăžăă
ăŞăăŹăŻăăčăăŚăżăžăăăă ăăăŠăŤăăŽintĺ¤ă0ă§ăăInvalidKindăăăăžăăreflect.Kindăĺăĺ Ľăăé˘ć°ăăăăăăŽăżă¤ăăŽĺćĺăăăŚăăŞăĺ¤ć°ă渥ăăĺ ´ĺăăăăŻçĄĺšăŤăŞăăžăă ăreflect.Kindă䝎ćłçăŤĺč¨ăżă¤ăăŤĺ¤ć´ă§ăăĺ ´ĺăŻănilĺ¤ăŤäžĺăăăŽă§ăŻăŞăăĺĺäťăăŽçĄĺšăŞă¨ăłăăŞăăăăŠăŤăă¨ăăŚćă¤ĺä˝ăäżćăăĺż čŚăăăăžăă
ăăă§ăŻăhtml /template.contentTypeăŤă¤ăăŚčăăŚăżăžăăăă ăăŹăźăłăżă¤ăăŻăăăŠăŤăĺ¤ă§ăăăăăŠăźăŤăăăŻă§ăăăăăstringifyé˘ć°ăŤăăŁăŚĺŽéăŤăăŽăăăŤćąăăăžăă 䝎ăŽĺč¨ăŽĺ°ćĽă§ăŻăăăŽĺä˝ăĺż čŚăŤăŞăă ăă§ăŞăănilăŻăăŽăżă¤ăăŽăŚăźăśăźăŤă¨ăŁăŚä˝ăŽćĺłăăŞăăăănilĺ¤ă使ç¨ăăăă¨ăä¸ĺŻč˝ă§ăă ăăă§ăŻĺ¸¸ăŤĺĺäťăăŽĺ¤ăčżăăă¨ăăťăźĺż é ă§ăăăăăŽĺ¤ăăŠăăăăšăăăŤă¤ăăŚăŽć確ăŞăăăŠăŤăăăăăžăă
䝣ć°/ĺŻĺ¤ĺĺźć°/ĺč¨/äťťćăŽăăźăżĺăăăžăćŠč˝ăăĺĽăŽäžă§ĺăłç§ă§ăă
ăăŽăăăăăŠăłăśăŻăˇă§ăłăŞăă§noSQLăăźăżăăźăšă使ç¨ăăŚăăžăďźĺćŁăˇăšăă ăăăŠăłăśăŻăˇă§ăłăŻćŠč˝ăăžăăďźăăćăăăŞççąă§ăăźăżăŽć´ĺć§ă¨ä¸č˛Ťć§ă大弽ăă§ăăăé常ăŻĺä¸ăŽćĄäťśäťăć´ć°ăŻă¨ăŞă§ĺ°ăč¤éăŞćĄäťśäťăć´ć°ăŻă¨ăŞă使ç¨ăăŚăĺćă˘ăŻăťăšăŽĺéĄăĺéżăăĺż čŚăăăăžăăŹăłăźăďźĺä¸ăŹăłăźăăŽć¸ăčžźăżăŻă˘ăăăăŻă§ăďźă
ćżĺ Ľăčż˝ĺ ăăžăăŻĺé¤ă§ăăă¨ăłăăŁăăŁăŽăťăăăä˝ćăăć°ăăăżăšăŻăăăăžăďźăăăăŽćä˝ăŽ1ă¤ăŽăżďźă
ç§ăăĄă揥ăŽăăăŞăăŽăćă¤ăă¨ăă§ăăă°
type EntityOp oneof {
Insert Reference
NewState string
Delete struct{}
}
ćšćłăŻăă ăăăăăžăă
type DB interface {
âŚ
Capture(ctx context.Context, processID string, ops map[string]EntityOp) (bool, error)
}
ĺč¨ćéăŽç´ ć´ăăă使ç¨ćłăŽ1ă¤ăŻăASTă§ăăźăă襨ăăă¨ă§ăă ăă1ă¤ăŻă nil
ăăłăłăă¤ăŤćăŤăă§ăăŻăăăoption
ăŤç˝Žăćăăăă¨ă§ăă
@DemiMarieă§ăăăäťćĽăŽGoă§ăŻăăăŽĺč¨ănilăŤăăăă¨ăă§ăăžăăä¸č¨ă§ććĄăăăăăŤănilăĺĺćĺăŽăăŞă˘ăłăăŤăăăă¨ăă§ăăžăăĺăšă¤ăăăŤăąăźăšnilăăăăžăăăăăŽçžŠĺăŻăăăťăŠćŞăăăăžăăăć˘ĺăŽăăšăŚăŽgoăłăźăăĺŁăăăŤăăŽćŠč˝ăĺż čŚă§ăďźçžĺ¨ăăăšăŚăĺćă§ăăžăďź
ăăăăăăŤĺąăăŚăăăăŠăăăŻăăăăžăăăăăăăŻăăšăŚTypescriptăŽăžăžă§ăăăăăŤăŻăăćĺĺăŞăăŠăŤăżă¤ăăă¨ĺźă°ăăé常ăŤĺŞăăćŠč˝ăăăă揥ăŽăă¨ăă§ăăžăă
var name: "Peter" | "Consuela"; // string type with compile-time constraint
ăăăŻćĺĺĺćĺăŽăăăŞăăŽă§ăç§ăŽćčŚă§ăŻĺžćĽăŽć°ĺ¤ĺćĺăăăăŻăăăŤĺŞăăŚăăžăă
@Merovius
ĺ
ˇä˝çăŞäžăŻăäťťćăŽJSONă使ç¨ăăăă¨ă§ăă
Rustă§ăŻćŹĄăŽăăăŤčĄ¨ăăă¨ăă§ăăžă
ĺćĺ¤{
ăăŤă
Boolďźboolďźă
ć°ďźć°ďźă
StringďźStringďźă
ArrayďźVec
ăŞăă¸ă§ăŻăďźăăă
}
2ă¤ăŽĺŠçšă¨ăăŚăŽĺ ąç¨ä˝ăżă¤ăďź
go vet
ăĺ
ąç¨ä˝ĺăŽčޤăŁă使ç¨ćłăăă§ăăŻă§ăăăăăŤăăć§ćăŤă¤ăăŚăŻăăżă¤ăă¨ă¤ăŞă˘ăšă¨ĺć§ăŤă䝼ä¸ăŻGo1ă¨äşćć§ăăăĺż čŚăăăăžăă
type Token = int | float64 | string
ĺ ąç¨ä˝ĺăŻăă¤ăłăżăźăă§ăźăšă¨ăăŚĺ é¨çăŤĺŽčŁ ă§ăăžăă éčŚăŞăŽăŻăĺ ąç¨ä˝ĺă使ç¨ăăă¨ăăłăźăăčŞăżăăăăŞăă揥ăŽăăăŞă¨ăŠăźăăăŁăăă§ăăăăăŤăŞăăă¨ă§ăă
var tok Token
switch t := tok.(type) {
case int:
// do something
}
ăăšăŚăŽToken
ăżă¤ăăăšă¤ăăă§ä˝żç¨ăăăŚăăăăă§ăŻăŞăăăăăłăłăă¤ăŠăŻă¨ăŠăźăçşçăăăĺż
čŚăăăăžăă
ăăăŤäź´ăĺéĄăŻăďźç§ăŽçĽăéăďźăă¤ăłăżăźĺďźăžăăŻstring
ăŞăŠăŽăă¤ăłăżăźăĺŤăĺďźă¨éăă¤ăłăżăźĺăä¸çˇăŤć źç´ăăćšćłăăŞăăă¨ă§ăă ăŹă¤ă˘ăŚăăç°ăŞăăżă¤ăă§ăćŠč˝ăăžăăă čŞçąăŤč¨ćŁăăŚăă ăăăăă ăăĺéĄăŻăăă¤ăłăżăźă¨ĺç´ăŞĺ¤ć°ăĺćăŤä˝żç¨ă§ăăĺ¤ć°ă§ăŻăćŁç˘şăŞGCăăăžăćŠč˝ăăŞăăă¨ă§ăă
interface{}
çžĺ¨čĄăŁăŚăăăăăŤăćéťăŽăăŻăˇăłă°ăŽéăé˛ăăă¨ăă§ăăžăă ăăăăăăăĺĺăŞĺŠçšăćäžăăă¨ăŻćăăžăă-ăăăŻăžă ć ĺ
ăŽă¤ăłăżăźăă§ă¤ăšăżă¤ăăŽăăăŤčŚăăžăă 䝣ăăăŤăăă税ăŽvet
ăă§ăăŻăéçşă§ăăăŽă§ăŻăŞăă§ăăăăă
ăŹăăźă¸ăłăŹăŻăżăźăŻăăŹă¤ă˘ăŚăăćąşĺŽăăăăăŤăŚăăŞăłăăăżă°ăăăăčŞăżĺăĺż čŚăăăăžăă ăăăŻä¸ĺŻč˝ă§ăŻăăăžăăăăgcăŽé庌ăä˝ä¸ăăăĺŻč˝ć§ăŽăăăŠăłăżă¤ă ă¸ăŽĺ¤§ăăŞĺ¤ć´ăŤăŞăăžăă
ăăśăăăă税ăŽçŁĺťăă§ăăŻă䝣ăăăŤéçşăăăă¨ăă§ăăžăăďź
ăŹăăźă¸ăłăŹăŻăżăźăŻăăŹă¤ă˘ăŚăăćąşĺŽăăăăăŤăŚăăŞăłăăăżă°ăăăăčŞăżĺăĺż čŚăăăăžăă
ăăăŻăă¤ăłăżăźăă§ă¤ăšăŤéăă¤ăłăżăĺŤăžăăĺŻč˝ć§ăăăĺ ´ĺăŤĺĺ¨ăăăŽă¨ăžăŁăăĺă獜äşă§ăă ăăŽăăśă¤ăłăŻć示çăŤăăé˘ăăžăăă
go-sumtype
ăŻăăăăăă§ăăăăăă¨ăă ăăăăĺăăăăąăźă¸ă§2ă¤ăŽĺ
ąç¨ä˝ĺăĺŽçžŠăăăŚăăĺ ´ĺăŻăŠăăŞăăžăăďź
ăłăłăă¤ăŠăźăŻăĺ ąç¨ä˝ĺăă¤ăłăżăźăă§ăźăšă¨ăăŚĺ é¨çăŤĺŽčŁ ă§ăăžăăăçľąä¸ăăăć§ćă¨ć¨ćşăŽĺăă§ăăŻăčż˝ĺ ăăžăă
ĺ ąç¨ä˝ăżă¤ăă使ç¨ăăăăă¸ă§ăŻăăNĺăăăăăăăăç°ăŞăăNăĺĺăŤĺ¤§ăăĺ ´ĺăŻă 1ă¤ăŽćšćłăĺ°ĺ Ľăăăă¨ăćĺăŽč§ŁćąşçăŤăŞăĺŻč˝ć§ăăăăžăă
ăăăăĺăăăăąăźă¸ă§2ă¤ăŽĺ ąç¨ä˝ĺăĺŽçžŠăăăŚăăĺ ´ĺăŻăŠăăŞăăžăăďź
ä˝ăăăăžăăăďź ăă¸ăăŻăŻăżă¤ăăă¨ă§ăăăăăăźăĄă˝ăăă使ç¨ăăŚĺŽčŁ č ăčŞčăăžăă ăăăźăĄă˝ăăăŤăŻç°ăŞăĺĺă使ç¨ăăă ăă§ăă
ĺăŹă¤ă˘ăŚăăćĺŽ@skybrian IIRCçžĺ¨ăŽăăăăăăăŻăçžĺ¨ăä¸ă¤ăŽĺ ´ćăŤäżĺăăăŚăăžăă ăŞăă¸ă§ăŻăăă¨ăŤăăŽăăăŞăăŽăčż˝ĺ ăăă¨ăĺ¤ăăŽă¸ăŁăłăăčż˝ĺ ăăăăăšăŚăŽăŞăăˇă§ăłăŽăŞăă¸ă§ăŻăăGCăŤăźăăŤăŞăăžăă
ăăăŤäź´ăĺéĄăŻăďźç§ăŽçĽăéăďźăă¤ăłăżĺďźăžăăŻćĺĺăŞăŠăŽăă¤ăłăżăĺŤăĺďźă¨éăă¤ăłăżĺăä¸çˇăŤć źç´ăăćšćłăăŞăăă¨ă§ăă
ăăăŻĺż čŚăŞăă¨ćăăžăă ăłăłăă¤ăŠăŻăăă¤ăłăżăăăăä¸č´ăăĺ ´ĺăŻĺăŽăŹă¤ă˘ăŚăăăŞăźăăźăŠăăăăĺŻč˝ć§ăăăăăăă§ăŞăĺ ´ĺăŻăŞăźăăźăŠăăăăžăăă ăăăăä¸č´ăăŞăĺ ´ĺăăăăăéŁçśăăŚăŹă¤ă˘ăŚăăăăăçžĺ¨ă¤ăłăżăźăă§ăźăšă§ä˝żç¨ăăăŚăăăă¤ăłăżăźă˘ăăăźăă使ç¨ăăăŽăŻčŞçąă§ăă ć§é ä˝ăĄăłăăźăŤééŁçśăŹă¤ă˘ăŚăă使ç¨ăăăă¨ăă§ăăžăă
ăăăăăăăĺĺăŞĺŠçšăćäžăăă¨ăŻćăăžăă-ăăăŻăžă ć ĺ ăŽă¤ăłăżăźăă§ă¤ăšăżă¤ăăŽăăăŤčŚăăžăă
ç§ăŽććĄă§ăŻăĺ ąç¨ä˝ĺăŻ_ćŁç˘şăŤ_ć ĺ ăŽăăă¤ăłăżăźăă§ăźăšĺă§ă-ĺ ąç¨ä˝ĺăŻăĺćĺăŽăťăăăŽăżăć źç´ă§ăăă¤ăłăżăźăă§ăźăšăŽăľăăťăăăŤăăăžăăă ăăăŤăăăăłăłăă¤ăŠăŻçšĺŽăŽăżă¤ăăťăăăŤĺŻžăăŚăăĺšççăŞăšăăŹăźă¸ćšćłăčŞçąăŤé¸ćă§ăăăăăŤăŞăĺŻč˝ć§ăăăăžăăăăăăŻĺŽčŁ ăŽčŠłç´°ă§ăăă丝ăŞĺćŠă§ăŻăăăžăăă
@ rogpeppe-弽ĺĽĺżăăăsumĺăç´ćĽä˝żç¨ă§ăăžăăăăăă¨ăä˝ăăčĄăăăăŤć˘çĽăŽĺăŤć示çăŤăăŁăšăăăĺż čŚăăăăžăăďź ĺ¸¸ăŤć˘çĽăŽăżă¤ăăŤăăŁăšăăăĺż čŚăăăĺ ´ĺăă¤ăłăżăźăă§ă¤ăšă§ăă§ăŤćäžăăăŚăăăăŽăăăăăăăăŠăŽăăăŞăĄăŞăăăăăăăăŽăćŹĺ˝ăŤăăăăžăăă ç§ăçŽăŤăă丝ăŞĺŠçšăŻăăłăłăă¤ăŤćăŽă¨ăŠăźăă§ăăŻă§ăăăăăŻăĺŽčĄćăŤă˘ăłăăźăˇăŁăŞăłă°ăĺźăçśăçşçăăăăă§ăăăăăŻăçĄĺšăŞĺă渥ăăăă¨ăăĺéĄăçşçăăĺŻč˝ć§ăéŤăăăă§ăă ăă1ă¤ăŽĺŠçšăŻăă¤ăłăżăźăă§ă¤ăšăăăĺśç´ăăăŚăăăă¨ă§ăăăăăŻăč¨čŞăŽĺ¤ć´ăäżč¨źăăăăŽă§ăŻăŞăă¨ćăăžăă
ĺăŤă§ăă
type FooType int | float64
func AddOne(foo FooType) FooType {
return foo + 1
}
// if this can be done, what happens here?
type FooType nil | int
func AddOne(foo FooType) FooType {
return foo + 1
}
ăăăă§ăăŞăĺ ´ĺăç§ăŻă¨ăŽéăăŻăăžăčŚăăăžăă
type FooType interface{}
func AddOne(foo FooType) (FooType, error) {
switch v := foo.(type) {
case int:
return v + 1, nil
case float64:
return v + 1.0, nil
}
return nil, fmt.Errorf("invalid type %T", foo)
}
// versus
type FooType int | float64
func AddOne(foo FooType) FooType {
switch v := foo.(type) {
case int:
return v + 1
case float64:
return v + 1.0
}
// assumes the compiler knows that there is no other type is
// valid and thus this should always returns a value
// Would the compiler error out on incomplete switch types?
}
@xibz
弽ĺĽĺżăăăsumĺăç´ćĽä˝żç¨ă§ăăžăăăăăă¨ăä˝ăăčĄăăăăŤć˘çĽăŽĺăŤć示çăŤăăŁăšăăăĺż čŚăăăăžăăďź ĺ¸¸ăŤć˘çĽăŽăżă¤ăăŤăăŁăšăăăĺż čŚăăăĺ ´ĺăă¤ăłăżăźăă§ă¤ăšă§ăă§ăŤćäžăăăŚăăăăŽăăăăăăăăŠăŽăăăŞăĄăŞăăăăăăăăŽăćŹĺ˝ăŤăăăăžăăă
@rogpeppe ăç§ăééăŁăŚăăĺ ´ĺăŻç§ăč¨ćŁăăŚăă ăăđ
常ăŤăăżăźăłăăăăłă°ăĺŽčĄăăĺż
čŚăăăăă¨ďźé˘ć°ĺăăă°ăŠăăłă°č¨čŞă§ĺč¨ĺăćä˝ăăă¨ăăŤăăăŁăšăăăĺźăłĺşăăăćšćłďźăŻăĺŽéăŤăŻĺč¨ĺă使ç¨ăăć大ăŽĺŠçšăŽ1ă¤ă§ăă ĺč¨ĺăŽăăšăŚăŽĺŻč˝ăŞĺ˝˘çśăć示çăŤĺŚçăăăăăŤéçşč
ăŤĺźˇĺśăăăă¨ăŻăéçşč
ăĺ¤ć°ăçšĺŽăŽĺă§ăăă¨čăăŚä˝żç¨ăăăŽăé˛ăćšćłă§ăăăĺŽéăŤăŻĺĽăŽĺă§ăă čŞĺźľăăăäžăŻăJavaScriptă§ăŻćŹĄăŽăăăŤăŞăăžăă
const a = "1" // string "1"
const b = a + 5 // string "15" and not number 6
ăăăă§ăăŞăĺ ´ĺăç§ăŻă¨ăŽéăăŻăăžăčŚăăăžăă
čŞĺă§ăăă¤ăăŽĺŠçšăčż°ăšăŚăăă¨ćăăžăăďź
â
ç§ăçŽăŤăă丝ăŞĺŠçšăŻăăłăłăă¤ăŤćăŽă¨ăŠăźăă§ăăŻă§ăăăăăŻăĺŽčĄćăŤă˘ăłăăźăˇăŁăŞăłă°ăĺźăçśăçşçăăăăă§ăăăăăŻăçĄĺšăŞĺă渥ăăăă¨ăăĺéĄăçşçăăĺŻč˝ć§ăéŤăăăă§ăă ăă1ă¤ăŽĺŠçšăŻăă¤ăłăżăźăă§ă¤ăšăăăĺśç´ăăăŚăăăă¨ă§ăăăăăŻăč¨čŞăŽĺ¤ć´ăäżč¨źăăăăŽă§ăŻăŞăă¨ćăăžăă
// Would the compiler error out on incomplete switch types?
é˘ć°ĺăăă°ăŠăăłă°č¨čŞăŽćŠč˝ăŤĺşăĽăăŚăăăăŻĺŻč˝ă§ć§ćĺŻč˝ă§ăăĺż čŚăăăă¨ćăăžăđ
@xibzăŻăăłăłăă¤ăŤćă¨ĺŽčĄćă§ĺŽčĄă§ăăăăăăăăŠăźăăłăšăĺä¸ăăžăăăă§ăăă°ăç§ăćťăŹ1ćĽĺăŤă¸ă§ăăŞăăŻăšăăăăžăă
@xibz
弽ĺĽĺżăăăsumĺăç´ćĽä˝żç¨ă§ăăžăăăăăă¨ăä˝ăăčĄăăăăŤć˘çĽăŽĺăŤć示çăŤăăŁăšăăăĺż čŚăăăăžăăďź
ăżă¤ăăŽăăšăŚăŽăĄăłăăźăăăŽăĄă˝ăăăĺ ąćăăŚăăĺ ´ĺăŻăăăŽăĄă˝ăăăĺźăłĺşăăă¨ăă§ăăžăă
int | float64
ăäžăŤă¨ăă¨ă揥ăŽçľćăŻăŠăăŞăăžăăă
var x int|float64 = int(2)
var y int|float64 = float64(0.5)
fmt.Println(x * y)
int
ăăfloat64
ă¸ăŽćéťăŽĺ¤ćăčĄăăžăăďź ăžăăŻfloat64
ăăint
ă ăăă¨ăăăăăŻăŤăŞăăžăăďź
ăăăăŁăŚăăťăźćŁăăă§ăăăťă¨ăăŠăŽĺ ´ĺă使ç¨ăăĺăŤăżă¤ăăă§ăăŻăăĺż čŚăăăăžăă ăăăŻéˇćă§ăăăçćă§ăŻăŞăă¨ćăăžăă
ă¨ăăă§ăĺŽčĄćăŽĺŠçšăŻéčŚăăăăăžăăă ĺăŽäžăçśăăăăăŤăĺ[](int|float64)
ăšăŠă¤ăšăŤăă¤ăłăżăĺŤăăĺż
čŚăŻăăăžăăăăăăŻăĺăŽăăšăŚăŽă¤ăłăšăżăłăšăć°ăă¤ăďźăăăăăé
罎ăŽĺśéăŤăă16ăă¤ăďźă§čĄ¨ăăă¨ăă§ăăăăă§ăăĺ ´ĺăŤăăŁăŚăŻăăăăŠăźăăłăšă大ĺš
ăŤĺä¸ăăžăă
ăťă¨ăăŠăŽĺ ´ĺă使ç¨ăăĺăŤăżă¤ăăă§ăăŻăăĺż čŚăăăăžăă ăăăŻéˇćă§ăăăçćă§ăŻăŞăă¨ćăăžăă
ç§ăŻăăăä¸ĺŠă§ăŻăŞăăă¨ăŤĺćăăžăă ç§ăŻăăăăă¤ăłăżăźăă§ăźăšă¨ăŻĺŻžç §çăŤăŠăŽăăăŞĺŠçšăăăăăăŽăăčŚăăă¨ăăŚăăžăă
ĺăŽăšăŠă¤ăšăŻăĺăŽăăšăŚăŽă¤ăłăšăżăłăšăć°ăă¤ăďźăăăăăé 罎ăŽĺśéăŤăă16ăă¤ăďźă§čĄ¨ăăă¨ăă§ăăăăăăă¤ăłăżăźăĺŤăăĺż čŚăŻăăăžăăăăăăŤăăăĺ ´ĺăŤăăŁăŚăŻăăăŠăźăăłăšăĺ¤§ĺš ăŤĺä¸ăăĺŻč˝ć§ăăăăžăă
ăăźăăç§ăŻăăăŽéčŚăŞé¨ĺăčłźĺ ĽăăăăŠăăăŻăăžăăăăăžăăă é常ăŤăžăăŞăąăźăšă§ăăăăĄă˘ăŞăľă¤ăşăĺĺăŤăŞăă¨ç˘şäżĄăăŚăăžăă ăăăŻč¨ăŁăŚăăçŻç´ăăăăĄă˘ăŞăŻč¨čŞăŽĺ¤ć´ăŤă¨ăŁăŚĺĺăŤéčŚă§ăŻăŞăă¨ćăăžăă
常ăŤăăżăźăłăăăăłă°ăĺŽčĄăăĺż čŚăăăăă¨ďźé˘ć°ĺăăă°ăŠăăłă°č¨čŞă§ĺč¨ĺăćä˝ăăă¨ăăŤăăăŁăšăăăĺźăłĺşăăăćšćłďźăŻăĺŽéăŤăŻĺč¨ĺă使ç¨ăăć大ăŽĺŠçšăŽ1ă¤ă§ăă
ăăăăă¤ăłăżăźăă§ăźăšă§ăžă ĺŚçăăăŚăăŞăč¨čŞăŤăŠăŽăăăŞĺŠçšăăăăžăăďź ăă¨ăă¨ç§ăŻĺŽĺ ¨ăŤĺč¨ĺăŤčĺłăăăăžăăăăăăăŤă¤ăăŚčăĺ§ăăă¨ăăç§ăŻăăăăăăăĺŠçăĺ°ă夹ăăžăăă
ă¨ăŻăăăsumĺă使ç¨ăăăă¨ă§ăăăăŻăŞăźăłă§čŞăżăăăăłăźăăćäžă§ăăăŽă§ăăă°ăç§ăŻ100ďź ăăăćăă§ăăžăă ăă ăăčŚăçŽăăăŻăă¤ăłăżăźăă§ă¤ăšăłăźăă¨ăťăźĺăăăăŤčŚăăžăă
@xibzăăżăźăłăăăăłă°ăŻăăăŞăźăŽč¤ć°ăŽăŹăăŤăŽćˇąăă調ăšăăăăŞăźăŚăŠăźăăłă°ăłăźăă§ĺ˝šçŤăĄăžăă ăżă¤ăăšă¤ăăă§ăŻăä¸ĺşŚăŤ1ăŹăăŤăă桹ăčŚăăŞăăăăăăšăăăĺż čŚăăăăžăă
ăăăŻĺ°ăä¸čŞçśă§ăăăăă¨ăă°ăĺźăŽć§ćăăŞăźăăăĺ ´ĺă2揥ćšç¨ĺźăŤä¸č´ăăăăŤăŻă揥ăŽăăăŤăăžăă
match Add(Add(Mult(Const(a), Power(Var(x), 2)), Mult(Const(b), Var(x))), Const(c)) {
// here a, b, c are bound to the constants and x is bound to the variable name.
// x must have been the same in both var expressions or it wouldn't match.
}
桹ăă1ăŹăăŤăăăŞăĺç´ăŞäžă§ăŻĺ¤§ăăŞéăăŻăăăžăăăăăăă§ăŻćˇąăă5ăŹăăŤăŤăŞăăăăăăšăăăăăżă¤ăăŽăšă¤ăăă使ç¨ăăăŽăŻé常ăŤč¤éăŤăŞăăžăă ăăżăźăłăăăăłă°ăĺăăč¨čŞăŻăăąăźăšăčŚéăăŞăăăăŤăăŞăăăč¤ć°ăŽăŹăăŤă桹ăćăä¸ăăăă¨ăă§ăăžăă
ăłăłăă¤ăŠăŽĺ¤ă§ăŠăă ăĺşăŚăăăăŻăăăăžăăăă
@xibz
ĺč¨ĺăŽĺŠçšăŻăăăŞăă¨ăłăłăă¤ăŠăŽä¸Ąćšăăĺč¨ĺ
ăŤĺĺ¨ă§ăăĺăćŁç˘şăŤçĽăŁăŚăăăă¨ă§ăă ăăăćŹčłŞçăŤéăă§ăă ă¤ăłăżăźăă§ăźăšă犺ăŽĺ ´ĺăăŚăźăśăźăäşćăăŞăăżă¤ăăćĺŽăăă¨ăăŤĺ垊ăăăă¨ăĺŻä¸ăŽçŽçă¨ăăăăŠăłăă常ăŤćă¤ăă¨ă§ăAPIă§ăŽčޤç¨ă常ăŤĺżé
ăăŚé˛ăĺż
čŚăăăăžăă
ĺč¨ĺăăłăłăă¤ăŠăŤĺŽčŁ
ăăăčŚčžźăżăŻăťă¨ăăŠăŞăăăăŤćăăăăŽă§ăĺ°ăŞăă¨ă//go:union A | B | C
ăăăŞć¨ćşăŽăłăĄăłăăăŁăŹăŻăăŁăăććĄăăă go vet
ăŤăăŁăŚăľăăźăăăăăă¨ăéĄăŁăŚăăžăă
ĺč¨ĺă厣č¨ăăć¨ćşçăŞćšćłă§ăŻăNĺš´ĺžăŤăăăă使ç¨ăăŚăăăăăąăźă¸ăŽć°ăçĽăăă¨ăă§ăăžăă
ăăŠă¤ăăźăăĄă˝ăăă¨ăăăăăŽĺŽčŁ ăĺăăă¤ăłăżăźăă§ă¤ăšăäťăăŚĺč¨ĺă¨ăăĽăŹăźăˇă§ăłăä˝ćăăăăăŽĺ°ăăŞăŚăźăăŁăŞăăŁăä˝ćăăžăăăăăăŻä¸é¨ăŽäşşăŤă¨ăŁăŚĺ˝šçŤă¤ĺ ´ĺăăăăžăďź https ďź
ă¸ă§ăăŞăăŻăšăŽćčżăŽč¨č¨ăăŠăăă§ăŻăăăăăĺč¨ăżă¤ăăăăăăŤé˘éŁäťăăăăĺŻč˝ć§ăăăăžăă
ăăŠăăăŽ1ă¤ăŻăăłăłăăŠăŻăăŽäťŁăăăŤă¤ăłăżăźăă§ă¤ăšă使ç¨ăăă¨ăăă˘ă¤ăă˘ă澎ăăłä¸ăăăăă¤ăłăżăźăă§ă¤ăšăŻăżă¤ăăŞăšăăăľăăźăăăĺż čŚăăăăžăă
type Foo interface {
int64, int32, int, uint, uint32, uint64
}
ăăčŞä˝ăŻăĄă˘ăŞăăăŻăăăăŚăăŞăłăçćăăžăăăăăăăăă¸ă§ăăŞăăŻé˘ć°ăžăăŻć§é ä˝ă§ä˝żç¨ăăĺ ´ĺăăăăŻăšĺăăăăĺ°ăŞăă¨ăĺăŽćéăŞăšăăĺŚçăăă¨ăăŤĺăŽĺŽĺ ¨ć§ăćäžăăžăă
ăăăŚăăăăăăăżă¤ăăšă¤ăăĺ ă§ăăăăŽçšĺŽăŽă¤ăłăżăźăă§ăźăšă使ç¨ăăăŤăŻăăăŽăăăŞăšă¤ăăăçś˛çž çă§ăăĺż čŚăăăăžăă
ăăăŻçćłçăŞçăć§ćă§ăŻăăăžăăăďźäžďź Foo | int32 | []Bar
ďźăä˝ăă§ăă
ă¸ă§ăăŞăăŻăšăŽćčżăŽč¨č¨ăăŠăăă§ăŻăăăăăĺč¨ăżă¤ăăăăăăŤé˘éŁäťăăăăĺŻč˝ć§ăăăăžăă
ăăŠăăăŽ1ă¤ăŻăăłăłăăŠăŻăăŽäťŁăăăŤă¤ăłăżăźăă§ă¤ăšă使ç¨ăăă¨ăăă˘ă¤ăă˘ă澎ăăłä¸ăăăăă¤ăłăżăźăă§ă¤ăšăŻăżă¤ăăŞăšăăăľăăźăăăĺż čŚăăăăžăă
type Foo interface { int64, int32, int, uint, uint32, uint64 }
ăăčŞä˝ăŻăĄă˘ăŞăăăŻăăăăŚăăŞăłăçćăăžăăăăăăăăă¸ă§ăăŞăăŻé˘ć°ăžăăŻć§é ä˝ă§ä˝żç¨ăăĺ ´ĺăăăăŻăšĺăăăăĺ°ăŞăă¨ăĺăŽćéăŞăšăăĺŚçăăă¨ăăŤĺăŽĺŽĺ ¨ć§ăćäžăăžăă
ăăăŚăăăăăăăżă¤ăăšă¤ăăĺ ă§ăăăăŽçšĺŽăŽă¤ăłăżăźăă§ăźăšă使ç¨ăăăŤăŻăăăŽăăăŞăšă¤ăăăçś˛çž çă§ăăĺż čŚăăăăžăă
ăăăŻçćłçăŞçăć§ćă§ăŻăăăžăăăďźäžďź
Foo | int32 | []Bar
ďźăä˝ăă§ăă
ç§ăŽććĄă¨é常ăŤăăäźźăŚăăžăďź //github.com/golang/go/issues/19412#issuecomment -520306000
type foobar union {
int
float
}
@mathieudevosăăăźăç§ăŻĺŽéăŤăăăă¨ăŚă弽ăă§ăă
ç§ăŤă¨ăŁăŚăćć°ăŽă¸ă§ăăŞăăŻăšăŽććĄă§ć大ăŽĺĽĺŚăŞçšďźĺŽéăŤćŽăŁăŚăăĺŻä¸ăŽĺĽĺŚăŞçšďźăŻăă¤ăłăżăźăă§ă¤ăšăŽăżă¤ăăŞăšăă§ăă 彟ăăŻăĄăăăŠĺŽĺ ¨ăŤéŠĺăăŚăăžăăă 揥ăŤăĺăăŠăĄăźăżăźĺśç´ă¨ăăŚăŽăżä˝żç¨ă§ăăăăă¤ăăŽă¤ăłăżăźăă§ăźăšăŞăŠăŤăŞăăžă...
union
ćŚĺżľăŻă union
ăinterface
ăŤĺăčžźăă§ăăăĄă˝ăăă¨rawĺăĺŤăĺśç´ăăĺŽçžă§ăăăăăç§ăŽé ăŽä¸ă§ăăžăćŠč˝ăăžăă ă¤ăłăżăźăă§ăźăšăŻăăŽăžăžćŠč˝ăçśăăăŚăăŞăłăä¸ĺżăŤĺŽçžŠăăăăťăăłăăŁăŻăšăŤăăăé常ăŽăłăźăă§ä˝żç¨ă§ăăĺĽĺŚăŞćčŚăăŞăăŞăăžăă
// Ordinary interface
type Stringer interface {
String() string
}
// Type union
type Foobar union {
int
float
}
// Equivalent to an interface with a type list
type FoobarStringer interface {
Stringer
Foobar
}
// Unions can intersect
type SuperFoo union {
Foobar
int
}
// Doesn't compile since these unions can't intersect
type Strange interface {
Foobar
union {
int
string
}
}
硨é-ĺŽéăŤăŻăăăŽCLăčŚăă°ăăă§ăďź https ďź
ăăŽĺ¤ć´ăŽä¸ťăŞĺŠçšăŻăä¸čŹăŽäşşă ăŤéć¸ăéăăă¨ă§ăă
ďźéĺśç´ďźăżă¤ăăŞăšăă使ç¨ăăă¤ăłăżăźăă§ă¤ăšăŽä˝żç¨
...ç´ ć´ăăăďź ă¤ăłăżăźăă§ă¤ăšăŻĺč¨ĺă¨ăăŚĺŽĺ ¨ăŤä˝żç¨ă§ăăăăăŤăŞăăé常ăŽä˝żç¨ă¨ĺśç´ăŽä˝żç¨ăŽéă§ăťăăłăăŁăŻăšăçľąĺăăăžăă ďźćăăăŤăžă ăŞăłăŤăŞăŁăŚăăŞăăăăăăŻĺăăăšăç´ ć´ăăăçŽçĺ°ă ă¨ćăăďź
ĺč¨ăżă¤ăăŽăăźă¸ă§ăłăçžĺ¨ăŽă¸ă§ăăŞăăŻč¨č¨ăăŠăăăŤăŠăŽăăăŤčĄ¨ç¤şăăăăă誏ćăăăăăŤăďź41716ăéăăžăăă
䝣ć°çăăźăżĺăŤé˘ăă@henryasăăăŽĺ¤ăććĄăĺ
ąćăăăăŁăă ăă§ăă ćäžăăăăŚăźăšăąăźăšă§ć¸ăăăŚăăăŽăŻă¨ăŚăčŻăă§ăă
https://github.com/golang/go/issues/21154
ćŽĺżľăŞăăăĺăćĽăŤ@mvdanăŤăăŁăŚăä˝ćĽăŽčŠäžĄăŞăăŤééăă
ç§ăŻďź21154ăćŹĺ˝ăŤĺĽ˝ăă§ăă ăăăŻĺĽăŽăă¨ăŽăăă§ăăďźăăăăŁăŚ@mvdanăŽďźăłăĄăłăăŻăĺŽĺ ¨ăŤăăăăăŚăăŞăăŽă§ăăăéăăžăă ăăă§ĺéăăžăăăăăă¨ăăăă§ăŽč°čŤăŤĺŤăăžăăďź
ăăăç§ăŻćŹĺ˝ăŤăăăŽĺˇă§čŞŹćăăăŚăăăŽă¨ĺć§ăŽćšćłă§ăăăéŤăŹăăŤăŽăă¸ăăšăă¸ăăŻăă˘ăăŤĺăăćŠč˝ă揲ăăă§ăă ĺćĺăŽăăăŞĺśéăăăăŞăăˇă§ăłăŽĺč¨ăżă¤ăăăăăłäťăŽĺéĄăŽăăăŤććĄăăăĺăĺ Ľăăăăăżă¤ăăŻăăăźăŤăăăŻăšă§ç´ ć´ăăăă§ăăăă GoăŽăă¸ăăš/ăăĄă¤ăłăłăźăăŻăçžćçšă§ăŻĺ°ăä¸ć źĺĽ˝ăŤćăăăă¨ăăăăžăă
ç§ăŽĺŻä¸ăŽăăŁăźăăăăŻăŻăă¤ăłăżăźăă§ă¤ăšĺ
ăŽtype foo,bar
ăĺ°ăăăăĄăŞăăăťăŤăłăăŻăŠăšăŤčŚăăă¨ăăăă¨ă§ăănull訹厚ă¨énull訹厚ăŽăŠăĄăăăé¸ćăăĺż
čŚăăăăă¨ăŤĺćăăžăďźĺŻč˝ăŞĺ ´ĺďźă
@ProximaB ăghă˘ăŤăŚăłăă§ăă䝼ä¸ăŽă˘ăŻăăŁăăăŁăŻăăăžăăăă¨č¨ăççąăăăăăžăăă ăă䝼ćĽă彟ăăŻäťăŽĺ¤ăăŽĺéĄăä˝ćăăŚăłăĄăłăăăŚăăăăăăăŽĺ¤ăăŻGoăăă¸ă§ăŻăăŤé˘ăăăăŽă§ăă 彟ăăŽć´ťĺăăăŽĺéĄăŽĺ˝ąéżăĺăăŚăăă¨ăă訟ć ăŻăžăŁăăčŚĺ˝ăăăžăăă
ăăăŤăç§ăŻăăă¨ăŤăăăŽĺéĄăŽč¤čŁ˝ă¨ăăŚăăŽĺéĄăéăăăă¨ăŤĺźˇăĺćăăžăă @andigăä˝ăéăăăŽăććĄăăŚăăă¨č¨ăŁăŚăăççąăăăăăžăăă ďź21154ăŽăăăšăăç解ă§ăăéăăăăă§čŞŹćăăŚăăăŽă¨ăžăŁăăĺăăă¨ăććĄăăžăăćŁç˘şăŞć§ćă§ăăăăăŽăĄăŹăšăŹăăăŽăŠăăă§ăă§ăŤććĄăăăŚăăŚăăăžăŁăăéŠăăŞăă§ăăăďźăťăăłăăŁăŻăšă誏ćăăăăćă確ăăŤăăă§ăăăč¤ć°ĺďźă ĺŽéăăăă¨ăŤăşăŽçˇ ăăăăăŻăăăŽĺéĄăŽéˇăăŤăăŁăŚćŁăă訟ćăăăŚăăă¨č¨ăăžăăăăăŻăďź21154ăŽé常ăŤčŠłç´°ă§ĺžŽĺŚăŞč°čŤăăă§ăŤĺŤăžăăŚăăăăăăăšăŚăçš°ăčżăăŽăŻĺ°éŁă§ĺéˇă§ăăă
ç§ăŻĺćăăććĄăă ăžăă¨ăăŚéăăăŽăŻăăăăćŽĺżľăŞăă¨ă ă¨ç解ăăŚăăžăă ăăăăç§ăŻăăăĺéżăăĺŽéçăŞćšćłăçĽăăžăăă 1ă¤ăŽĺ ´ćă§č°čŤăăăă¨ăŻăé˘äżăăăăšăŚăŽäşşăŤă¨ăŁăŚćçă§ăăăăăŤćăăăĺăăă¨ăŤă¤ăăŚč¤ć°ăŽĺéĄăéăăăžăžăŤăăŚăăăă¨ăŻăăăăăŤă¤ăăŚăŽč°čŤăŞăăŤăćăăăŤçĄćĺłă§ăă
ăăăŤăç§ăŻăăă¨ăŤăăăŽĺéĄăŽč¤čŁ˝ă¨ăăŚăăŽĺéĄăéăăăă¨ăŤĺźˇăĺćăăžăă @andigăä˝ăéăăăŽăććĄăăŚăăă¨č¨ăŁăŚăăççąăăăăăžăăă ďź21154ăŽăăăšăăç解ă§ăăéăăăăă§čŞŹćăăŚăăăŽă¨ăžăŁăăĺăăă¨ăććĄăăŚăăžăă
ăăŽĺéĄăčŞăżç´ăăă¨ăŤĺćăăžăă ă¸ă§ăăŞăăŻĺĽç´ă§ăăŽĺéĄă¨ćˇˇĺăăăăă§ăă ĺč¨ĺă埡ăăľăăźăăăžăă čłéăăŞăă¨ăč¨ăă¤ăăăŻăăăžăăă§ăăăăăŽăăăŤĺşăăăăĺ ´ĺăŻăă芍ăłçłăä¸ăăžăă
ç§ăŻäşşéă§ăăăăŹăźăăăłă°ăŽĺéĄăŻćă ăăŞăăăźăŤăŞăĺŻč˝ć§ăăăăŽă§ăééăăçŻăăă¨ăăŤĺż ăććăăŚăă ăă:)ăăăăăăŽĺ ´ĺăçšĺŽăŽĺč¨ăżă¤ăăŽććĄăŻă httpsďź/ăŽăăăŤăăŽăšăŹăăăăăăŠăźăŻăăĺż čŚăăăă¨ćăăžă
ç§ăŻäşşéă§ăăăăŹăźăăăłă°ăŽĺéĄăŻćă ăăŞăăăźăŤăŞăĺŻč˝ć§ăăăăŽă§ăééăăçŻăăă¨ăăŤĺż ăććăăŚăă ăă:)ăăăăăăŽĺ ´ĺăçšĺŽăŽĺč¨ăżă¤ăăŽććĄăŻă ďź19412ăŽăăăŤăăŽăšăŹăăăăăăŠăźăŻăăĺż čŚăăăă¨ćăăžă
@mvdanăŻäşşéă§ăŻăăăžăăă ç§ă俥ăăŚă ç§ăŻĺ˝źăŽéŁäşşă§ăă ĺčŤă ă
ăć¸ č´ăăăă¨ăăăăăžăăă ç§ăŻç§ăŽććĄăŤăăăťăŠĺˇçăăŚăăžăăă čŞçąăŤĺŁăăăă俎ćŁăăăăăăăăŽäťťćăŽé¨ĺăćĺ˘ăăăăăŚăă ăăă ĺŽçć´ťă§ĺżăăăŽă§ăçŠćĽľçăŤč°čŤăăćŠäźăăăăžăăă äşşă ăç§ăŽććĄăčŞăă§ăăŚăĺŽéăŤăăă弽ăăŞäşşăăăăă¨ăçĽăŁăŚăăăŽăŻčŻăăă¨ă§ăă
ćŹćĽăŽçŽçăŻăăăĄă¤ăłăŽé˘éŁć§ăŤăăŁăŚăżă¤ăăă°ăŤăźăĺă§ăăăăăŤăăăă¨ă§ăăăżă¤ăăŻĺż ăăăĺ ąéăŽĺä˝ăĺ ąćăăĺż čŚăŻăŞăăăłăłăă¤ăŠăźăŤăăă埡ĺśăăăžăă ç§ăŽćčŚă§ăŻăăăăŻĺăŞăéçć¤č¨źăŽĺéĄă§ăăăăłăłăă¤ăŤä¸ăŤčĄăăăžăă ĺéăŽč¤éăŞé˘äżăäżćăăăłăźăăăłăłăă¤ăŠăźăçćăăĺż čŚăŻăăăžăăă çćăăăăłăźăăŻăăăăăŽăăĄă¤ăłăżă¤ăăé常ăŽă¤ăłăżăźăă§ă¤ăš{}ăżă¤ăă§ăăăăŽăăăŤé常ĺŚçăăĺ ´ĺăăăăžăă éăăŻăăłăłăă¤ăŠăăłăłăă¤ăŤćăŤčż˝ĺ ăŽéçĺăă§ăăŻăĺŽčĄăăăăăŤăŞăŁăăă¨ă§ăă ăăăĺşćŹçăŤç§ăŽććĄăŽćŹčłŞă§ăďź21154
@henryasăŻăăăžăăŚďź đ
GolangăăăăŻăżă¤ăăłă°ă使ç¨ăăŚăăŞăăŁăă¨ăăăăăżă¤ăéăŽé˘äżăăŻăăăŤĺłĺŻăŤăŞăăććĄă§čŞŹćăăăăăŤăăăĄă¤ăłăŽé˘éŁć§ăŤăăŁăŚăŞăă¸ă§ăŻăăă°ăŤăźăĺă§ăăăăăŤăŞăăŽă§ăŻăŞăăă¨ćăăžăă
@henryasăŻăăăžăăŚďź đ
GolangăăăăŻăżă¤ăăłă°ă使ç¨ăăŚăăŞăăŁăă¨ăăăăăżă¤ăéăŽé˘äżăăŻăăăŤĺłĺŻăŤăŞăăććĄă§čŞŹćăăăăăŤăăăĄă¤ăłăŽé˘éŁć§ăŤăăŁăŚăŞăă¸ă§ăŻăăă°ăŤăźăĺă§ăăăăăŤăŞăăŽă§ăŻăŞăăă¨ćăăžăă
ăăăŞăă§ăăăăăăăăŻGo 1ă¨ăŽäşćć§ăŽç´ćăç ´ăăă¨ăŤăŞăăžăăć示çăŞă¤ăłăżăźăă§ăźăšăăăă°ăăăăăĺč¨ĺăŻĺż čŚăăăžăăă ăă ăăăăăŻăżă¤ăăłă°ăŻĺż ăăăćŞăăă¨ă§ăŻăăăžăăă ăăăŻçšĺŽăŽăăŽăăăčť˝éă§äžżĺŠăŤăăžăă ăăăŻăżă¤ăăłă°ă弽ăă§ăă ăăăŻäťäşăŤéŠĺăŞăăźăŤă使ç¨ăăăă¨ăŽĺéĄă§ăă
@henryasĺćăăžăă ăăăŻćśçŠşăŽčłŞĺă§ăăă ă´ăźăŻăŞă¨ăźăżăźăŻééăăŞăăăšăŚăŽćľŽăć˛ăżă桹ăčăăžăăă
ä¸ćšăă¤ăłăżăźăă§ă¤ăšăłăłăăŠă¤ă˘ăłăšăŽć¤č¨źăŞăŠăŽăłăźăăŁăłă°GUIDăŻčĄ¨ç¤şăăăžăăă
https://github.com/uber-go/guide/blob/master/style.md#verify -interface-compliance
ăăŽăăăăŻĺ¤ăŽč°čŤăăŠăăă§ăéĄăă§ăăžăăďź ăăŽĺˇăčłźčŞăăŚăăäşşăŻăăăăăăžăă
ăŞăźăăłă¤ăłăżăźăă§ăźăšăŽćşčśłĺşŚăŻăGoăŽéĺ§äťĽćĽăŽä¸é¨ă§ăăăĺ¤ăăăă¨ăŻăăăžăăă
ćăĺčăŤăŞăăłăĄăłă
ăăŽććĄăä˝ćăăŚăăă ăăăăă¨ăăăăăžăă ç§ăŻăăŽă˘ă¤ăă˘ă1ĺš´ăťăŠăăăŁăŚăăžăă
ĺ ˇä˝çăŞććĄăŻäťĽä¸ăŽă¨ăăă§ăă ç§ăćăăŤ
ăé¸ćăżă¤ăăăŻĺŽéăŤăŻăĺč¨ăżă¤ăăăăăéŠĺăŞĺĺăăăăăžăăăăYMMVă§ăă
GoăŽĺč¨ăżă¤ă
ĺč¨ăżă¤ăăŻăă|ăă¨çľăżĺăăă2ă¤äťĽä¸ăŽăżă¤ăă§čĄ¨ăăăžăă
ăŞăăŹăźăżăźă
çľćăŽăżă¤ăăŽĺ¤ăŻăćĺŽăăăăżă¤ăăŽ1ă¤ăŽăżăäżćă§ăăžăă NS
ăżă¤ăăŻă¤ăłăżăźăă§ă¤ăšăżă¤ăă¨ăăŚćąăăăžă-ăăŽĺçăżă¤ăăŻ
ăăăŤĺ˛ăĺ˝ăŚăăăŚăăĺ¤ă
çšĺĽăŞĺ ´ĺă¨ăăŚăănilăă使ç¨ăăŚăĺ¤ăĺŻč˝ăăŠăăă示ăăă¨ăă§ăăžă
ăźăăŤăŞăăžăă
äžăă°ďź
ĺč¨ăżă¤ăăŽăĄă˝ăăăťăăăŻăăĄă˝ăăăťăăăŽĺ ąéé¨ĺăäżćăăžă
ĺăăĄă˝ăăăé¤ăăăăšăŚăŽăłăłăăźăăłăăżă¤ăăŽ
ĺĺăç°ăŞă署ĺă
äťăŽă¤ăłăżăźăă§ă¤ăšăżă¤ăă¨ĺć§ăŤăĺč¨ăżă¤ăăŻĺçăŞĺŻžčąĄă¨ăŞăĺŻč˝ć§ăăăăžă
ĺĺ¤ćă ăżă¤ăăšă¤ăăă§ăŻăăšă¤ăăăŽćĺăŽă˘ăźă ăŻ
äżĺăăăŚăăăżă¤ăăŤä¸č´ăăăăŽăé¸ćăăăžăă
ĺč¨ăżă¤ăăŽăźăĺ¤ăŻăăŽćĺăŽăżă¤ăăŽăźăĺ¤ă§ăă
ĺč¨ă
ĺč¨ăżă¤ăăŤĺ¤ăĺ˛ăĺ˝ăŚăă¨ăăĺ¤ăăăĺ¤ăăŤĺăžăăăŠăă
ĺŻč˝ăŞăżă¤ăăŽ1ă¤ăăăăćĺăŽăżă¤ăăé¸ćăăăžăă
äžăă°ďź
ĺçĺintăŽĺ¤ăŤăŞăăžăăă
ĺçăżă¤ăfloat64ăŽĺ¤ăŤăŞăăžăă
ĺŽčŁ
ăă¤ăźăăŞĺŽčŁ ă§ăŻăĺč¨ĺăă¤ăłăżăźăă§ă¤ăšă¨ăžăŁăăĺăăăăŤĺŽčŁ ă§ăăžă
ĺ¤ă ăăć´çˇ´ăăăă˘ăăăźăă§ăŻă襨çžă使ç¨ă§ăăžă
ĺŻč˝ăŞĺ¤ăŽăťăăăŤéŠăăŚăăžăă
ăă¨ăă°ăăă¤ăłăżăŽăŞăĺ ˇčąĄĺăŽăżă§ć§ćăăăĺč¨ĺ
čż˝ĺ ăŽĺ¤ă使ç¨ăăŚăéăă¤ăłăżĺă§ĺŽčŁ ă§ăăžăă
ĺŽéăŽăżă¤ăăčŚăăŚăăăŚăă ăăă
ć§é ä˝ăżă¤ăăŽĺč¨ăŽĺ ´ĺăäşĺăŽăăăŁăłă°ă使ç¨ăăăă¨ăĺŻč˝ăăăăăžăă
ăăŽçŽçăŽăăăŽć§é ä˝ăŤĺ ąéăŽăă¤ăă