LoginSignup
7
6

More than 5 years have passed since last update.

goのインターフェイスとポインタって難しいな!

Last updated at Posted at 2014-07-08
hoge.go
package main

import "io"
import "os"
import "fmt"

func end(fd *io.Closer){
    fd.Close()
}

func main(){
    fd,_ := os.Create("hoge.txt")
    fmt.Fprintln(fd,"ahahaha")
    end(fd)
}

コンパイルすると

[C:gosrc]
$ go run hoge.go
# command-line-arguments
.\hoge.go:8: fd.Close undefined (type *io.Closer has no field or method Close)
.\hoge.go:14: cannot use fd (type *os.File) as type *io.Closer in argument to end:
        *io.Closer is pointer to interface, not interface
[C:gosrc]
$

なぜだ、os.File には、Close というメソッドがあるじゃないか。io.Closer の条件になぜ合致しないんだ。コンパイルをあきらめるなよ、もっと熱くなれよ。

ためしに、関数 end の引数の型をポインタではなく、値にすると

hoge.go
package main

import "io"
import "os"
import "fmt"

func end(fd io.Closer){
    fd.Close()
}

func main(){
    fd,_ := os.Create("hoge.txt")
    fmt.Fprintln(fd,"ahahaha")
    end(fd)
}

なんか、うまく動いたっぽい。

[C:gosrc]
$ go run hoge.go
[C:gosrc]
$ type hoge.txt
ahahaha

エラーメッセージをよく読むと、「*io.Closer はインターフェイスへのポインタであって、インターフェイスそのものちゃうで。あほちゃうか?と書いてあるなぁ。そうか、インターフェイスのポインタはインターフェイスとみなしてくれないのか。難しいな!

追記

[教えて]Go言語:なぜインターフェイスはポインタにできない?という記事があった。なるほど、インターフェイスのポインタには、インターフェイスとしての機能はないか。

7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6