Tan*_*onk 2 methods struct pointers go
我正在学习Go,我正在阅读关于Go的官方文档net/http,我在doc中编写以下代码进行测试:
package main
import (
"net/http"
"fmt"
)
func main() {
client := &http.Client{}
resp, _ := client.Get("http://example.com")
fmt.Println(resp)
}
Run Code Online (Sandbox Code Playgroud)
http.Client是一个支柱,但我不知道为什么有一个&指针前缀,我认为创建一个http.Client引用是没有必要的,为什么client变量有Get方法?我正在阅读"net/http"的源代码,它net/http在下面定义了struct:
type Client struct {
Transport RoundTripper
CheckRedirect func(req *Request, via []*Request) error
Jar CookieJar
Timeout time.Duration
}
Run Code Online (Sandbox Code Playgroud)
该Client结构没有Client定义的方法,但是,为什么Get变量有client方法?
icz*_*cza 11
我真的会去Go Tour首先感受一下语言及其基本语法.
您引用的类型声明仅包含结构的字段,但不包含其方法.方法在别处定义,如函数,但添加了一个接收器,指定它们所属的类型.例如,Client.Get()方法的定义是这样的:
func (c *Client) Get(url string) (resp *Response, err error) {
req, err := NewRequest("GET", url, nil)
if err != nil {
return nil, err
}
return c.Do(req)
}
Run Code Online (Sandbox Code Playgroud)
方法名称前面的部分称为接收器,它指定方法所属的类型(*Client在此示例中).有关详细信息,请参阅规范:方法声明.
它&是一个地址运算符,它接受其操作数的地址.在这种情况下,局部变量client将是类型*http.Client.http.Client{}是一个复合文字,它创建结构类型的值http.Client,并&获取存储此结构值的匿名变量的地址:
使用它是为了使client变量成为指向http.Client值的指针,鼓励共享和重用它:
客户端的传输通常具有内部状态(缓存的TCP连接),因此应该重用客户端而不是根据需要创建客户端.客户可以安全地同时使用多个goroutine.
如果client是一个指针,你可以自由地将它传递给其他函数,只会复制指针值,而不是指向的http.Client结构,因此结构本身(http.Client值)将被重用.如果你不使用指针,如果你将它传递给其他函数,结构本身将被复制而不是重用.
请注意,在这个简单的示例中,它并不重要,因为即使所有方法http.Client都是使用指针接收器声明的,您仍然可以在非指针变量上调用指针方法,这client.Get()将是一个简写(&client).Get().这在规范:呼叫中提到:
如果
x是可寻址的并且&x方法集包含m,x.m()则是简写(&x).m().
因此,即使&在这个简单的示例中不需要地址运算符,但是如果示例增长,或者应该在有效的情况下编写代码(例如,您传递创建的客户端),那么保持使用它的习惯是很好的.