package main
import "fmt"
type Sayer interface {
Say()
}
type Dog struct{}
type Cat struct{}
func (d Dog) Say() {
fmt.Println("this is dog say...")
}
func (c *Cat) Say() {
fmt.Println("this is cat say...")
}
func main() {
var s Sayer
wangcai := Dog{}
s = wangcai
s.Say()
xiaoh := &Cat{}
s = xiaoh
s.Say()
}
点分格式输出地址
type IPAddr [4]byte
/*
实现了Stringer接口的类型(即有String方法),定义了该类型值的原始显示。
当采用任何接受字符的verb(%v %s %q %x %X)动作格式化一个操作数时,
或者被不使用格式字符串如Print函数打印操作数时,会调用String方法来生成输出的文本。
*/
func (i IPAddr) String() string {
return fmt.Sprintf("%v.%v.%v.%v", i[0], i[1], i[2], i[3])
}
func main() {
testMap := map[string][]int{
"hello": {1, 2, 3},
"world": {},
}
fmt.Println(testMap)
addrs := map[string]IPAddr{
"loopback": {127, 0, 0, 1},
"googleDNS": {8, 8, 8, 8},
}
for v, a := range addrs {
fmt.Printf("%v:%v\n", v, a)
}
}
Readers
创建一个 strings.Reader。 并且以每次 8 字节的速度读取它的输出
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
}
/*
n = 8 err = <nil> b = [72 101 108 108 111 44 32 82]
b[:n] = "Hello, R"
n = 6 err = <nil> b = [101 97 100 101 114 33 32 82]
b[:n] = "eader!"
n = 0 err = EOF b = [101 97 100 101 114 33 32 82]
b[:n] = ""
*/
}
}