回答編集履歴
5
Colabの制約について追記
test
CHANGED
@@ -91,3 +91,43 @@
|
|
91
91
|
}
|
92
92
|
|
93
93
|
```
|
94
|
+
|
95
|
+
|
96
|
+
|
97
|
+
## 追記:Colabの制約
|
98
|
+
|
99
|
+
|
100
|
+
|
101
|
+
どのみちColabでは「RAWモードな標準入力」は使えない様です。
|
102
|
+
|
103
|
+
conio.h相当を再現するライブラリを持ってしても結局のところはColabの実行画面が対応できません。
|
104
|
+
|
105
|
+
|
106
|
+
|
107
|
+
Colabの実行画面で標準入力を読もうとするとテキスト入力フォームが現れ、
|
108
|
+
|
109
|
+
「改行を契機」に標準入力に投げ込むことしかできません。
|
110
|
+
|
111
|
+
つまり、普通にos.Stdinを「改行を契機」に読むしかできません。
|
112
|
+
|
113
|
+
以下の様な使い方でどうぞ。
|
114
|
+
|
115
|
+
(この方法だともちろん文字入力ごとに何かをするということはできません。)
|
116
|
+
|
117
|
+
```go
|
118
|
+
|
119
|
+
s := bufio.NewScanner(os.Stdin)
|
120
|
+
|
121
|
+
s.Scan()
|
122
|
+
|
123
|
+
fmt.Println(s.Text())
|
124
|
+
|
125
|
+
```
|
126
|
+
|
127
|
+
|
128
|
+
|
129
|
+
そもそもColabは主にPython向けの環境なのでGoを試す場としては向かないし、
|
130
|
+
|
131
|
+
GoやCGOを動かすのもあまりColagサービスの想定とは
|
132
|
+
|
133
|
+
ズレていてコンパイルできたり動かしたりできたのはたまたまだと思います。
|
4
typo-fix&NewTimerよりNewTickerがお勧め。
test
CHANGED
@@ -26,11 +26,11 @@
|
|
26
26
|
|
27
27
|
さらに、kbhit()相当は存在しないので、
|
28
28
|
|
29
|
-
「goroutineとchanでブロックするgetch
|
29
|
+
「goroutineとchanでブロックするgetch.Getch()を非同期処理に変換」します。
|
30
30
|
|
31
31
|
以下の様に書くとtimerと並行してキー入力を受け付けることができます。
|
32
32
|
|
33
|
-
|
33
|
+
(おまけでNewTimerをなんども呼ぶよりはNewTickerを使うほうがリソースに優しいです。)
|
34
34
|
|
35
35
|
```go
|
36
36
|
|
3
Getchを並行処理に置き換える方法を追記。
test
CHANGED
@@ -22,21 +22,71 @@
|
|
22
22
|
|
23
23
|
以下の様にサードパーティライブラリを使うことをお勧めします。
|
24
24
|
|
25
|
+
|
26
|
+
|
27
|
+
さらに、kbhit()相当は存在しないので、
|
28
|
+
|
29
|
+
「goroutineとchanでブロックするgetchar.Getch()を非同期処理に変換」します。
|
30
|
+
|
31
|
+
以下の様に書くとtimerと並行してキー入力を受け付けることができます。
|
32
|
+
|
33
|
+
|
34
|
+
|
25
35
|
```go
|
26
36
|
|
27
37
|
package main
|
28
38
|
|
29
39
|
|
30
40
|
|
41
|
+
import (
|
42
|
+
|
43
|
+
"fmt"
|
44
|
+
|
45
|
+
"time"
|
46
|
+
|
47
|
+
|
48
|
+
|
31
|
-
|
49
|
+
"github.com/wzshiming/getch"
|
50
|
+
|
51
|
+
)
|
32
52
|
|
33
53
|
|
34
54
|
|
35
55
|
func main() {
|
36
56
|
|
37
|
-
|
57
|
+
input := make(chan string)
|
38
58
|
|
59
|
+
go func() {
|
60
|
+
|
61
|
+
for {
|
62
|
+
|
63
|
+
r, _, _ := getch.Getch()
|
64
|
+
|
39
|
-
|
65
|
+
input <- string(r)
|
66
|
+
|
67
|
+
}
|
68
|
+
|
69
|
+
}()
|
70
|
+
|
71
|
+
timer := time.NewTicker(1000 * time.Millisecond)
|
72
|
+
|
73
|
+
for {
|
74
|
+
|
75
|
+
select {
|
76
|
+
|
77
|
+
case <-timer.C:
|
78
|
+
|
79
|
+
fmt.Println("tick!")
|
80
|
+
|
81
|
+
case v := <-input:
|
82
|
+
|
83
|
+
fmt.Println("input:", v)
|
84
|
+
|
85
|
+
return
|
86
|
+
|
87
|
+
}
|
88
|
+
|
89
|
+
}
|
40
90
|
|
41
91
|
}
|
42
92
|
|
2
おすすめ追記
test
CHANGED
@@ -11,3 +11,33 @@
|
|
11
11
|
|
12
12
|
|
13
13
|
[https://stackoverflow.com/questions/7469139/what-is-the-equivalent-to-getch-getche-in-linux](https://stackoverflow.com/questions/7469139/what-is-the-equivalent-to-getch-getche-in-linux)
|
14
|
+
|
15
|
+
|
16
|
+
|
17
|
+
## おすすめ追記
|
18
|
+
|
19
|
+
|
20
|
+
|
21
|
+
Cの資産に詳しい方ならCGOでも良いと思うのですが、そうでないなら
|
22
|
+
|
23
|
+
以下の様にサードパーティライブラリを使うことをお勧めします。
|
24
|
+
|
25
|
+
```go
|
26
|
+
|
27
|
+
package main
|
28
|
+
|
29
|
+
|
30
|
+
|
31
|
+
import "github.com/wzshiming/getch"
|
32
|
+
|
33
|
+
|
34
|
+
|
35
|
+
func main() {
|
36
|
+
|
37
|
+
r, b, err := getch.Getch()
|
38
|
+
|
39
|
+
println(r, b, err)
|
40
|
+
|
41
|
+
}
|
42
|
+
|
43
|
+
```
|
1
リンク修正
test
CHANGED
@@ -10,4 +10,4 @@
|
|
10
10
|
|
11
11
|
|
12
12
|
|
13
|
-
https://stackoverflow.com/questions/7469139/what-is-the-equivalent-to-getch-getche-in-linux
|
13
|
+
[https://stackoverflow.com/questions/7469139/what-is-the-equivalent-to-getch-getche-in-linux](https://stackoverflow.com/questions/7469139/what-is-the-equivalent-to-getch-getche-in-linux)
|