Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Kadai2 shuheiktgw #33

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

shuheiktgw
Copy link

@shuheiktgw shuheiktgw commented Nov 19, 2018

io.Readerとio.Writerについて調べてみよう

標準パッケージでどのように使われているか

io.Reader
io.Readerは以下のように宣言されたインターフェイス

type Reader interface {
        Read(p []byte) (n int, err error)
}

読み込んだ内容を保存するためのbyte列pを引数として受け取り, 実際に読み込んだbyte数 n とエラーを返す.

io.Writer
io.Writerは以下のように宣言されたインターフェイス

type Writer interface {
        Write(p []byte) (n int, err error)
}

書き込みたいbyte列pを引数として受け取り,実際に書き込んだbyte数 n とエラーを返す.

io.Reader, io.Writerを満たす構造体の例

  • os.Stdin / os.Stdout
  • os.File
  • net.Conn
  • bytes.Buffer
  • http.ResponseReader / http.ResponseWriter

io.Readerとio.Writerがあることでどういう利点があるのか具体例を挙げて考えてみる

  1. OSはソケットや標準入出力など,本来的な意味でのファイルではないものを"ファイル"と呼び,open, write, read, closeといった抽象化されたインターフェイスを通じて,実装の詳細を隠蔽した状態で操作できるようになっている.Goではこのインターフェイスを言語レベルで踏襲することによって,言語の利用者に期待する挙動を伝えている.

  2. インターフェイスの中で共通した振る舞いを一つの関数として提供することで冗長性を排除できる. 例えば ioutil.ReadAll などはその好例. ioutil.ReadAllio.Reader を引数として受け取り, その中身を全て読みだすための関数だが, もしインターフェイスがなければ, os.File のための ReadAllbytes.Buffer のための ReadAll を書かなくはならない.

1回目の宿題のテストを作ってみて下さい

  • テストのしやすさを考えてリファクタリングしてみる
  • テストのカバレッジを取ってみる
  • テーブル駆動テストを行う
  • テストヘルパーを作ってみる

@tenntenn tenntenn added the kadai2 課題2 label Nov 19, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
kadai2 課題2
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants