14 Stringer
fmt包中定义的Stringer是最普遍的接口之一。
type Stringer interface {
String() string
}
Stringer是一个可以用字符串描述自己的类型。fmt包(还有很多包)都通过此接口来打印值。
package main
import "fmt"
type ss struct{
ii int
}
func (s ss) String() string {
return fmt.Sprintf("The number is %v.", s.ii)
}
func main() {
var tt = ss{12}
fmt.Println(tt)
}
15 错误
Go程序使用error值表示错误状态。
与fmt.Stringer类似,error类型是一个内置接口:
type error interface {
Error() string
}
(与fmt.Stringer类似,fmt包在打印值时也会满足error。)
函数常常会返回一个error值,调用代码应当判断这个错误是否等于nil来进行错误处理。
i, err := strconv.Atoi("42")
if err != nil {
fmt.Printf("couldn't convert number: %v\n", err)
return
}
fmt.Println("Converted interger:", i)
error为nil时表示成功,非nil的error表示失败。
package main
import "fmt"
type sss struct {
xxx string
}
func (s sss) Error() string{
return fmt.Sprintf(s.xxx)
}
func fff() error{
return sss{"gagagagaga"}
}
func main() {
if msg := fff();msg != nil {
fmt.Println(msg)
}
}
16 Reader
io包制定了io.Reader接口,它表示从数据流的末尾进行读取。
Go标准库包含了该接口的许多实现,包括文件、网络连接、压缩和加密等等。
io.Reader接口有一个Read方法:
func (T) Read(b []byte) (n int, err error)
Read用数据填充给定的字节切片并返回填充的字节数和错误值。在遇到数据流的结尾时,它会返回一个io.EOF错误。
package main
import (
"fmt"
"io"
"strings"
)
func main() {
r := strings.NewReader("Hello, Reader!")
b := make([]byte, 8)
for {
n, err := r.Read(b)
fmt.Printf("n = %v err = %v b = %v\n", n, err, b)
fmt.Printf("b[:n] = %q\n", b[:n])
if err == io.EOF {
break
}
}
}
17 Image
image 包定义了Image接口:
package image
type Image interface {
ColorModel() color.Model
Bounds() Rectangle
At(x, y int) color.Color
}
note:Bounds方法返回的Rectangle实际上是一个image.Rectangle,它在image包中声明。
color.Color与color.Model类型也是接口,但通常因为直接使用预定义的实现image.RGBA与image.RGBAModel而被忽视。这些接口与类型由image/color包定义。
package main
import (
"fmt"
"image"
)
func main() {
m := image.NewRGBA(image.Rect(0, 0, 100, 100))
fmt.Println(m.Bounds())
fmt.Println(m.At(0, 0).RGBA())
}