くどはむと猫の窓スマートフォン用の表示で見るくどはむと猫の窓この広告は、90日以上更新していないブログに表示しています。Golang前回のプログラムを改良してserverのIPとポート番号をハードコーディングではなくjsonファイルから取得できるようにしました。今回参考にしたサイトは以下です。Blog前回まではgolang.jpの方をまず最初に参考にしていたのですが、よく読んでいるとgolang.jpのosパッケージのOpen関数のシグネチャがgolang.orgのと違っていたりと、ちょっと信頼できるか怪しい?のでgolang.orgの方をまず最初に参考にするように変えました。それにしてもこれは情報が古いのか、OpenFile関数と間違えているのか、どうなんでしょう。Decoderのところにコード例が載っています。*DecoderNewDecoder関数はioパッケージのReaderインターフェースを実装している型の変数を引数に取り、Decoder型(のポインタ変数)を返すようです。errorさっき返ってきたDecoderをレシーバとするDecode関数で、引数は空インターフェースです。Goの型ならなんでも引数にしていいというわけですね。「Unmrshalのところも読めよ」と書いてあるので読んでみると、jsonの型は以下の6つのどれかになるはずだから、この中でベストな型にデコードする的なことが書かれています。Goにも書いてあり、ここでやっと「ああ、これと同じようなことが起きているのか」と分かりました。Decoderのところの例ではjsonの構造に合わせた構造体を定義し、その型の変数(ポインタ)を引数として渡していますが、これは引数として渡された構造体の変数名などの情報をもとに、型アサーションした結果が入れられているという感じでしょう。Go下の方に例が載っていますが、構造体を用意しなくても自分で型アサーションを使って値を振り分ける関数を書けば同じようなことができるようです。interface便利。いえ面倒なので例の通り構造体を使うことにしました。error)}となっています。このRead関数を実装している型ならよいのですね。僕はjsonデータをjsonファイルから読みたいと思っていますが、NewDecoderに渡せるでしょうか?まずは読みたいファイルを開く関数を探します。osパッケージのOpen関数がそれっぽいです。error)この関数は読み込んだファイルのファイルディスクリプタをFile型の変数として返します。このFile型については同じosパッケージ内に書かれています。error)ありました。ReaderインターフェースのRead関数と同じシグネチャです。いうことはFile型はReaderインターフェースを実装しているのでこれをNewDecoderに渡すことができそうですね。まとめると以下のような順序になります。jsonと同じ構造の構造体を定義するOpen関数でjsonファイルをオープンOpen関数で得たファイルディスクリプタをNewDecoderに渡すNewDecoderのDecode関数を呼び出す(引数は構造体の変数)ということでここまでの情報を元に改良したプログラムが以下になります。サーバ側サーバ側のjsonはシンプルです。"55555"}クライアント側クライアント側のjsonはこんな感じです。"55556"}}これでjsonから設定情報を読み込むということができるようになりました。他にもjsonに追加したくなったら構造体を修正してやればいいだけなので簡単ですね。DialTCP関数の第2引数をnilにすれば自動でローカルのIPと(空いてる)ポートを取ってくれるようなのでnilに変更しました。次の目標は、今サーバ用もクライアント用もコマンドを打ったディレクトリからjsonファイルを探すのでこれをどこから呼び出しても特定のディレクトリから探すようにすること、そして通信を暗号化して送るように改良したいなと思っています。その2前回、簡単な高階関数hogeを書きましたが、もう少しだけ分かっ...2015-09-26【Rust】高階関数を作るときのメモ最近Rustを触っています。前回のプログラムを改良してサーバ/クライアントが送信するメッ...2014-11-03【Golang】Socket通信するプログラムを書いてみた最近Go言語を勉強しています。kudohamuid:kudohamukudohamuといいます。プログラムについて勉強中の情報学徒。未熟者なので皆さんから色々教えていただきたいです。(9)月別アーカイブ参加グループプログラミングはてなブログをはじめよう!kudohamuさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。