20200520のGoに関する記事は5件です。

【Golang】エラーハンドリング

【Golang】エラーハンドリング

Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。

package main
//エラーハンドリング
//Goには例外機構がない。
//Goでは関数が複数の戻り値を返す特製を利用して、エラーが発生したかの処理を書ける。

import (
    //"fmt"
    "log"
    "os"
)

func main() {
    file, err := os.Open("./aaaaa.go")
    //もしエラーだったら
    if err != nil {
        //出力して終了
        log.Fatalln("Error!")
    }   
    //遅延でクローズ
    defer file.Close()
    //スライス作成
    data := make([]byte, 100)
    //100バイト分読み込み、スライスに追加
    count, err := file.Read(data)
    //なければエラー
    if err != nil {
        log.Fatalln("Error")
    }
    //文字列に変換して読み込みを表示
    fmt.Println(count, string(data))


    //errが何度も出てくるが、毎回上書きされている点に注意
    //err :=は最低でも左側(ここでいうfile,count)が定義されれば、エラーにならない。


    //Chdir ディレクトリ移動
    //エラーしか返さない場合は再定義はできない
    //:=にすると、再定義になる為エラーになる。
    //errしか返さない場合は、一行に省略できる
    if err = os.Chdir("test"); err != nil {
        log.Fatalln("Error")
    }   file.Close()
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Golang】for文の理解に苦戦した話 ※初心者向け

あいさつ

Masayuki.です。本記事が初投稿になります。
今年(令和2年)の3月から新米プログラマになり、約2ヶ月半が経過しました。
本当にあっという間だった。。。

まだ入社して日が浅く、社内で一人前になるために日々の学習は怠れません。なにも学習しなかった日の夜には身体が痒くなるレベルになってしまいました←

せっかく日々取り組んでいることがあるので、その備忘録をqiita記事に残すことで、ここにいる誰かの役に立てればと考えています。

今日はGoのfor文についてです。

main.go
Q1 . 以下のスライスから一番小さい数を探して出力するコードを書いてください

l := []int{100, 300, 23, 11, 23, 2, 4, 6, 4}

これはGoを独習で学び始めようと、やってみたカリキュラムの中で出題された問題です。

入社当時、これを見たときは
…?
となんのこっちゃわからず…

3分ぐらい考えた後に回答例を見ました。

main.go
func main() {
    l := []int{100, 300, 23, 11, 23, 2, 4, 6, 4}
    var min int

    for i, num := range l {
        if i == 0 {
            min = num
            continue
        }
        if min >= num { 
            min = num
        }
    }
    fmt.Println(min) //2が出力される。
}

...ん?なんで2が最小値だってわかったの?なにが起こったの?

恥ずかしながら、これが腹落ちするようになるまで私はかなりの時間を要してしまいました。

ポイントとして、このfor構文にはif文が2つあって、最初のif文

main.go
for i, num := range l {
if i == 0 {
    min = num
    continue
}

ここは処理が一回しか走らないということなんですね。

この辺を理解するには、スライスの概念を理解しておく必要があります。
簡単に説明すると、配列はあくまでも複数の要素を持った値なのに対し、スライスは配列の一部または全部を指し示す参照型のデータです。
例えば
a := [5]int{2, 10, 8, 15, 4}
[5]という配列にint型の値5つ渡しているのに対し、スライスは
a := []int{1, 3, 5, 7, 9}
[]と、中身は空です。この[]の中に値を追加したり変更したり、コピーできたりします。

今回はfor文についての記事なので詳しいスライスについての説明は割愛します。

※参考までに。
他言語プログラマがgolangの基本を押さえる為のまとめ

とすると、

for i, num := range l

ここのrangeでは、for文の中でlというスライスを取得してきてくれる役割があります。
それを i, num (インデックスと値)としてそれぞれ代入してくれてるんですね。

main.go
for i, num := range l {
 if i == 0 {
    min = num
    continue
}
 if min >= num { 
    min = num
        }
    }

そうすると、上のfor文の処理ではminにはインデックス[0]の値、100が代入されました。

下のfor文の処理では
if min >= num { //もしminがnum以上だったら
min = num //minにnumを代入
}
}

とすることで、
l := []int{100, 300, 23, 11, 23, 2, 4, 6, 4}
このスライスの値をfor文の繰り返し処理で一つずつ参照していって、numにminよりも小さい値がきたらそれがminに新たに代入されます。最終的には一番小さな値が代入されるはずです。

スライスの値の中で一番小さい値は2ですね。なので最終的には2が出力されます。

以上がこの問題の解説になります。

いかがでしたか?
ちなみに、Golang以外の他言語ではfor文以外にもwhile文とかありますが、Golangではfor文しかありません。シンプルですよね。

さいごに

業務未経験からGoを学び使えるようになることは、私のように元々RubyやRailsでコードを書いていた駆け出しエンジニアからすると困惑することや躓くポイントが沢山あります。
特にポインタ。

しかし、諦めずに理解できるまで学習に取り組めば必ず成長を感じる機会があります。やはり根気強く継続することは大切ですね。

今後も積極的にしてインプット・アウトプットしていきたいと思います。
最後まで読んでいただき、ありがとうございました!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Go言語入門[学習素材編]

TL;DR

どうも。シュウタといいます。
これからgolangの学習を始める方々に向けてお役に立てていただければと思い、学習素材等をまとめていきたいと思います。
LGTM数が増えれば更新していこうかなと思います。

無料編

Tour of Go

https://tour.golang.org/
https://go-tour-jp.appspot.com/

公式チュートリアルです。
ブラウザ上でコードの実行を試すことができます。

エクササイズ含めて大体100個ほどあります。

はじめてのGo言語

http://cuto.unirita.co.jp/gostudy/

僕は実際にこちらのサイトを順を追って進めた訳ではないのですが
golangでわからないことがある時にググった際、
ヒットすることは多かったです。

go.div

https://go.dev/
https://learn.go.dev/

goの学習素材が紹介されているサイトです。
現時点ではあまり見れていないのですが
有効性が高そうです。

Go by Example

サンプルコードを使ってgolangの学習をすることができます。
初見で利用するより言語仕様を一通り把握したあとや
実際にコードを書く際に利用すると良いです。

日本語・英語両方あります。

https://gobyexample.com/
https://oohira.github.io/gobyexample-jp/

Go Web プログラミング

https://astaxie.gitbooks.io/build-web-application-with-golang/content/ja/

初期設定からweb開発までカバーしているサイト。
これから使ってみたいと思っています。

Go code Review Comments

https://github.com/golang/go/wiki/CodeReviewComments
こちらはgolangの言語仕様を学ぶというより
コードの書き方を学ぶというニュアンスに近いかと思います。
一通り基礎を学んだ後に利用してみても良いかもしれません!

日本語訳はこちらです。
https://knsh14.github.io/translations/go-codereview-comments/

有料編

ドットインストール

https://dotinstall.com/

プログラミングを学習し始めて
もう何年か立ちますが未だに
新しく何かを学習する際にはドットインストールを利用することがあります。
基本を抑えるのにコスパが良いと思います。

2020年5月段階では下記の二つのコースがあります。

  • 初めてのGo言語[全10回]
  • Go言語入[全24回]

その他

The Go PlayGround

https://play.golang.org/

学習している際、実際にコードを書いて試したくなることも多いかと思います。
そんな時はこれです!
開発環境の構築無しでgolangのコードを試すことが可能です。

コミュニティのすすめ

Goエンジニアと繋がることで
モチベーションのアップや最新ニュースのキャッチアップを行うことができる機会も増えるでしょう!

Gophers Slack

https://invite.slack.golangbridge.org
世界のGoエンジニアがいるようです。
japanチャンネルに参加してみましょう。

golang.tokyo

Goを採用している企業の方々が運営しているコミュニティのようです。

最後に

質問やコメントもお待ちしています!
他にもこれ足してほしい!などの要望もがあればおっしゃっていただけると幸いです。
最高のGo学習まとめコンテンツつくりましょう!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

DiscordのBotをGo言語で書いてHerokuに乗せて常駐化した

記事を書いた経緯

  • 自分用のメモ感覚
  • DiscordのBotを自作した記事はたくさんあったが、Goで自作した記事Go×Heroku×Discordの記事という2つの条件を満たす記事が少なかったため

この記事の対象者

  • Go言語の基礎は分かる
  • Go言語でオリジナルのDiscordのBotを自作したい

※自作したBotのソースコードを全部載せるつもりはないので、どんな風に書けば良いかはググってみてください。

準備〜導入までのプロセス

  1. Herokuのアカウント作成
  2. DiscordのBotアカウントを作成 ※作り方は別の方の記事を参照
  3. コードを書く ※今回利用した外部パッケージ
  4. Botを常駐化させるために、プログラムをサーバー上で動かす(EC2とかGCEに乗せてもいいけど、今回はHerokuを採用)

プロセスの一部をもうちょっと詳しく

プロセスの1と2は、たくさん記事があるのでここで説明する必要はないかなと思います。

3. コードを書く について

今回利用させていただいた外部パッケージは、「DiscordGo」というパッケージです。
簡単に説明すると、DiscordGoパッケージ内に定義されている関数を呼び出すだけで、定義された関数に応じてDiscordのAPIを呼び出すことが出来る、Go言語向けに作成されたパッケージです。
DiscordGoの詳細はリンク先参照。

コードのサンプルは、discordgo/examples/pingpong/ とか discordgo/examples/airhorn/ が参考になるかなと思います。

4. Botを常駐化させるために、プログラムをサーバー上で動かす について

大前提として、無料でBotを常駐化させたいという思いがありました。
なので、EC2でもGCEでも良かったのですが、EC2は以前Minecraftのサーバーを建てた時に使ったので今回はスルーして、GCPかHerokuかの選択肢でした。
そして今回はBot(アプリケーション)を動かすだけだったので、HerokuのDynoを採用しました。
※Dynoの無料枠がクレカ未登録で550h/月、クレカ登録後で1000h/月です。クレカ未登録では1ヶ月フル稼働は出来ないことに注意。

今回はGoで書いたアプリをGithubにあげて、GithubとHerokuを連携して自動デプロイ出来る環境を整えました。
やり方としては、コチラの記事を参考に進めてください。
今回僕が用意したファイルは、以下4つの最低限だけです。
- Procfile
- README.md
- main.go
- go.mod
各ファイルの中身は以下のような感じです。

Procfile
worker: discord_bot_atsumori
README.md
// githubのリポジトリの説明欄に表示したい文章を書いてください
main.go
package main

import (
    "fmt"
    "github.com/bwmarrin/discordgo"
    "os"
    "os/signal"
    "syscall"
)

const (
    TOKEN = "YOUR TOKEN"
...
...
...
go.mod
module github.com/Satoshi-sts/YOUR_REPOSITORY

go 1.13

require github.com/bwmarrin/discordgo v0.20.3

あとはWebUIもしくはターミナルなどでコマンドを叩いてDynoを起動すれば完了です。

最後に

作業が完了した後にこの記事を書いたので、もしかしたら抜けてる部分があるかもしれません...。
その時はごめんなさい、コメントで教えていただけるとありがたいです。

お疲れ様でした。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

「新型コロナウイルスにも負けない明るい投稿を促したい!」Webサイトを作ってみた

この記事の"目的"と"思い"

新型コロナウイルスの感染が拡大してきた当初、悲しいニュースや不安なニュースが溢れていました。これは仕方のないことですが、それを見るたびに、暗い気持ちになってしまっていました。
けれど、心まで暗くなっては前に進むのも難しくなっていってしまうと思いました。どんなに厳しい状況でも見渡すと明るいニュースやプラスに捉えることのできることはあると思います。だから、その投稿を促すことはできないかと思い、今回Webサイトを作りました。

つい先日一部地域を除き緊急事態宣言が解除されましたが、未だ完全に収束したとは言えず、気は抜けない状況が続いています。医療従事者の方は、長期に渡って厳しい中で闘う状況が続いています。

感染者が少なくなっている今では、あまり力にはなれないかもしれないけれど、少し勇気を出して公開してみることにしました。

今回この記事では、以下を中心に記載したいと思います。

  • どんなサイトを作ったのか
  • つまづいたところ

※なお、筆者は今までIT業界(主に上流工程)で働いていましたが、Webは初めてで今回初めてWebサイトを作りました。そのため、言葉など間違っているかもしれないですが、その点は遠慮なくご指摘いただけると幸いです。

作ったWebサイトについて

「身近な明るい投稿は、きっと誰かのあと1歩前に進む力になる」という考えをベースに、
SNSへの投稿ボタン、特定のハッシュタグがついた投稿の表示 この2つを実現しました。
https://plusplus.tokyo
(理想は、このWebサイトを見れば明るい投稿が溢れている状態でした。、、、理想は。)

sample.png

実現した方法について

半ば無理やりですが、今回は、
WordPressでページの大半を作成して、ツイッター表示の部分だけGoを使ってHTMLを吐き出す。これをWordPressで読み込む様にしました。
(本当はリアルタイムでTwitter部分を表示したかったのですが、APIの利用制限の都合上断念)

イメージとしては、こんな感じです↓

image.png

環境などについて

環境、使用ツール、言語などは以下の通りです。

環境、ツールなど 補足 参考にさせてもらったサイト(抜粋)
aws lightsail 当初はlolipopサーバをレンタルしていたが変更(理由は後ほど) ドメイン設定 https://hacknote.jp/archives/44586/
SSL化 https://lightsail.aws.amazon.com/ls/docs/ja_jp/articles/amazon-lightsail-using-lets-encrypt-certificates-with-wordpress
(結構Amazonのドキュメントが丁寧でした。他のサイトを参考にやっても上手くやってもいかず結局amazonのドキュメントに戻ってきました。)
WordPress 5.4.1 初めてWebページを作るということもあったため lightsailからの設定 https://www.karelie.net/aws-lightsail-build-wordpress-ssl/
外部HTMLの埋め込み http://ailaby.com/inc_html/
他は、ひたすら触って、疑問はGoogleで調べて試しての繰り返し
Go 1.14.2 当初使う予定はなかったが、特定のハッシュタグを表示する部分で使用
※パッケージは、ChimeraCoder/anacondaを使用
Twitter APIを使う方法 https://rightcode.co.jp/blog/information-technology/golang-introduction-twitter-api
TwitterAPIからの情報をHTMLへ落とし込む https://rightcode.co.jp/blog/information-technology/golang-introduction-twitter-api
Twitter API 特定のハッシュタグで検索した結果を表示したかったため Developer登録 https://digitalnavi.net/internet/3072/
APIの使い方 https://developer.twitter.com/en/docs/tweets/search/overview

つまづいたところ

ただ、先に記載した様に初めてWebサイトを1から作ったということもあって、想定を遥かに超える時間を要してしまいました。(色々と想定できていなかったことも多かった、、、)

1) Twitter タイムライン表示

だいぶ前にTwitterのウィジェットを使ったことがあり、それを利用して表示しようと思っていたのですが、Twitterのタイムライン検索ウィジェットは2018年に廃止されており、Twitter APIを使って検索から表示を自力で行う必要が出てきた。
(それを使えばちょちょいだ!と思った私が甘かった、、、)

2) レンタルサーバ

