MasaのITC Life

夢は起業家!全てにおいて凡人だけど頑張ることだけはいっちょ前!

プログラミング

【Go】ReflectでMulitipart.FileHeaderのプライベートフィールドにアクセスする!

投稿日:



MultipartパッケージのFileHeaderの

プライベートフィールドに

アクセスする機会があったので、

その時のメモになります。



この手法はFileHeaderだけでなく、

他の構造体でも適用できるので便利です。




まずはFileHeaderの確認です。


下2つのcontentとtmpfileは、

プライベートフィールドで、

コーディングしている段階では

アクセスできません。



アクセスしようとすると、

未定義でコンパイルエラーになります。



プログラムが動いているときにしか

アクセス出来ないということです。




「ではどうすればいいん?」

という話ですが、

そこでReflectパッケージの登場です。



そう。これを使えば、

何でもアクセス出来てしまいます。



とりあえず全体のコードを見てみましょう。



クライアントが複数のファイルを

サーバ(Go)に送信してきて、

そのファイル情報を取得しようとする

というシナリオです。






クライアント側(HTML)





サーバ(Go)



まずReflectパッケージの

Valueof()にFileHeader構造体を渡します。



そうすると、

Value型構造体となって戻ってきます。



Value構造体は、ValueOf()に渡した

引数(FileHeader)のコピーみたいなものです。

格納されている値だけでなく、

型情報も含まれています。




次に、Elem().FieldByName("content")で

FileHeaderの中の"content"を指定します。

contentはバイトのスライスですので、

.Bytes()で実際の中身が取得できます。



tmpFileもcontentと同様ですが、

string型ですので最後の部分だけ、

.string() になりますのでご注意下さい。




実はたったこれだけで、

unexpected Field にアクセス出来ます。



その他の記述は、FileHeaderを

自分で再定義しているだけですので、

今回のポイントとは関係ないです。




-プログラミング

Copyright© MasaのITC Life , 2023 All Rights Reserved Powered by STINGER.