回答編集履歴

5

Colabの制約について追記

2021/02/05 02:22

投稿

nobonobo
nobonobo

スコア3367

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がお勧め。

2021/02/05 02:22

投稿

nobonobo
nobonobo

スコア3367

test CHANGED
@@ -26,11 +26,11 @@
26
26
 
27
27
  さらに、kbhit()相当は存在しないので、
28
28
 
29
- 「goroutineとchanでブロックするgetchar.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を並行処理に置き換える方法を追記。

2021/02/01 12:30

投稿

nobonobo
nobonobo

スコア3367

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
- import "github.com/wzshiming/getch"
49
+ "github.com/wzshiming/getch"
50
+
51
+ )
32
52
 
33
53
 
34
54
 
35
55
  func main() {
36
56
 
37
- r, b, err := getch.Getch()
57
+ input := make(chan string)
38
58
 
59
+ go func() {
60
+
61
+ for {
62
+
63
+ r, _, _ := getch.Getch()
64
+
39
- println(r, b, err)
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

おすすめ追記

2021/02/01 12:27

投稿

nobonobo
nobonobo

スコア3367

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

リンク修正

2021/02/01 10:24

投稿

nobonobo
nobonobo

スコア3367

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)