fmt包中定义的最普遍的接口
    Stringer是一个可以用字符串来描述自己的类型
    fmt包(还有很多包)中的很多方法都是通过Stringer接口来打印值的

    1. package main
    2. import "fmt"
    3. func main() {
    4. fmt.Println("Hello,go!")
    5. var stu Student
    6. stu.IdCard(123, "张伟")
    7. fmt.Println(stu)
    8. // 原来还可以给Student这样赋值和定义
    9. stu2 := Student{111, "李明"}
    10. fmt.Println(stu, stu2)
    11. }
    12. type Student struct {
    13. Id int
    14. Name string
    15. }
    16. func (student *Student) IdCard(id int, name string) {
    17. student.Id = id
    18. student.Name = name
    19. }
    20. // 相当于重写了fmt中的Println方法,因为fmt中的很多方法都是通过Stringer来打印的
    21. func (stu Student) String() string {
    22. // return fmt.Sprintf("%v %v", stu.Id, stu.Name)
    23. return "yes"
    24. }

    练习:
    将一个IP地址进行重新输出

    1. package main
    2. import "fmt"
    3. type IPAddr [4]byte
    4. func (ip IPAddr) String() string {
    5. return fmt.Sprintf("%v.%v.%v.%v", ip[0], ip[1], ip[2], ip[3])
    6. }
    7. func main() {
    8. hosts := map[string]IPAddr{
    9. "loopback": {127, 0, 0, 1},
    10. "googleDNS": {8, 8, 8, 8},
    11. }
    12. for name, ip := range hosts {
    13. fmt.Printf("%v : %v\n", name, ip)
    14. }
    15. }