点前面是接口,后面是具体的类型,如果接口可以转为后面的类型,就转为后面的类型并返回

func main() {
var w io.Writer = os.Stdout
f, ok := w.(*os.File) // success: ok, f == os.Stdout
if ok {
fmt.Println(f)
}
b, ok := w.(*bytes.Buffer) // failure: !ok, b == nil
if ok {
fmt.Println(b)
}
}

能不能转还需要看具体的值,虽然w是写接口,但是*os.File是可以读写的,所以可以转为io.ReadWriter

func main() {
var w io.Writer
w = os.Stdout
rw := w.(io.ReadWriter)
fmt.Println(rw)
}

可以根据接口类型判断来执行不同的操作

package fmt

func formatOneValue(x interface{}) string {
if err, ok := x.(error); ok {
return err.Error()
}
if str, ok := x.(Stringer); ok {
return str.String()
}
// ...all other types...
}