关于golang语法的一个问题


今天看go语言net包下的代码时有些疑惑

先上代码, 有疑问的语句用注视标出来了:

// NewRequest returns a new Request given a method, URL, and optional body.
func NewRequest(method, urlStr string, body io.Reader) (*Request, error) {
    u, err := url.Parse(urlStr)
    if err != nil {
        return nil, err
    }
    rc, ok := body.(io.ReadCloser) // 这条语句是什么意思 
    if !ok && body != nil {
        rc = ioutil.NopCloser(body)
    }
    req := &Request{
        Method:     method,
        URL:        u,
        Proto:      "HTTP/1.1",
        ProtoMajor: 1,
        ProtoMinor: 1,
        Header:     make(Header),
        Body:       rc,
        Host:       u.Host,
    }
    if body != nil {
        switch v := body.(type) { // 这里也不懂
        case *strings.Reader:
            req.ContentLength = int64(v.Len())
        case *bytes.Buffer:
            req.ContentLength = int64(v.Len())
        }
    }

    return req, nil
}

以上两条语句都是在.后接括号, 这种语法是什么意思?是go里面特有的么?

code 编程语言 go

嘟嘟哒哒零 10 years, 5 months ago

1) rc, ok := body.(io.ReadCloser) 为类型断言 (type assertion)
http://golang.org/ref/spec#Type_asser...

2) 跟上个类似,不过是 type switch
http://golang.org/ref/spec#Type_switc...

混沌的悲戚夜 answered 10 years, 5 months ago

Your Answer