ã¿ãªããããã«ã¡ã¯ïŒ æè¿ã
TJ HolowaychukãNode.jsã«å¥ããåããGoã«ç§»è¡ããããšã決å®ããæ¹æ³
ã«é¢ããèšäºã®ç¿»èš³ããããŸããã èšäºã®æåŸã«ãGoèšèªã®æ¯èŒãšæ¹å€ã«å°å¿µãã
Will Jagerã® æçš¿ãžã®ãªã³ã¯ããããŸãããGoèšèªã¯ç¿»èš³ããããã«æ±ããããŠããŸãããå®éãç¿»èš³çµæã«ç²Ÿéããããšãææ¡ããŸãã ç§ã¯å€ããå°ãªãããèè
ã«å
åšãã詳现ãªè¡šçŸã¹ã¿ã€ã«ãšãæã𿮵èœãžã®å
ã®å
èš³ã®äž¡æ¹ãä¿åããããšããŸããã
翻蚳ãã¿ã€ããã¹ãããã³/ãŸãã¯ãã¶ã€ã³ã«é¢ãã建èšçãªã³ã¡ã³ããææ¡ãåãã§ããŸããã翻蚳è
ã®èŠç¹ã翻蚳ãããèšäºã®èè
ã®äœçœ®ãšäžèŽããªãå¯èœæ§ãããããšãèŠããŠãããŠãã ããã
Goãããã»ã©è¯ããªãçç±
ç§ã¯å²likeã奜ãã§ãã ç§ã¯ããã€ãã®ããšã®ããã«ããã䜿çšããŸãïŒå·çæã®ãã®ããã°ãå«ãïŒ Goã¯äŸ¿å©ã§ãã ãã ããGoã¯è¯ãèšèªã§ã¯ãããŸããã ãã¡ãããåœŒã¯æªããªãããè¯ããªãã
æçµçã«åããªããªãå¯èœæ§ããããããããŸãè¯ããªãèšèªã®äœ¿çšã«ã¯æ³šæããå¿
èŠããããŸãããããŠããããã20幎é䜿çšããªããã°ãªããŸããïŒPHPã®ããã«-çŽ ç¿»èš³è
]ã
以äžã«ãGoã«é¢ããäž»ãªèŠæ
ã®ãªã¹ãã瀺ããŸãã ãããã®ããã€ãã¯éåžžã«äžè¬çã§ãããããã€ãã¯éåžžã«ãŸãã§ãã
ãŸãã
Rustãš
Haskellã®èšèª ïŒç§ã¯è¯ãèšèªã ãšèããŠããŸãïŒãšæ¯èŒããŸã-ç§ã話ãåé¡ãå®éã«è§£æ±ºãããããšã瀺ãããã«ïŒä»ã®èšèªã§-çŽ ç¿»èš³è
]ã
æ±å
åé¡ã®æ¬è³ª
ããŸããŸãªçšéã«äœ¿çšã§ããã³ãŒããæžããããšããŸãã ããšãã°ãæ°åã®ãªã¹ããèŠçŽãã颿°ãäœæããå Žåãæµ®åå°æ°ç¹æ°ã®ãªã¹ããæŽæ°ã®ãªã¹ãã远å ã§ããä»ã®ã¿ã€ãã®èŠçŽ ã®ãªã¹ãã«äœ¿çšã§ãããšäŸ¿å©ã§ãã ãŸãããã®ã³ãŒãããåã¿ã€ãã®åå¥ã®é¢æ°ïŒæŽæ°ã®ãªã¹ããæµ®åå°æ°ç¹æ°ã®ãªã¹ããªã©ïŒã®åå¥ã®é¢æ°ãšåãã¿ã€ãã®å®å
šæ§ãšé床ãæäŸããã®ãçŽ æŽãããã§ãããã
æ±åã®æ¢åã®å®è£
ã®äžã§æé«ã®ãã®ã¯ãRustèšèªãšHaskellèšèªã«ååšãããã®ã§ãããšæããŸãïŒãå¶éãããã¿ã€ãã®ã·ã¹ãã ããšãåŒã°ããŸãïŒã Haskellã®ããŒãžã§ã³ã¯ãã¿ã€ãã¯ã©ã¹ããšåŒã°ããRustã®ããŒãžã§ã³ã¯ãtraitsã[ãŸãã¯ãäžçŽç©ã/ãmixinsããšåŒã°ããŸãã 翻蚳è
]ã ãããã¯æ¬¡ã®ããã«ãªããŸãã
ïŒRustã
ããŒãžã§ã³0.11 ïŒ
fn id<T>(item: T) -> T { item }
ïŒãã¹ã±ã«ïŒ
id :: t -> t id a = a
ãã®åæäŸã§ã¯ãæž¡ããããã©ã¡ãŒã¿ãŒãåã«è¿ãæ±çšãã©ã¡ãŒã¿ãŒã䜿çšããŠ
id
颿°ãå®çŸ©ããŸããã ãã°ãããããšã¯ããã®é¢æ°ã¯ã©ã®ã¿ã€ãã§ãæ©èœããã©ã®ã¿ã€ãã§ãæ©èœããªãããšã§ãã HaskellãšRustã®äž¡æ¹ã§ããã®é¢æ°ã¯æž¡ããããã©ã¡ãŒã¿ãŒã®åãä¿åããåã®å®å
šæ§ãæäŸããäžè¬åã®ãµããŒãã«ããå®è¡æã«è¿œå ã³ã¹ããäœæããŸããã ããšãã°ã
clone
颿°ãæžãããšãã§ããŸãã
æ±åã¯ãããŒã¿æ§é ã®å®çŸ©ã«ã䜿çšã§ããŸãã äŸãã°
ïŒéïŒ
struct Stack<T> { items: Vec<T> }
ïŒãã¹ã±ã«ïŒ
data Stack t = Stack [t]
ç¹°ãè¿ããŸãããéçåã®å®å
šæ§ãšãäžè¬åã®ãµããŒãã«ããå®è¡äžã®ããã©ãŒãã³ã¹ã®æå€±ã¯ãããŸããã
ãã©ã¡ãŒã¿ã䜿çšããŠäœããè¡ãäžè¬åããã颿°ãäœæããå Žåã¯ããããã®ã¢ã¯ã·ã§ã³ãå®çŸ©ãããŠãããã©ã¡ãŒã¿ã§ã®ã¿æ©èœããããšãã³ã³ãã€ã©ã«äŒããå¿
èŠããããŸãã ããšãã°ã3ã€ã®ãã©ã¡ãŒã¿ãŒãå ç®ããŠåèšãè¿ã颿°ãå®çŸ©ããå Žåããã©ã¡ãŒã¿ãŒãå ç®ããµããŒãããå¿
èŠãããããšãã³ã³ãã€ã©ãŒã«èª¬æããå¿
èŠããããŸãã æ¬¡ã®ãããªããšãã§ããŸãïŒ
ïŒéïŒ
fn add3<T:Num>(a:T, b:T, c:T) -> T { a + b + c }
ïŒãã¹ã±ã«ïŒ
add3 :: Num t => t -> t -> t -> t add3 abc = a + b + c
ããã§ã³ã³ãã€ã©ãŒã«æ¬¡ã®ããã«èšããŸãïŒã
add3
颿°ã®ãã©ã¡ãŒã¿ãŒã¯ä»»æã®å
T
ã«ããããšãã§ããŸããã
T
ã¯
Num
ïŒæ°å€åïŒã®ãµãã¿ã€ãã®1ã€ã§ãªããã°ãªããªããšããå¶éããããŸããã ã³ã³ãã€ã©ã¯æ°å€åã«å¯ŸããŠå ç®ãå®çŸ©ãããŠããããšãç¥ã£ãŠãããããã³ãŒãã¯åãã§ãã¯ã«åæ ŒããŸãã ãã®ãããªå¶éã¯ãããŒã¿æ§é ã®å®çŸ©ã«ã䜿çšã§ããŸãã ããŠãããã¯éåžžã«ãšã¬ã¬ã³ãã§ã·ã³ãã«ãªæ¹æ³ã§ãäžè¬åãããã¿ã€ãã»ãŒãã§æ¡åŒµå¯èœãªããã°ã©ãã³ã°ã§ãã
Goã¢ãããŒãïŒ interface{}
éåžžã«å¹³å¡ãªåã·ã¹ãã ã®ãããGoã¯æ±çšããã°ã©ãã³ã°ã®ãµããŒããéåžžã«è²§åŒ±ã§ãã
äžè¬åããã颿°ã®é¡äŒŒæ§ã¯éåžžã«ç°¡åã«èšè¿°ã§ããŸãã ããšãã°ãããã·ã¥å¯èœãªãªããžã§ã¯ãã®ããã·ã¥ã衚瀺ãã颿°ãäœæãããšããŸãã ãããè¡ãã«ã¯ãåå®å
šæ§ä¿èšŒã䜿çšããŠãããè¡ãããšãã§ããã€ã³ã¿ãŒãã§ã€ã¹ãã€ãŸã次ã®ãããªãã®ãå®çŸ©ã§ããŸãã
type Hashable interface { Hash() []byte } func printHash(item Hashable) { fmt.Println(item.Hash()) }
ããã§ãã€ã³ã¿ãŒãã§ãŒã¹ãå®è£
ãã
Hashable
ãªããžã§ã¯ããæž¡ãããšãã§ããéçãªåãã§ãã¯ãå®è¡ãããŸããããã¯äžè¬ã«è¯ãããšã§ãã
ãããããžã§ããªãã¯åã§ããŒã¿æ§é ãå®çŸ©ãããå Žåã¯ã©ããªããŸããïŒ åçŽãª
LinkedList
ãªã³ã¯ãªã¹ãã¿ã€ãã
LinkedList
ããŸãããã Goã§ãããè¡ãäžè¬çãªæ¹æ³ã次ã«ç€ºããŸãã
type LinkedList struct { value interface{} next * LinkedList } func (oldNode * LinkedList) prepend(value interface{}) * LinkedList { return &LinkedList{value, oldNode} } func tail(value interface{}) * LinkedList { return &LinkedList{value, nil} } func traverse(ll * LinkedList) { if ll == nil { return } fmt.Println(ll.value) traverse(ll.next) } func main() { node := tail(5).prepend(6).prepend(7) traverse(node) }
äœãæ°ã¥ããããšããããŸããïŒ
value
ãã£ãŒã«ãã®ã¿ã€ãã¯
interface{}
ã§ãã ããã§ã
interface{}
ã¯ãããŒã¹ã¿ã€ãããšåŒã°ãããã®ã§ããã€ãŸããä»ã®ãã¹ãŠã®ã¿ã€ãã¯ããããç¶æ¿ãããŸãã ããã¯ãJavaã®
Object
ã¯ã©ã¹ã«çŽæ¥çžåœããŸãã ãããŒ
ïŒæ³šïŒGoã«ã¯ãµãã¿ã€ããååšããªãããšãæå³ãããããåºæ¬åãGoã«ååšãããã©ããã«ã€ããŠã¯æèŠã®çžéããããŸããããã«ãããããããé¡äŒŒæ§ã¯æ®ã£ãŠããŸããïŒ
Goã§äžè¬åãããæ§é ãæ§ç¯ãããæ£ãããæ¹æ³ã¯ããšã³ãã£ãã£ãåºæ¬åã«ãã£ã¹ãããŠãããããããããŒã¿æ§é ã«è¿œå ããããšã§ãã ããã¯ã2004幎以éJavaã§äžè¬çã«è¡ãããŠããããšã§ãã ãã®åŸã人ã
ã¯ãã®ã¢ãããŒããåã·ã¹ãã ãå®å
šã«ç Žå£ããããšã«æ°ä»ããŸããã ãã®ããã«ããŒã¿æ§é ã䜿çšãããšãå³å¯ãªåã·ã¹ãã ã®ãã¹ãŠã®å©ç¹ã倱ãããŸã[å®éãããã§ã¯å€§ããªåé¡ã¯èŠåœãããŸãã-åºæ¬çãª
interface{}
代ããã«ãååãšããŠãããå
·äœçãªã€ã³ã¿ãŒãã§ã€ã¹ãæå®ããŠãç¹å®ã®å®è£
ã§ãã®æ¹æ³ãæãªããªããã
interface{}
ããããšãã§ããŸãã¿ã€ã-çŽ ç¿»èš³è
]ã
ããšãã°ãçµ¶å¯Ÿã«æ£ããã³ãŒãã¯æ¬¡ã®ãšããã§ãã
node := tail(5).prepend("Hello").prepend([]byte{1,2,3,4})
ããã«ãããæ§é åãããããã°ã©ã ã®å©ç¹ã倱ãããŸãã ããšãã°ãã¡ãœããã¯ãã©ã¡ãŒã¿ãŒãšããŠæŽæ°ã®é£çµãªã¹ããæåŸ
ããŠããŸãããçªç¶ã錻ã«ç· ãåãããããããªç²ããæ°žç¶çãªã³ãŒããŒããã°ã©ããŒãçªç¶ã©ã€ã³ãéä¿¡ããŸãã Goã®äžè¬åãããæ§é ã¯å€ã®ã¿ã€ãã«ã€ããŠäœãç¥ããªããããã³ã³ãã€ã©ã¯äœãæ°ã¥ããªãã§ãããããããŠãã€ããããã°ã©ã ã¯
interface{}
ãžã®ãã£ã¹ãã§åçŽã«ã¯ã©ãã·ã¥ã
interface{}
ã
list
ã
map
ã
graph
ã
tree
ã
queue
ãäžè¬åãããæ§é ã§ãåæ§ã®åé¡ãçºçããå¯èœæ§ããã
queue
ã
èšèªã®æ¡åŒµæ§
åé¡ã®æ¬è³ª
髿°Žæºèšèªã«ã¯ãå€ãã®å Žåãããè€éãªã¿ã¹ã¯ã®ç¥èªã§ããããŒã¯ãŒããšèšå·ããããŸãã ããšãã°ãå€ãã®èšèªã§ã¯ãå°ãªããšãåãé
åã®ããŒã¿ã³ã¬ã¯ã·ã§ã³ã®ãã¹ãŠã®èŠçŽ ããã€ãã¹ããæ¹æ³ããããŸãã
ïŒJavaïŒïŒ
for (String name : names) { ... }
ïŒPythonïŒïŒ
for name in names: ...
çµã¿èŸŒã¿èšèªïŒé
åãªã©ïŒã ãã§ãªããä»»æã®ã³ã¬ã¯ã·ã§ã³ã«åæ§ã®æ§æç³ã䜿çšã§ãããšäŸ¿å©ã§ãã
ãŸããå ç®ãªã©ã®åã®æäœãå®çŸ©ããŠã次ã®ãããªãã®ãèšè¿°ã§ããã°äŸ¿å©ã§ãã
[ã¹ããŒããããšãã°ã
æŒç®åã®ãªãŒããŒããŒãã«ã€ããŠ-çŽã 翻蚳è
]
point3 = point1 + point2
é©åãªã¢ãããŒãïŒæŒç®åã¯é¢æ°ã§ã
é©åãªè§£æ±ºçã¯ãæŒç®åã察å¿ãã颿°/ã¡ãœãããžã®ãã·ã§ãŒãã«ãããã«ããããŒã¯ãŒããæšæºã®é¢æ°/ã¡ãœããã®ãšã€ãªã¢ã¹ã«ããããšã§ãã
äžéšã®èšèªïŒPythonãRustãHaskellãªã© -æŒç®åã®åå®çŸ©ãèš±å¯ããŸã[ãããŠHaskellã¯ç¬èªã«å®çŸ©ããŸã-çŽ ç¿»èš³è
]ã å¿
èŠãªã®ã¯ãã¯ã©ã¹ã¡ãœãããèšè¿°ããããšã ãã§ãããã®åŸãäœããã®æŒç®åïŒããšãã°ãã
+
ãïŒã䜿çšãããšã察å¿ããã¡ãœãããåçŽã«åŒã³åºãããŸãã Pythonã§ã¯ã
+
æŒç®åã¯
__add__()
åŒã³åºããŸãã Rustã§ã¯ãã
+
ãã
Add
ãã¬ã€ãã§
add()
ã¡ãœãããšããŠå®çŸ©ãããŠããŸãã Haskellã§ã¯ãã
+
ãã¯
Num
åã§å®çŸ©ããã
+
颿°ã«å¯Ÿå¿ããŸãã
å€ãã®èšèªã¯ã
for-each
ãªã©ã®ããŸããŸãªããŒã¯ãŒãã®ç¯å²ãæ¡å€§ããæ¹æ³ããµããŒãããŠã
for-each
ã Haskellã«ã¯ã«ãŒãã¯ãããŸããããRustãJavaãPythonãªã©ã®èšèªã«ã¯ãããããã¿ã€ãã®ã³ã¬ã¯ã·ã§ã³ã§
for-each
ã䜿çšã§ããã€ãã¬ãŒã¿ãŒããããŸãã
å察ã«ãæŒç®åãåå®çŸ©ããŠããŸã£ããçŽèгçã§ã¯ãªãæäœãè¡ãããšãã§ããŸãã ããšãã°ãbydlokoder [origã ãã¯ã¬ã€ãžãŒã³ãŒããŒã-çŽ ç¿»èš³è
]ã¯ãã
-
ãæŒç®åã2ã€ã®ãã¯ãã«ã®ä¹ç®ãšããŠå®çŸ©ã§ããŸãããã©ã®èšèªã§ã颿°ãåŒã³åºãããšãã§ããªããããæŒç®åèªäœã®ãªãŒããŒããŒãã®åé¡ã§ã¯ãããŸããã
é²å
¥ã¢ãããŒãïŒãªã
Goã¯ãæŒç®åã®ãªãŒããŒããŒããšããŒã¯ãŒãã®æ¡åŒµäœ¿çšããµããŒãããŠããŸããã
ããããçªç¶ã
range
ããŒã¯ãŒããä»ã®äœãïŒããªãŒãŸãã¯ãªã³ã¯ãªã¹ãïŒã§äœ¿çšãããå Žåã¯ã©ãã§ããããã åäœããŸããã èšèªã¯ããããµããŒãããŠããŸããã
range
ã¯ãçµã¿èŸŒã¿æ§é ã§ã®ã¿äœ¿çšã§ããŸãã
make
ãšåãããš-ã¡ã¢ãªã®å²ãåœãŠãšçµã¿èŸŒã¿æ§é ã®ã¿ã®åæåã«äœ¿çšã§ããŸãã
æ¡åŒµå¯èœãªã€ãã¬ãŒã¿ã«æãè¿ãå©çšå¯èœãªäŸãã¯ã
chan
ïŒ
ãã£ãã« -çŽTranslatorïŒãè¿ãããŒã¿æ§é äžã«ã©ãããŒãèšè¿°ãããããå埩åŠçããããšã§ãããããã¯é
ããè€éã§ãå€ãã®ãã°ãåŒãèµ·ããå¯èœæ§ããããŸãã
ãã®ã¢ãããŒãã¯æ¬¡ã®ããã«æ£åœåãããŸãããçè§£ãããããããŒãžã«èšè¿°ãããŠããã³ãŒãã¯å®è¡ãããã³ãŒãã§ããã ã€ãŸããGoã
range
ãªã©ã®æ¡åŒµãèš±å¯ããå Žåãããã¯æ··ä¹±ãæãå¯èœæ§ããããŸããç¹å®ã®ã±ãŒã¹ã®
range
å®è£
ã®è©³çްãæããã§ãªãå Žåãããããã§ãã ããããç§ã«ãšã£ãŠãã®è°è«ã¯ã»ãšãã©æå³ããããŸããããªããªããGoãã·ã³ãã«ã§äŸ¿å©ã§ãããã©ããã«é¢ä¿ãªãã人ã
ã¯ããŒã¿æ§é ãç§»åããå¿
èŠãããããã§ãã å®è£
ã®è©³çްã
range
åŸãã«é ãã®ã§ã¯ãªããå®è£
ã®è©³çްãå¥ã®ãã«ããŒé¢æ°ã®åŸãã«é ãå¿
èŠããããŸããããã»ã©å€§ããªæ¹åã¯ãããŸããã ããæžãããã³ãŒãã¯èªã¿ããããäžå®å
šã«æžãããã³ãŒãã¯é£ãããæããã«Goã¯ããã倿Žã§ããŸããã
åºæ¬çãªã±ãŒã¹ãšãšã©ãŒãã§ãã¯
åé¡ã®æ¬è³ª
ååž°çãªããŒã¿æ§é ïŒãªã³ã¯ãªã¹ããŸãã¯ããªãŒïŒã䜿çšããå Žåãæ§é ã®çµããã«ãŸã å°éããŠããªãããšãç€ºãæ¹æ³ãå¿
èŠã§ãã
倱æããå¯èœæ§ã®ãã颿°ããŸãã¯ããŒã¿ãå«ãŸãªãå¯èœæ§ã®ããããŒã¿æ§é ã䜿çšããŠãã¿ã¹ã¯ã倱æããããšã瀺ããããšèããŠããŸãã
GoïŒ Nil
ã¢ãããŒããšãã«ããªã¿ãŒã³
æåã«å²approachã¢ãããŒãã«ã€ããŠèª¬æããŸãããã®åŸãæ£ããã¢ãããŒãã説æãããããªããŸãã
Goã«ã¯
nullãã€ã³ã¿ã§ãã
nil
ããã
ãŸã ã ãã®ãããªæ°ãããŠçŸä»£çãªèšèªããããã
tabula rasaã ããã®äžå¿
èŠãªæŸèæã®ãã°ãåŒãèµ·ããæ©èœãå®è£
ããã®ã¯æ¥ãã¹ãããšã ãšæããŸãã
nullãã€ã³ã¿ãŒã«ã¯ããã°ãè±å¯ãªé·ãæŽå²ããããŸãã æŽå²çããã³å®çšçãªçç±ããã䜿çšãããããŒã¿ã¯ã»ãšãã©
0x0
ã«ä¿åãããŸããã§ããããããã£ãŠãéåžžã
0x0
ãžã®ãã€ã³ã¿ãŒã¯ç¹å¥ãªç¶æ³ã衚ãããã«äœ¿çšãããŸããã ããšãã°ããã€ã³ã¿ãŒãè¿ã颿°ã¯ã倱æãããš
0x0
ãè¿ãããšããããŸãã ååž°çãªããŒã¿æ§é ã§ã¯ã
0x0
ã䜿çšããŠåºæ¬çãªã±ãŒã¹ã決å®ã§ããŸãïŒããšãã°ãçŸåšã®ããªãŒããŒããèã§ããããŸãã¯çŸåšã®ãªã³ã¯ãªã¹ãã¢ã€ãã ãæåŸã§ãããªã©ïŒã ããããã¹ãŠã®ããã«ãnullãã€ã³ã¿ãŒãGoã§äœ¿çšãããŸãã
ãã ããnullãã€ã³ã¿ãŒã®äœ¿çšã¯å®å
šã§ã¯ãããŸããã å®éããã®ãã€ã³ã¿ãŒã¯åã·ã¹ãã ã®éåã§ãã å®éã«ã¯ãŸã£ããã¿ã€ãã§ã¯ãªãã¿ã€ãã®ã€ã³ã¹ã¿ã³ã¹ãäœæã§ããŸãã ããã°ã©ãããŒããžã®ãã€ã³ã¿ããã§ãã¯ããã®ãå¿ããããšã¯éåžžã«äžè¬çã§ãããããã¯æœåšçã«ã¯ã©ãã·ã¥ã«ã€ãªãããããã«ã²ã©ãå Žåã«ã¯è匱æ§ã«ã€ãªãããŸãã ãã«ãã€ã³ã¿ãŒã¯åãå
¥ããããåã·ã¹ãã ããããã¯ã¢ãŠãããããããã³ã³ãã€ã©ãŒã¯ãããåã«åãå
¥ããŠä¿è·ããããšã¯ã§ããŸããã
Goã®å瞟ãšããŠã颿°ã倱æããå¯èœæ§ãããå Žåã¯ãGoãæ¡çšããå€ã®è€æ°ã®ãªã¿ãŒã³ã®ã¡ã«ããºã ã匷åãã2çªç®ã®ã倱æãããå€ãè¿ãã®ãäžè¬çã§ãã ãã ãããã®ã¡ã«ããºã ã¯ç°¡åã«ç¡èŠãããã誀çšãããããå¯èœæ§ããããååãšããŠãååž°çãªããŒã¿æ§é ã®åºæ¬çãªã±ãŒã¹ã衚ãã®ã«ã¯åœ¹ã«ç«ã¡ãŸããã
é©åãªã¢ãããŒãïŒä»£æ°çããŒã¿åãšã¿ã€ãã»ãŒããªæ
éã¢ãŒã
åã·ã¹ãã ã«å¯ŸããæŽåã§èª€ã£ãç¶æ
ãåºæ¬çãªã±ãŒã¹ã衚ã代ããã«ãåã·ã¹ãã ã䜿çšããŠãããã®ç¶æ³ããã¹ãŠå®å
šã«é ãããšãã§ããŸãã
ãªã³ã¯ãªã¹ããå®è£
ãããšããŸãã èãããã2ã€ã®ã±ãŒã¹ã瀺ããŸãã1ã€ã¯ããªã¹ãã®æåŸã«ãŸã å°éããŠããããçŸåšã®èŠçŽ ã«ããŒã¿ãããå Žåã2ã€ç®ã¯ããªã¹ãã®æåŸã«å°éããå Žåã§ãã ã¿ã€ãã»ãŒããã¹ã«ã¯ããããã®ã±ãŒã¹ã®1ã€ããããã衚ã2ã€ã®ã¿ã€ãã®å®è£
ãšã代æ°çããŒã¿ã¿ã€ãã䜿çšãããã®åŸã®çµã¿åãããå«ãŸããŸãã äœããã®ããŒã¿ãæã€ãªã³ã¯ãªã¹ãã®èŠçŽ ã衚ã
Cons
åãšããªã¹ãã®æ«å°Ÿã衚ã
End
åããããšããŸãã æ¬¡ã®ããã«èšè¿°ã§ããŸãã
ïŒéïŒ
enum List<T> { Cons(T, Box<List<T>>), End } let my_list = Cons(1, box Cons(2, box Cons(3, box End)));
ïŒãã¹ã±ã«ïŒ
data List t = End | Cons t (List t) let my_list = Cons 1 (Cons 2 (Cons 3 End))
åã¿ã€ãã¯ãããŒã¿æ§é ã«å¯ŸããŠæäœãå®è¡ããååž°ã¢ã«ãŽãªãºã ã®ããŒã¹ã±ãŒã¹ïŒ
End
ïŒãå®çŸ©ããŸãã RustãHaskellãnullãã€ã³ã¿ãèš±å¯ããªããããnullãã€ã³ã¿ã«é¢é£ãããã°ã«ééããããšã¯çµ¶å¯Ÿã«ãããŸããïŒãã¡ãããã¯ã¬ã€ãžãŒãªäœã¬ãã«ã®ãã®ãå®è¡ãããŸã§ïŒã
ãããã®ä»£æ°çããŒã¿åã䜿çšãããšã以äžã«ç€ºã
ãã¿ãŒã³ãããã³ã°ãªã©ã®èšèªæ©èœã®ãããã§ãä¿¡ããããªãã»ã©çãïŒãããã£ãŠããã°ãçºçããããïŒã³ãŒããèšè¿°ã§ããŸãã
ããŠã颿°ãäœããã®ã¿ã€ãã®å€ãè¿ãããšãã§ãããè¿ããªãå ŽåããŸãã¯ããŒã¿æ§é ã«ããŒã¿ãå«ãŸããå Žåãšå«ãŸããªãå Žåã¯ã©ãããã°ããã§ããããïŒ ã€ãŸããåã·ã¹ãã ã§ãšã©ãŒç¶æ
ãé衚瀺ã«ããã«ã¯ã©ãããã°ããã§ããïŒ ãã®åé¡ã解決ããããã«ãRustã«ã¯
OptionãšåŒã°ãããã®ããããHaskellã«ã¯
MaybeãšåŒã°ãããã®ããããŸãã
空ã§ãªãè¡ã®é
åã§
'H'
ã§å§ãŸãè¡ãæ¢ããæåã«äžèŽããè¡ãè¿ã颿°ããŸãã¯ãã®ãããªè¡ãèŠã€ãããªãå Žåã¯ãšã©ãŒãè¿ã颿°ãæ³åããŠãã ããã Goã§ã¯ããšã©ãŒãçºçããå Žåã
nil
ãè¿ãå¿
èŠããããŸãã ãããŠãRustãšHaskellã®ãã€ã³ã¿ãŒã§æŸèæã䜿ããã«å®å
šã«è¡ãæ¹æ³ã次ã«ç€ºããŸãã
ïŒéïŒïŒ
fn search<'a>(strings: &'a[String]) -> Option<&'a str> { for string in strings.iter() { if string.as_slice()[0] == 'H' as u8 { return Some(string.as_slice()); } } None }
ïŒãã¹ã±ã«ïŒïŒ
search [] = Nothing search (x:xs) = if (head x) == 'H' then Just x else search xs
æååãŸãã¯nullãã€ã³ã¿ãè¿ã代ããã«ãæååãå«ãå Žåãšå«ãŸãªãå Žåããããªããžã§ã¯ããè¿ããŸãã nullãã€ã³ã¿ãŒãè¿ãããšã¯ãããŸããããŸãã
search()
ã䜿çš
search()
éçºè
ã¯ã颿°ã®åãããã瀺ããŠããããã颿°ãæåãŸãã¯å€±æããå¯èœæ§ããããäž¡æ¹ã®ã±ãŒã¹ã«å¯Ÿå¿ããå¿
èŠãããããšãç¥ã£ãŠããŸãã ããããªããã«ãã€ã³ã¿ãŒãã°ïŒ
åæšè«
åé¡ã®æ¬è³ª
ããã°ã©ã ã³ãŒãå
ã®å倿°ã®åã瀺ãã®ã¯å°ãæä»£é
ãã«ãªããŸãã å€ã®ã¿ã€ããæãããªå ŽåããããŸãã
int x = 5 y = x*2
y
ã
int
åã§ããããšã¯æããã§ãã ãã¡ãããããè€éãªç¶æ³ããããŸããããšãã°ããã©ã¡ãŒã¿ãŒã®åã«åºã¥ããŠé¢æ°ããè¿ãããåã®çµè«ïŒãŸãã¯ãã®éïŒãªã©ã§ãã
é©åãªã¢ãããŒãïŒäžè¬çãªåæšè«
RustãšHaskellã¯ã©ã¡ãã
Hindley-Milneråã·ã¹ãã ã«åºã¥ããŠãã
ãããã©ã¡ããåæšè«ã«éåžžã«åªããŠããããããã®ã¯ãŒã«ãªããšãã§ããŸãã
ïŒãã¹ã±ã«ïŒïŒ
map :: (a -> b) -> [a] -> [b] let doubleNums nums = map (*2) nums doubleNums :: Num t => [t] -> [t]
颿°
(*2)
ã¯
Num
åã®ãã©ã¡ãŒã¿ãŒãåãåãã
Num
åã®å€ãè¿ããããHaskellã¯
b
åãš
b
åã
Num
ã§
a
ãšå€æã§ãããããã颿°ã
Num
åã®å€ã®ãªã¹ããåãå
¥ããŠè¿ããšæšå®ã§ããŸãã ããã¯ãGoãC ++ãªã©ã®èšèªã§ãµããŒããããŠããåçŽãªåæšè«ã·ã¹ãã ãããã¯ããã«åŒ·åã§ãã ããã«ãããæç€ºçãªåæç€ºã®æå°æ°ãäœæã§ããéåžžã«è€éãªããã°ã©ã ã§ãã£ãŠããã³ã³ãã€ã©ã¯ä»ã®ãã¹ãŠãæ£ããæ±ºå®ã§ããŸãã
Goã¢ãããŒãïŒã¹ããŒãã¡ã³ã:=
Goã¯ã次ã®ããã«æ©èœãã代å
¥æŒç®å
:=
ãµããŒãããŠããŸãã
ïŒè¡ãïŒïŒ
foo := bar()
ããã¯ãã¹ãŠã
bar()
颿°ã«ãã£ãŠè¿ãããåãåºåãã
foo
ã«åãå€ãå²ãåœãŠãŸãã ãããšã»ãŒåãã§ãã
ïŒC ++ïŒïŒ
auto foo = bar();
ããã¯ããŸãé¢çœããªãã ãããè¡ãããšã¯ã
bar()
颿°ã«ãã£ãŠè¿ãããåãèŠãããã®2ç§ã®åªåããªããã倿°åå
foo
ããã€ãã®æåãæžãããšããã§ãã
åé¡ã®æ¬è³ª
ç¶æ
ã®äžå€æ§ïŒäžå€æ§ïŒã¯ã¢ã€ãã¢ã§ããããã®æ¬è³ªã¯ãå€ãäœææã«äžåºŠã ãèšå®ããããã®åŸå€æŽã§ããªãããšã§ãã ãã®ã¢ãããŒãã®å©ç¹ã¯éåžžã«æçœã§ããå€ã倿ŽãããŠããªãå Žåãå¥ã®å Žæã§äœ¿çšãããšãã«ãããå Žæã§ã®ããŒã¿æ§é ã®å€æŽã«èµ·å ãããã°ã®å¯èœæ§ã倧å¹
ã«æžå°ããŸãã
ç¶æ
ã®äžå€æ§ã¯ãããã€ãã®ã¿ã€ãã®æé©åã«ã圹ç«ã¡ãŸãã
æ£ããã¢ãããŒãïŒããã©ã«ãã®ç¶æ
ã®äžå€æ§
ããã°ã©ãã¯ãã§ããã ãé »ç¹ã«äžå€ã®ããŒã¿æ§é ã䜿çšããããã«ããŠãã ããã ç¶æ
ã®äžå€æ§ã«ãããèµ·ããããå¯äœçšãããã°ã©ã ã®ã»ãã¥ãªãã£ãã¯ããã«ç°¡åã«å€æã§ãããããèµ·ãããããšã©ãŒã®ã¯ã©ã¹å
šäœãæé€ãããŸãã
Haskellã§ã¯ããã¹ãŠã®å€ã¯äžå€ã§ãã ããŒã¿æ§é ã®ç¶æ
ã倿Žããå Žåã¯ãç®çã®å€ã§å¥ã®æ§é ãäœæããå¿
èŠããããŸãã Haskellã¯
é
å»¶èšç®ãš
æ°žç¶çãªããŒã¿æ§é ã䜿çšãããããããã¯äŸç¶ãšããŠé«éã§ãã Rustã¯ã·ã¹ãã ããã°ã©ãã³ã°èšèªã§ãããããé
å»¶èšç®ã䜿çšã§ãããç¶æ
ã®äžå€æ§ãHaskellã»ã©å®çšçã§ãããšã¯éããŸããã ããã«ãããããããRustã§ã¯ã宣èšããã倿°ã¯ãã¹ãŠããã©ã«ãã§å€æŽãããŸãã[ãã®å Žåã倿°ãšåŒã¶ããšã¯å®å
šã«æ£ããã§ããããªãªãžãã«ã§ã¯ããã§ãã-çŽã 翻蚳è
]ããã ããå¿
èŠã«å¿ããŠç¶æ
ã倿Žããæ©èœããããŸãã ãããŠãããã¯ãã°ãããã§ãããªããªãã宣èšããã倿°ãå¯å€ã§ãªããã°ãªããªãããšãããã°ã©ãã«æç€ºçã«æç€ºããããã§ããããã¯ãããã°ã©ãã³ã°ã®ãã¹ããã©ã¯ãã£ã¹ã®é©çšã«è²¢ç®ããã³ã³ãã€ã©ã«ããæé©åã®åäžãå¯èœã«ããŸãã
é²å
¥ã¢ãããŒãïŒãªã
Goã¯ã¹ããŒãã¬ã¹ããµããŒãããŠããŸããã
å¶åŸ¡æ§é
åé¡ã®æ¬è³ª
å¶åŸ¡æ§é [å
ãå¶åŸ¡ãããŒæ§é ã-çŽ ç¿»èš³è
]-ããã°ã©ãã³ã°èšèªãšãã·ã³ã³ãŒããåºå¥ãããã®ã®äžéšã æœè±¡åã䜿çšããŠãããã°ã©ã ã®å®è¡ãæ£ããæ¹åã«å¶åŸ¡ã§ããŸãã æããã«ããã¹ãŠã®ããã°ã©ãã³ã°èšèªã¯ãããçš®ã®å¶åŸ¡æ§é ããµããŒãããŠããŸããããã§ãªããã°ã誰ããããã䜿çšããŸããã ãã ããGoã§å®éã«èŠéããŠããå¶åŸ¡æ§é ãããã€ããããŸãã
é©åãªã¢ãããŒãïŒãã¿ãŒã³ãããã³ã°ãšè€ååŒ
ãã¿ãŒã³ãããã³ã°ã¯ãããŒã¿æ§é ãšå€ãæäœããããã®æ¬åœã«ã¯ãŒã«ãªæ¹æ³ã§ãã ã¹ããã€ãã®
case
/
switch
ã«äŒŒãŠããŸãã æ¬¡ã®ããã«ãµã³ãã«ãšæ¯èŒã§ããŸãã
ïŒéïŒïŒ
match x { 0 | 1 => action_1(), 2 .. 9 => action_2(), _ => action_3() };
ãã®å Žåãåæ§ã®æ¹æ³ã§æ§é ãæäœã§ããŸãã
deg_kelvin = match temperature { Celsius(t) => t + 273.15, Fahrenheit(t) => (t - 32) / 1.8 + 273.15 };
åã®äŸã¯ããè€ååŒããšåŒã°ãããã®ã瀺ããŠããŸã[origã ãè€å衚çŸã-çŽ ç¿»èš³è
]ã CãGoã®ãããªèšèªã§ã¯ã
if
ããã³
case
/
switch
åã«ããã°ã©ã ã®æµããæç€ºããŸãã å€ãèšç®ããŸããã RustãHaskellãªã©ã®èšèªã§ã¯ã
if
ãšãã¿ãŒã³ãããã³ã°ã«ãããäœãã«å²ãåœãŠãããšãã§ããå€ãèšç®ã§ããŸãã ã€ãŸãã
if
ãšãã¿ãŒã³ãããã³ã°ã¯å®éã«å€ããè¿ããããšãã§ããŸãã
if
äŸã次ã«ç€ºããŸãã
ïŒãã¹ã±ã«ïŒïŒ
x = if (y == "foo") then 1 else 2
Goã¢ãããŒãïŒæå³ã®ãªãCã¹ã¿ã€ã«ã®ã¹ããŒãã¡ã³ã
Goã軜èŠããããªã-䞊ååã®
select
ãªã©ãç¹å®ã®ãã®ã«é©ããå¶åŸ¡æ§é ããã
select
ã
ãã ããç§ã倧奜ããªè€å衚çŸããã¿ãŒã³ãããã³ã°ã¯ãããŸãããGoã¯ãx := 5
ãŸãã¯ãªã©ã®ã¢ãããã¯åŒã®å²ãåœãŠã®ã¿ããµããŒããx := foo()
ãŸããçµã¿èŸŒã¿ããã°ã©ãã³ã°
çµã¿èŸŒã¿ã·ã¹ãã çšã®ããã°ã©ã ãäœæããããšã¯ããã«æ©èœã®ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã§ããã°ã©ã ãäœæããããšãšã¯å€§ããç°ãªããŸããäžéšã®èšèªã¯ãçµã¿èŸŒã¿ã·ã¹ãã ã®ç¹å¥ãªããã°ã©ãã³ã°èŠä»¶ãåŠçããã®ã«ããé©ããŠããŸããGoãããã°ã©ãã³ã°ããããã®èšèªãšããŠæäŸããŠãã人ã
ãããªãããããšã«é©ããŠããŸããGoã¯ãããã€ãã®çç±ã«ãããçµã¿èŸŒã¿ã·ã¹ãã ã®ããã°ã©ãã³ã°ã«ã¯é©ããŠããŸããããã®ã»ã¯ã·ã§ã³ã¯ãå²izingãæ¹å€ããããã®ãã®ã§ã¯ãããŸãããå²Goã¯ãã®ããã«èšèšããããã®ã§ã¯ãããŸããããã®ã»ã¯ã·ã§ã³ã§ã¯ãçµã¿èŸŒã¿ã·ã¹ãã åãã«Goã§ã®äœæãæšå¥šãã人ã
ã®èª€è§£ã«ã€ããŠèª¬æããŸããããŒãã¯ãå®è¡æã«äœæãããä»»æã®æ°ã®ãªããžã§ã¯ããæ ŒçŽããããã«äœ¿çšã§ããã¡ã¢ãªã§ããããŒãã®äœ¿çšã¯ãåçã¡ã¢ãªå²ãåœãŠãšåŒã°ããŸããååãšããŠãçµã¿èŸŒã¿ã·ã¹ãã çšã«ããã°ã©ãã³ã°ãããšãã«æã䜿çšããã®ã¯äžåçã§ããäž»ãªçç±ã¯ãååãšããŠãããŒãã«ã¯ããªãã®è¿œå ã¡ã¢ãªãªãŒããŒããããšããã€ãã®éåžžã«è€éãªå¶åŸ¡æ§é ãå¿
èŠã§ããããã§ããããã§ãããã¡ããããªã¢ã«ã¿ã€ã ã·ã¹ãã ã§ããŒãã䜿çšããã®ã¯çäžå°œã§ãã (, , ), , , . , , , , , .
åçã¡ã¢ãªå²ãåœãŠã«ã¯ãçµã¿èŸŒã¿ã·ã¹ãã ã®å¹ççãªããã°ã©ãã³ã°ã«äœ¿çšãäžé©åã«ããä»ã®åŽé¢ããããŸããããšãã°ãããŒãã䜿çšããå€ãã®èšèªã¯ãã¬ããŒãžã³ã¬ã¯ã¿ãŒã«äŸåããŠããŸããã¬ããŒãžã³ã¬ã¯ã¿ãŒã¯ãå®è¡äžã«ããã°ã©ã ãäžæåæ¢ããŠã䜿çšãããªããªã£ããªããžã§ã¯ããèŠã€ããŠåé€ããŸããããã«ãããããã°ã©ã ã¯åãªãåçã¡ã¢ãªã䜿çšããå Žåãããããã«äºæž¬äžèœã«ãªããŸããé©åãªã¢ãããŒãïŒåçã¡ã¢ãªããªãã·ã§ã³ã«ãã
Rust â ,
boxes
. , , . Rust .
Go:
Go . Go , Go â , , Go .
Go . . , : Go , . : , , Go â , - - .
Haskellã®ãããªèšèªã®å Žåã«ããåæ§ã®åé¡ãçºçããŸããããã¯ããªã¢ã«ã¿ã€ã ã®ã¿ã¹ã¯ããããŒãã®åçã®å€§ããªã€ãªããã®ããã«çµã¿èŸŒã¿ã·ã¹ãã ã®ããã°ã©ãã³ã°ã«ã¯äžåãã§ãããã ããHaskellãããããããã°ã©ãã³ã°èšèªãšããŠæå±ãã人ãèŠãããšã¯ãªãã®ã§ãããã«ã€ããŠè°è«ããå¿
èŠã¯ãããŸãããåé¡2ïŒå®å
šã§ãªãäœã¬ãã«ã³ãŒãã®èšè¿°
çµã¿èŸŒã¿ã·ã¹ãã çšã®ããã°ã©ã ãäœæããå¿
èŠãããå Žåãå®å
šã§ãªãã³ãŒãïŒå®å
šã§ãªããã£ã¹ããŸãã¯ã¢ãã¬ã¹æŒç®ã®äœ¿çšïŒã®äœæãé¿ããããšã¯ã»ãšãã©äžå¯èœã§ããCãŸãã¯C ++ã§ã¯ãå®å
šã§ãªãããšãè¡ãã®ã¯éåžžã«ç°¡åã§ãã0xFF
ã¢ãã¬ã¹0x1234
ã«æžã蟌ãããšã§LEDããªã³ã«ããå¿
èŠããããšä»®å®ãããšã次ã®ããšãã§ããŸãïŒïŒC / C ++ïŒïŒ * (uint8_t *) 0x1234 = 0xFF;
ããã¯éåžžã«å±éºã§ãããéåžžã«äœã¬ãã«ã®ã·ã¹ãã ããã°ã©ãã³ã°ã§ã®ã¿æå³ããªãã®ã§ãGoãHaskellãç°¡åã«å®è¡ã§ããŸããããããã¯ã·ã¹ãã ããã°ã©ãã³ã°èšèªã§ã¯ãããŸãããé©åãªã¢ãããŒãïŒå®å
šã§ãªãã³ãŒãã®åé¢
Rustã¯ãã»ãã¥ãªãã£ãšã·ã¹ãã ããã°ã©ãã³ã°ã®äž¡æ¹ãæåããŠãããããŒã«ã«å®å
šãªã³ãŒããããã¯[origããå®å
šã§ãªãã³ãŒããããã¯ã-çŽ ç¿»èš³è
]ãå±éºãªã³ãŒããå®å
šãªã³ãŒãããæç€ºçã«åé¢ããè¯ãæ¹æ³ãRustèšèªã®0xFF
äœæ0x1234
ã«ã¬ã³ãŒããããåãäŸã次ã«ç€ºããŸãïŒïŒRustïŒïŒ unsafe{ * (0x1234 as * mut u8) = 0xFF; }
å®å
šã§ãªãã³ãŒãã®ãããã¯ã®å€åŽã§ãããè¡ãããšãããšãã³ã³ãã€ã©ã¯å€§å£°ã§æããŸããããã«ãããçµã¿èŸŒã¿ã·ã¹ãã ã®ããã°ã©ãã³ã°ã«åºæã®ãåã³ã¯ãªããå¿
èŠãªå±éºãªæäœããã¹ãŠå®è¡ããªãããã³ãŒãã®ã»ãã¥ãªãã£ãæå€§éã«ç¶æã§ããŸããé²å
¥ã¢ãããŒãïŒãªã
Goã¯ãã®ãããªãã®ã«åãããŠèª¿æŽãããŠãããããããã«å¯Ÿããçµã¿èŸŒã¿ã®ãµããŒãããããŸãããããªãã¯ä»ã§ãèšãããšãã§ããŸããããªãGoã¯è¯ããªãã®ã§ããïŒããã¯èŠæ
ã®ãªã¹ãã§ããã©ã®èšèªã§ãæå¥ãèšãããšãã§ããŸãïŒãæ¬åœã§ããå®ç§ãªèšèªã¯ãããŸãããããããç§ã®ãã€ããã¯ãŸã ãããå°ã瀺ããããšãé¡ã£ãŠããŸãïŒ- Goã¯æ°ããããšã¯äœãããŸããã
- Goã¯èŠäºã«ãŒãããèšèšãããããã§ã¯ãããŸããã
- Goã¯ãä»ã®çŸä»£èšèªã«æ¯ã¹ãŠäžæ©åŸéããŠããŸãã