使用net/http包中handler时,handler的函数签名为func(ResponseWriter, *Request),分别为传值和指针。在SO上找到了相关问题:

[In Go HTTP handlers, why is the ResponseWriter a value but the Request a pointer?]

ResponseWriter是一个interface,而request是一个具体的struct。

type response 实现了ResponseWtriter的方法,但对外部不可见。

Interface value

Interface value是一种类型.

和C++一样,Go使用了method tables记录该接口所包含的方法,不同点在于c++是通过编译期确定,而Go在运行时计算。

Interface value由两个指针组成,一个指向值对应的数据,另一个指向类型信息。

type Stringer interface {
	String() string
}

type Binary uint64

func (b Binary) String() string {
	return strconv.FormatUint(b.Get(), 10)
}

func (b Binary) Get() uint64 {
	return uint64(b)
}

A pointer to interface

当一个函数签名为a pointer to interface时,无法使用interface声明的方法。

type SomeInterface interface {
    sayHello()
}

func doSomething(i *SomeInterface) {
    i.sayHello()     //error 此时i只是*SomeInterface类型,只实现了empty interface
}

func doSomething(i SomeInterface) {
    i.sayHello()	//ok
}

Empty interface

空接口可以接受任意类型,作为函数参数时,需要进行type switch.


参考:

Go Data Structures: Interfaces