こんにちは。KOUKIです。
とある企業でWeb開発業務に携わっています。
Udemyの「Go Bootcamp: Master Golang W/1k+Exercises and Projects」にて、Go言語のデジタル時計の作り方が紹介されていたので、この記事で紹介したいと思います。※このコース、めっちゃわかりやすいのでオススメです!
<目次>
ワークスペース
ワークスペースを確保しましょう。
1 2 3 4 5 6 |
mkdir digit cd digit/ touch main.go go mod init digit go get -u github.com/inancgumus/screen |
実装
早速実装をしていきましょう。
時計のプレイスホルダーの実装
まずは、時計のプレイスホルダーを実装します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
package main func main() { // 時計を作成 // プレイスホルダーを定義する type placeholder [5]string // 0 - 9の配列を用意 zero := placeholder{ "███", "█ █", "█ █", "█ █", "███", } one := placeholder{ "██ ", " █ ", " █ ", " █ ", "███", } two := placeholder{ "███", " █", "███", "█ ", "███", } three := placeholder{ "███", " █", "███", " █", "███", } four := placeholder{ "█ █", "█ █", "███", " █", " █", } five := placeholder{ "███", "█ ", "███", " █", "███", } six := placeholder{ "███", "█ ", "███", "█ █", "███", } seven := placeholder{ "███", " █", " █", " █", " █", } eight := placeholder{ "███", "█ █", "███", "█ █", "███", } nine := placeholder{ "███", "█ █", "███", " █", "███", } } |
これが画面に表示される数字の元になります。
プレイスホルダーを表示する
先ほど設定したプレイスホルダーを表示してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
package main import "fmt" func main() { ... // 時計を格納する digits := [...]placeholder{ zero, one, two, three, four, five, six, seven, eight, nine, } // 時計を表示する for _, digit := range digits { for _, line := range digit { fmt.Println(line) } fmt.Println("") } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
$ go run main.go ███ █ █ █ █ █ █ ███ ██ █ █ █ ███ ███ █ ███ █ ███ ███ █ ███ █ ███ █ █ █ █ ███ █ █ ███ █ ███ █ ███ ███ █ ███ █ █ ███ ███ █ █ █ █ ███ █ █ ███ █ █ ███ ███ █ █ ███ █ ███ |
表示することができましたが、縦並びですね。横一列に表示させたいです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
package main import "fmt" func main() { ... // 時計を表示する for line := range digits[0] { for digit := range digits { fmt.Print(digits[digit][line], " ") } fmt.Println() } } |
1 2 3 4 5 6 |
$ go run main.go ███ ██ ███ ███ █ █ ███ ███ ███ ███ ███ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ ███ ███ ███ ███ ███ █ ███ ███ █ █ █ █ █ █ █ █ █ █ █ █ █ ███ ███ ███ ███ █ ███ ███ █ ███ ███ |
表示できました!
「type placeholder [5]string」は、もともと5つの要素をもつ配列でした。そのためdigits[0]とするとループが5回まわります。
その後、digitsに格納されている全ての要素をループし、一列ずつ表示していきます。
1 2 3 4 5 6 7 8 9 |
███ ██ ███ ███ █ █ ███ ███ ███ ███ ███ <- 1回目のループ █ █ █ █ █ █ █ █ █ █ █ █ █ █ <- 2回目のループ █ █ █ ███ ███ ███ ███ ███ █ ███ ███ <- 3回目のループ █ █ █ █ █ █ █ █ █ █ █ █ █ <- 4回目のループ ███ ███ ███ ███ █ ███ ███ █ ███ ███ <- 5回目のループ |
時間の取得処理
次は、時間の取得処理を実装します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
package main import ( "fmt" "time" ) func main() { ... // : を作成する colon := placeholder{ " ", " ░ ", " ", " ░ ", " ", } // 現在時刻を取得する now := time.Now() hour, min, sec := now.Hour(), now.Minute(), now.Second() // 12:14:01のような文字列を画面に表示させたい clock := [...]placeholder{ // 12時の場合, 1 - 2が格納 digits[hour/10], digits[hour%10], colon, digits[min/10], digits[min%10], colon, digits[sec/10], digits[sec%10], } // 時計を表示する for line := range clock[0] { for digit := range clock { fmt.Print(clock[digit][line], " ") } fmt.Println() } } |
1 2 3 4 5 6 |
$ go run main.go ██ ███ ███ ███ █ █ █ █ █ █ ░ █ █ █ ░ █ █ █ █ █ ███ ███ █ █ ███ ███ █ █ ░ █ █ █ ░ █ █ ███ ███ ███ ███ █ █ |
こんな感じで表示されます。
最初に時刻を取得し、clock変数の中に対応する数値の配列を格納します。これは、[8][5]の二次元sliceになっています。この辺りは少しわかりづらいですね。
1 2 3 4 5 6 |
1 2 3 4 5 6 7 8 ██ ███ ███ ███ █ █ █ █ 1 █ █ ░ █ █ █ ░ █ █ █ █ 2 █ ███ ███ █ █ ███ ███ 3 █ █ ░ █ █ █ ░ █ █ 4 ███ ███ ███ ███ █ █ 5 |
アニメーションにする
現在時刻が表示できるようになったので、最後はアニメーション化しましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
package main import ( "fmt" "time" "github.com/inancgumus/screen" ) func main() { ... // terminal上に出力してある文字列を消す screen.Clear() // 時計を継続表示するために、無限ループに入れる for { // 出力をトップに持ってくる screen.MoveTopLeft() // 現在時刻を取得する now := time.Now() hour, min, sec := now.Hour(), now.Minute(), now.Second() // 12:14:01のような文字列を画面に表示させたい clock := [...]placeholder{ // 12時の場合, 1 - 2が格納 digits[hour/10], digits[hour%10], colon, digits[min/10], digits[min%10], colon, digits[sec/10], digits[sec%10], } // 時計を表示する for line := range clock[0] { for index, digit := range clock { // : を点滅させる処理 next := clock[index][line] if digit == colon && sec%2 == 0 { next = " " } fmt.Print(next, " ") } fmt.Println() } fmt.Println() // 1秒毎に停止 time.Sleep(time.Second) } } |
時計の時刻を継続して表示させるために、for文で無限ループを作り、1秒毎に時刻を出力するように変更しました。
そしてscreenパッケージを使って、時計が出力される際に、前回出力した内容を削除する処理を入れています。
これで完了です!
おわりに
アイデア次第で、こんな実装も可能なのかと感心しました。自分でもこういう物を作れるような開発者になりたいですね^^
それでは、また!
Go記事まとめ
オススメ書籍
実装コード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 |
package main import ( "fmt" "time" "github.com/inancgumus/screen" ) func main() { // 時計を作成 // プレイスホルダーを定義する type placeholder [5]string // 0 - 9の配列を用意 zero := placeholder{ "███", "█ █", "█ █", "█ █", "███", } one := placeholder{ "██ ", " █ ", " █ ", " █ ", "███", } two := placeholder{ "███", " █", "███", "█ ", "███", } three := placeholder{ "███", " █", "███", " █", "███", } four := placeholder{ "█ █", "█ █", "███", " █", " █", } five := placeholder{ "███", "█ ", "███", " █", "███", } six := placeholder{ "███", "█ ", "███", "█ █", "███", } seven := placeholder{ "███", " █", " █", " █", " █", } eight := placeholder{ "███", "█ █", "███", "█ █", "███", } nine := placeholder{ "███", "█ █", "███", " █", "███", } // : を作成する colon := placeholder{ " ", " ░ ", " ", " ░ ", " ", } // 時計を格納する digits := [...]placeholder{ zero, one, two, three, four, five, six, seven, eight, nine, } // terminal上に出力してある文字列を消す screen.Clear() // 時計を継続表示するために、無限ループに入れる for { // 出力をトップに持ってくる screen.MoveTopLeft() // 現在時刻を取得する now := time.Now() hour, min, sec := now.Hour(), now.Minute(), now.Second() // 12:14:01のような文字列を画面に表示させたい clock := [...]placeholder{ // 12時の場合, 1 - 2が格納 digits[hour/10], digits[hour%10], colon, digits[min/10], digits[min%10], colon, digits[sec/10], digits[sec%10], } // 時計を表示する for line := range clock[0] { for index, digit := range clock { // : を点滅させる処理 next := clock[index][line] if digit == colon && sec%2 == 0 { next = " " } fmt.Print(next, " ") } fmt.Println() } fmt.Println() // 1秒毎に停止 time.Sleep(time.Second) } } |
最近のコメント