golang interface

什么是接口? 简单的说,interface是一组method签名的组合,我们通过interface来定义对象的一组行为。interface类型定义了一组方法,如果某个对象实现了某个接口的所有方法,则此对象就实现了此接口 。
     Go中的接口为指定对象的行为提供了一种方式:如果事情可以这样做,那么它就可以在这里使用。我们已经看到一些简单的例子:自定义的打印可以通过String() 方法来实现,而Fprintf 可以通过Write 方法输出到任意的地方。只有一个或两个方法的接口在Go代码中很常见,并且它的名字通常来自这个方法,例如实现Write 的io.Writer 。

如果某个对象实现了String()方法,那么它就具有Stringer标准,即能通过fmt包的打印函数按照自定义的格式打印输出。print.go 下的Stringer接口为:

type Stringer interface {
        String() string
}
下面给出一个实现的例子:
package main

import (
        "fmt"
        "strconv"
)

type Student struct {
        name string
        number int
}
type Teacher struct {
        name string
        subject string
}

func (self Student)String()  string{
        return "[name=" + self.name + ",number=" + strconv.Itoa(self.number) + "]"
}
func (self Teacher)String()  string {
        return "[name=" + self.name + ",subject=" + self.subject + "]"
}
func main()  {
        student := Student{name:"zhujoe",number:216}
        teacher := Teacher{name:"LLL",subject:"Math"}

fmt.Println("studeng:",student)
        fmt.Println("teacher:",teacher)
        fmt.Println("studeng:",fmt.Sprint(student))
        fmt.Println("teacher:",fmt.Sprint(teacher))
}

程序的运行结果为:
studeng: [name=zhujoe,number=216]
teacher: [name=LLL,subject=Math]
studeng: [name=zhujoe,number=216]
teacher: [name=LLL,subject=Math]

上面就是实现String()方法的例子。同样的,对于Reader接口,只要实现了Read()方法,就具有了Reader标准。在go的io包中有这么一个函数ReadFull(),只要某个对象实现了Read()方法,就可以被ReadFull()读取。ReadFull()可以读取任何对象的数据,只要这个对象符合Reader标准(即实现了Read()方法),例如文件、数据库中的数据、网络中的数据、内存、磁盘的扇区等等。
下面给出实现Read()方法的例子:
type Ustr string

func (s Ustr) Read(p []byte)(n int,err error)  {
        i,ls,lp := 0,len(s),len(p)
        for ;i < ls && i < lp;i++{
                if s[i]>=‘a‘ && s[i]<=‘z‘{
                        p[i] = s[i] + ‘A‘ - ‘a‘
                }else {
                        p[i] = s[i]
                }
        }
        switch i {
        case lp:
                return i,nil
        case ls:
                return i,io.EOF
        default:
                return i,errors.New("Read Fail")
        }
}

然后就可以这样使用
us := Ustr("Hello World")
buf := make([]byte,1024)
n,err := io.ReadFull(us,buf)
fmt.Println(string(buf))
//fmt.Printf("%s\n",buf)
fmt.Println(n,err)

bytes.NewBuffer 实现了很多基本的接口,可以同步bytes包来学习接口的实现。另外,interface可以被任何对象实现,一个对象可以实现任意多个interface。

时间: 2024-11-09 05:54:31

golang interface的相关文章

golang:interface{}类型测试

在golang中空的interface即interface{}可以看作任意类型, 即C中的void *. 对interface{}进行类型测试有2种语法: 1. Comma-ok断言: value, ok = element.(T), 其中T是具体类型. 2. Switch测试: switch element.(type) { case T1: case T2: default: } 其中T1, T2是具体类型. 注意: element.(type)语法不能在switch外的任何逻辑里使用. 在

golang - interface的作用

多态.struct 可以赋值给 interface.interface 可以转换成子接口,或者 struct. 请看go中的一段的源代码: listener, _ := net.Listen("tcp", "localhost:8000") tcpListener := listener.(*net.TCPListener) conn,_ := tcpListener.Accept() 仔细拜读源码可知: net.Listen() 返回了一个 Listener接口,

[golang] 基于 golang interface 特性衍生的任务流处理思维

在设计程序的许多应用场景中我们会遇到大体分为三个阶段的任务流. 第一.入口 一个或多个入口,等待阻塞的.或者主动请求方式的. ============================== 比如任务流需要接受来自于 HTTP 和 FTP 的应用请求,后续还有可能增加别的方式的接受请求. 第二.处理 多个入口可以对应一个处理程序,也可以对应多个处理程序. ================================== 比如 HTTP 和 FTP 的多个入口程序需要对应一个和多个处理逻辑,同样也

golang interface接口

package main import "fmt" type Shaper interface { Area() float32 } type Square struct { side float32 } func (sq *Square) Area() float32 { return sq.side * sq.side } func main() { sq1 := new(Square) sq1.side = 5 var areaIntf Shaper areaIntf = sq1

Golang学习笔记(1)---go程序一般结构

Go程序是通过 package来组织的(与python的库类似) 只有package名称为main的包可以包涵main函数(同时main函数也是一个程序的入口) 一个可执行程序有且仅有一个main包 通过import关键字来引入其他非main包 通过const关键字来进行常量的定义 通过在函数体外部使用var关键字来进行全局变量的声明与赋值 通过type关键字来进行结构(struct)或接口(interface)的声明----一般(自定义)类型 通过func关键字来进行函数的声明 一般格式为:

Golang 笔记 1

一.Go语言基础 1. 基础 Go语言中的标识符必须以字母(Unicode字母,PHP/JS可以用中文作为变量名)下划线开头.大写字母跟小写字母是不同的:Hello和hello是两个不同的名字.  Go中有25个关键字: break default func interface select case defer go map struct chan else goto package switch const fallthrough if range type continue for imp

Golang 接口与反射知识要点

目录 Golang 接口与反射知识要点 1. 接口类型变量 2. 类型断言 3. 鸭子类型 4. 反射机制 5. reflect 包 TypeOf().ValueOf() Type().Kind() Interface() 6. 反射对象的可设置性 SetXXX(), CanSet() Elem() 7. Struct 的反射 NumField(), Type.Field(i int) Value.Field(i int) 参考文档 Golang 接口与反射知识要点 这篇文章以 Go 官方经典博

Go语言的学习

1.配置环境变量 2.本地阅读报的说明和文档 不用FQ window+R  出现黑窗口   执行    godoc -http :8080 在本地浏览器 localhost:8080 回车 3多行注释  /**/ 4关键字 25 const  PI =3.14     //常量的声明 type newType //一般类型 var name ="gopher" //全局变量的声明 //结构声明 type gopher struct {} //接口 type golang interfa

深度解密Go语言之Slice

目录 当我们在说 slice 时,到底在说什么 slice 的创建 直接声明 字面量 make 截取 slice 和数组的区别在哪 append 到底做了什么 为什么 nil slice 可以直接 append 传 slice 和 slice 指针有什么区别 总结 参考资料 Go 语言的 slice 很好用,不过也有一些坑.slice 是 Go 语言一个很重要的数据结构.网上已经有很多文章写过了,似乎没必要再写.但是每个人看问题的视角不同,写出来的东西自然也不一样.我这篇会从更底层的汇编语言去解