溝口 泰成

IT業界人(フリーランス)です。 ソフトバンクホークスを30年以上応援しています。 毒親育ちのアダルトチルドレンです。 吃音障害者です。

溝口 泰成

IT業界人(フリーランス)です。 ソフトバンクホークスを30年以上応援しています。 毒親育ちのアダルトチルドレンです。 吃音障害者です。

マガジン

  • Go言語学習

    Go言語についての学習メモ

  • 仕事

    主にIT関連の仕事におけるノウハウなどを記載した記事を公開します。

  • 毒親エピソード

    18歳になるまでに毒親からどういう扱いを受けてきたかを思い出せる範囲で投稿します

  • ITフリーランスの現実

    IT業界でフリーランスとして仕事をしていて実際に起こったことや困ったことを紹介していきます。

最近の記事

Go言語学習その35~Goroutineその6:排他制御

前回 ( https://note.com/yasmizohawks/n/ncaab0a36736c ) に引き続き Go における並行処理を実現する Goroutine を見てみます。 ■ 排他制御 複数の関数がそれぞれ別の Goroutine 上で動くとき、 各関数が同じ変数を更新するといった場合は排他制御が必要になります。 以下に排他制御無しの場合のサンプルを示します。 package mainimport ( "fmt" "time" "sync")var s

    • Go言語学習その34~Goroutineその5:チャネルその4

      前回 ( https://note.com/yasmizohawks/n/nd8c25e2c5481 ) に引き続き Go における並行処理を実現する Goroutine を見てみます。 ■ select によるチャネル受信 前回までは1つのチャネルでの送受信を見てきましたが、 複数の関数を複数の Goroutine 上で起動し 複数のチャネルでそれぞれの関数との送受信をやることがあると思います。 以下のサンプルを見てみましょう。 package mainimport

      • Go言語学習その33~Goroutineその4:チャネルその3

        前回 ( https://note.com/yasmizohawks/n/nfbd553c7a470 ) に引き続き Go における並行処理を実現する Goroutine を見てみます。 ■ チャネルの close 別の Goroutine で起動した関数からチャネルで受信するデータ件数が 確定していない、実行時に動的に決まる、といったケースがあります。 この場合、送るデータがもう無くなったときに チャネル送信側からチャネル受信側に 「送るデータがもう無いよ」ということ

        • Go言語学習その32~Goroutineその3:チャネルその2

          前回 ( https://note.com/yasmizohawks/n/n9892a86b0b02 ) に引き続き Go における並行処理を実現する Goroutine を見てみます。 ■ チャネルの送信の待機 前回 ( https://note.com/yasmizohawks/n/n9892a86b0b02 ) は チャネルの受信側で データが受信されるまで処理が待機されることを確認しましたが、 では送信側はどうなのでしょうか? 確認のために以下のサンプルを作成し

        マガジン

        • Go言語学習
          35本
        • 仕事
          3本
        • 毒親エピソード
          3本
        • ITフリーランスの現実
          2本

        記事

          Go言語学習その31~Goroutineその2:チャネルその1

          前回 ( https://note.com/yasmizohawks/n/n4e0d3ab3ee85 ) に引き続き Go における並行処理を実現する Goroutine を見てみます。 ■ 別の Goroutine 上の実行関数から値を戻すには 通常、関数の戻り値を受け取る場合は rtn := funcA() としますね。 変数 rtn に戻り値が格納されるイメージです。 では、別の Goroutine 上で関数を動かした場合、 その関数からの戻り値を同じように rt

          Go言語学習その31~Goroutineその2:チャネルその1

          Go言語学習その30~Goroutineその1

          Go における並行処理を実現する Goroutine を見てみます。 ■ Goroutine で関数を並行実行 Go の処理は関数単位で動くわけですが 関数は Go のランタイムが管理するスレッドである Goroutine 上で動きます。 Go の処理は必ず main 関数から始まりますが この main 関数も Goroutine 上で動いていて、 main 関数から呼ばれる関数もデフォルトでは main 関数と同じ Goroutine 上で動きます。 まず、以下の

          Go言語学習その30~Goroutineその1

          Go言語学習その29~エラー処理その2:panicとrecover

          前回 (https://note.com/yasmizohawks/n/n444b24fe9ac6) に引き続き Go におけるエラー処理を見てみます。 ■ panic で強制終了 致命的な技術的エラーや データベースのデータがあってはならないものになっているなどで アプリケーションの処理を強制終了させて 原因の調査や対応を行いたいことがあるかと思います。 「アプリケーションを強制終了させる」機能として Go には panic 関数が用意されています。 以下にサンプル

          Go言語学習その29~エラー処理その2:panicとrecover

          Go言語学習その28~エラー処理その1:error インタフェース

          Go におけるエラー処理を見てみます。 ■ 関数の戻り値でエラー情報を返す Go には、Java での try ~ throw ~ catch を使った 例外処理の仕組みがありません。 Go と同様に例外処理の仕組みが無い C言語と同様に 「関数の戻り値でエラー情報を返す」 ようにし、 関数を呼び出した側でそのエラー情報を参照して エラー対応を行います。 サンプルを以下に示します。 package mainimport ( "fmt")// ファイルアクセス時に発生し

          Go言語学習その28~エラー処理その1:error インタフェース

          Go言語学習その27~インタフェースその3:interface{}型

          前回 ( https://note.com/yasmizohawks/n/nce539f43180c ) に引き続き Go のインタフェースについて見てみます。 ■ 空のインタフェースを使った任意型指定 メソッドを定義しないインタフェースを変数の型として使用できます。 以下にサンプルを示します。 package mainimport ( "fmt")func main() { var i interface{} anyArgType(i) i = 10 anyArgTy

          Go言語学習その27~インタフェースその3:interface{}型

          Go言語学習その26~インタフェースその2

          前回 ( https://note.com/yasmizohawks/n/n7547bbd4fcb6 ) に引き続き Go のインタフェースについて見てみます。 ■ インタフェースに nil が設定されたら 以下のサンプルを実行してみます。 package mainimport ( "fmt" "strconv")// 動物インタフェース定義type Animal interface { MakeSound() string}// Dog構造体定義type Dog st

          Go言語学習その26~インタフェースその2

          Go言語学習その25~インタフェースその1

          今回は、従来のオブジェクト指向言語のものとはちょっと違う Go のインタフェースについて見てみます。 ■ Go は「オブジェクト指向言語」を別の形に置き換えたもの? 私自身、Go言語の学習中なので全てをつかめてはいませんが 現時点の私の Go の印象は 「オブジェクト指向言語の実装機能を別の形に置き換えたもの」 になっているのでは?と感じています。 オブジェクト指向言語の定義 オブジェクト指向言語とは以下のコードの記載ができるものかと 思います。 1.クラスを作成できる

          Go言語学習その25~インタフェースその1

          Go言語学習その24~defer

          今回は、「関数の処理の最後に必ず実施したい」処理を定義する defer について見てみます。 ■ defer の基本 まずはシンプルに、main 関数内のみでファイルアクセス処理を実施する イメージのコードを以下に示します。 func main() {  fmt.Println("ファイルを開きます")  defer fmt.Println("ファイルを閉じます")  fmt.Println("ファイル内のデータを使って何かします") } defer は以下のようにし

          Go言語学習その24~defer

          Go言語学習その23~for ループ

          どの言語にも出てくる繰り返し処理、いわゆる「ループ処理」ですが Go のループは for ループのみになります。 Go の for ループについて見ていきます。 以下にサンプルを示します。 package mainimport ( "fmt")func main() { // ループカウンタ指定 fmt.Println("■ループカウンタ指定") for i := 0; i < 10; i++ { fmt.Println("★ループカウンタ", i) } // 条件がt

          Go言語学習その23~for ループ

          Go言語学習その22~条件分岐:switch 文

          今回はJavaやC言語にも存在する「switch 文」の Go での記述を見てみます。 以下にサンプルを示します。 package mainimport ( "fmt")func main() { // 数値でswitch fmt.Println("■ 数値でswitch")// a := 10 a := 20// a := 30 switch a { case 10: fmt.Println("a の値は10です") case 20: fmt.Println("a

          Go言語学習その22~条件分岐:switch 文

          Go言語学習その21~条件分岐:if 文

          今回はどの言語でも出てくるおなじみ「if 文」の Go での記述を見てみます。 以下にサンプルを示します。 package mainimport ( "fmt" "math")func main() {// a := true a := false if a { fmt.Println("aはtrueです") } else { fmt.Println("aはfalseです") } // x := 10 x := 30// x := 20 y := 20 if x <

          Go言語学習その21~条件分岐:if 文

          Go言語学習その20~マップ

          今回は他の言語でもよく使うマップについて見てみます。 ■マップ型の変数宣言いろいろ マップは、キーとそれに対するバリューのコレクションで、 JavaでいうHashMapに該当するものです。 配列は a[0] = 1 a[1] = 2 のように、インデックス(数値)に対してバリューを設定するものですが マップは m["one"] = 1 m["two"] = 2 のように、 配列でのインデックス部分に数値以外のものが指定できるようになる イメージですね。 Goでのマッ

          Go言語学習その20~マップ