どこにするのか悩みましたが、検索し当初はlolipopを契約しました。
しかし、実現にあたり、Twitter APIを利用したタイムライン表示のためにGo言語をインストール必要が出てきました。
(Go言語でなくても可能ですが、Go言語を勉強中なのでせっかくなら使いたかった)
その上で、lolipopなどのレンタルサーバでは懸念(他の利用者への迷惑やそもそもサポートしているのか不明)があったため、aws lightsailへ変更しました。
(もちろんWordPressも移し替えが必要になりました。私の場合は、ページ数が少ないということもあり作り直しました。)

また、最近はawsを使ったサービスがとても多くなっているため、awsは触っておきたかった。

3) WordPress

初めて使いましたが、確かに直感的で分かりやすく、SEOなどの心配が不要などのメリットがある一方で、ブラックボックスで途端にメジャーでないことをしようとすると、つまづく。そういった印象でした。
確かにモダン?なデザインになったかもしれないですが、ソースを見ると恐ろしくごちゃごちゃしている状態になっていると思います。
きっともっとシンプルにかけるはず。

本来であればスピードを上げないといけないのに、引っかかってしまいかなりの時間を要してしまいました。
WordPressを使うのか、はたまた他の製品を使うのか、1から自力で作るのかは、最初に冷静に考えた方がいいかもしれないなと思いました。

最後に

ここには書ききれない程の本当にたくさんのことに引っ掛かりました。
しかし、その度に先人が残した記事に救ってもらい、ようやく公開できるまで漕ぎ着けました。
先に参考にさせてもらったサイトを記載しましたが、ほんの一部を抜粋した状態です。
記事を残すことの偉大さと大変さを身を持って感じた次第です。

長々と書きましたが、今回作成したWebページとこの記事には大きな力はないかもしれないですが
1人でも多くの人の前を向く1歩になれれば、本当に嬉しく思います。

よし、またGo言語の勉強がんばろっと!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む