关于net.Conn接口定义的疑问

type Listener interface {
  // Accept waits for and returns the next connection to the listener.
  Accept() (c Conn, err error)
这里 Accept返回的是 接口Conn
func (c *conn) SetReadBuffer(bytes int) error {
  if !c.ok() {
    return syscall.EINVAL
  }
  return setReadBuffer(c.fd, bytes)
}
type Conn interface {
但是接口里边我没有看到 SetReadBuffer 这个方法的定义
}

问题就是Accept返回的是 Conn接口,那我应该怎样才能为连接设置 SetReadBuffer呢? (因为它不在Conn接口里边)

共 3 个回复


jimmykuu

可以用断言得到原来的那个对象。不过你这里是不行的,conn是小写的,对外不可见。

package main

import "fmt"

type Conn interface {
    Read(b []byte) (n int, err error)
    Write(b []byte) (n int, err error)
}

type MyConn struct {}

func (c MyConn) Read(b []byte) (n int, err error) {
    return 10, nil
}

func (c MyConn) Write(b []byte) (n int, err error) {
    return 10, nil
}

func (c *MyConn) SetReadBuffer(bytes int) error {
    fmt.Println(bytes)

    return nil
}

func Accept() (c Conn, err error) {
    return MyConn{}, nil
}

func main() {
    c, _ := Accept()
    c2, ok := c.(MyConn)
    if !ok {
        fmt.Println("error")
    }
    c2.SetReadBuffer(100)
}
# 0

shaovie

哦,就是用 c.,好隐hui的东西

# 1

lubia

net库的SetReadBuffer()跟SetWriteBuffer()在客户端侧是无效的,因为Dial()完了以后buffer就已经确定了,无法修改。服务端没有试过不能乱说。具体的参见这篇文章

# 2