標準ライブラリの主要インターフェース
fmt.Stringer、io.Reader、io.Writer
「標準ライブラリの主要インターフェース」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。
fmt.Stringer
fmt.Stringerはメソッドを1つ持ちます: String() string。これを実装すると、fmt.Printlnや%vで型をどのように表示するかを制御できます:
package main
import "fmt"
type Color int
const (Red Color = iota; Green; Blue)
func (c Color) String() string {
return []string{"Red","Green","Blue"}[c]
}
func main() {
fmt.Println(Red, Green, Blue) // Red Green Blue
}errorインターフェース
組み込みのerrorインターフェースはメソッドを1つ持ちます: Error() string。これを実装する型は、エラーとして使用できます:
package main
import "fmt"
type ValidationError struct{ Field, Msg string }
func (e *ValidationError) Error() string {
return e.Field + ": " + e.Msg
}
func validate(age int) error {
if age < 0 { return &ValidationError{"age", "must be non-negative"} }
return nil
}
func main() {
fmt.Println(validate(-1))
}io.Reader
io.Readerはメソッドを1つ持ちます: Read(p []byte) (n int, err error)。ファイル、HTTPボディ、文字列、バッファはすべてこれを実装しています:
package main
import ("fmt"; "strings")
func countBytes(r interface{ Read([]byte)(int,error) }) int {
buf := make([]byte, 512)
total := 0
for {
n, err := r.Read(buf)
total += n
if err != nil { break }
}
return total
}
func main() {
r := strings.NewReader("hello world")
fmt.Println(countBytes(r)) // 11
}io.Writer
io.Writerはメソッドを1つ持ちます: Write(p []byte) (n int, err error)。fmt.Fprintf、ロギング、HTTPレスポンスライターなどで使われます:
package main
import ("bytes"; "fmt")
func main() {
var buf bytes.Buffer
fmt.Fprintf(&buf, "Hello, %s!", "Go")
fmt.Println(buf.String()) // Hello, Go!
}io.ReadWriterとio.Closer
標準ライブラリでは、小さなインターフェースを組み合わせて、より大きなインターフェースを作ります:
package main
import "io"
// io.ReadWriter = io.Reader + io.Writer
// io.ReadCloser = io.Reader + io.Closer
// io.ReadWriteCloser = all three
func process(rw io.ReadWriter) {
buf := make([]byte, 8)
rw.Read(buf)
rw.Write(buf)
}
func main() { _ = process }sort.Interface
sort.Interfaceには、Len() int、Less(i, j int) bool、Swap(i, j int)が必要です:
package main
import ("fmt"; "sort")
type ByLength []string
func (b ByLength) Len() int { return len(b) }
func (b ByLength) Less(i, j int) bool { return len(b[i]) < len(b[j]) }
func (b ByLength) Swap(i, j int) { b[i], b[j] = b[j], b[i] }
func main() {
fruits := ByLength{"banana","apple","kiwi"}
sort.Sort(fruits)
fmt.Println([]string(fruits)) // [kiwi apple banana]
}http.Handler
http.Handlerはメソッドを1つ持ちます: ServeHTTP(ResponseWriter, *Request)。GoのHTTPスタックはすべて、この単一のインターフェースを基盤に構築されています:
package main
import ("fmt"; "net/http")
type Hello struct{}
func (h Hello) ServeHTTP(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Hello, World!")
}
func main() {
http.ListenAndServe(":8080", Hello{})
}fmt.GoStringer
GoString() stringを実装すると、型の%#v(Go構文)表現を制御できます:
package main
import "fmt"
type Version struct{ Major, Minor int }
func (v Version) GoString() string {
return fmt.Sprintf("Version{%d, %d}", v.Major, v.Minor)
}
func main() {
fmt.Printf("%#v\n", Version{1, 18}) // Version{1, 18}
}encoding.TextMarshaler
独自のテキストエンコーディング(JSON文字列、YAMLなど)には、MarshalText() ([]byte, error)とUnmarshalText([]byte) errorを実装します:
package main
import "fmt"
type Status int
const (Active Status = iota; Inactive)
func (s Status) MarshalText() ([]byte, error) {
if s == Active { return []byte("active"), nil }
return []byte("inactive"), nil
}
func main() {
s := Active
b, _ := s.MarshalText()
fmt.Println(string(b)) // active
}標準インターフェースの組み合わせ
io.TeeReaderやio.MultiWriterなどを使って標準インターフェースを組み合わせると、新しい型を作成せずに強力なパイプラインを構築できます:
package main
import ("bytes"; "fmt"; "io"; "strings")
func main() {
r := strings.NewReader("hello")
var buf bytes.Buffer
tee := io.TeeReader(r, &buf)
io.ReadAll(tee)
fmt.Println(buf.String()) // hello
}確認問題
Goで型をエラーとして使うには、どのインターフェースを実装する必要がありますか?
まとめ
標準ライブラリの主要なインターフェース:
fmt.Stringer— カスタム出力表現error— エラー値io.Reader/io.Writer— ストリーミングI/Osort.Interface— カスタムソートhttp.Handler— HTTPリクエスト処理
練習課題
Person(NameフィールドとAgeフィールドを持つ)の[]Personにsort.Interfaceを実装し、年齢の降順に並べ替えてください。並べ替えたリストを出力してください。
よくある質問
「標準ライブラリの主要インターフェース」レッスンは無料ですか?
はい。「標準ライブラリの主要インターフェース」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。
「標準ライブラリの主要インターフェース」で何を学びますか?
fmt.Stringer、io.Reader、io.Writer ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Go Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「標準ライブラリの主要インターフェース」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このGo Academyレッスンでコードを書いて実行できますか?
はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- インターフェースの定義と実装
- 標準ライブラリの主要インターフェース
- 型アサーションと型switch
- インターフェースのコンポジションとベストプラクティス