const (
IPv4len = 4
IPv6len = 16
)
var (
IPv4bcast = IPv4(255, 255, 255, 255) // 广播地址
IPv4allsys = IPv4(224, 0, 0, 1) // 所有主机和路由器
IPv4allrouter = IPv4(224, 0, 0, 2) // 所有路由器
IPv4zero = IPv4(0, 0, 0, 0) // 本地地址,只能作为源地址(曾用作广播地址)
)
var (
IPv6zero = IP{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
IPv6unspecified = IP{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
IPv6loopback = IP{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}
IPv6interfacelocalallnodes = IP{0xff, 0x01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01}
IPv6linklocalallnodes = IP{0xff, 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01}
IPv6linklocalallrouters = IP{0xff, 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x02}
)
type IP []byte
IP类型是代表单个IP地址的[]byte切片。本包的函数都可以接受4字节(IPv4)和16字节(IPv6)的切片作为输入。
func IPv4(a, b, c, d byte) IP
IPv4返回包含一个IPv4地址a.b.c.d的IP地址(16字节格式)。
func ParseIP(s string) IP
ParseIP将s解析为IP地址,并返回该地址。如果s不是合法的IP地址文本表示,ParseIP会返回nil。
字符串可以是小数点分隔的IPv4格式(如"74.125.19.99")或IPv6格式(如"2001:4860:0:2001::68")格式。
func (ip IP) DefaultMask() IPMask
函数返回IP地址ip的默认子网掩码。只有IPv4有默认子网掩码;如果ip不是合法的IPv4地址,会返回nil。
func (ip IP) To4() IP
To4将一个IPv4地址转换为4字节表示。如果ip不是IPv4地址,To4会返回nil。
func (ip IP) String() string
String返回IP地址ip的字符串表示。如果ip是IPv4地址,返回值的格式为点分隔的,如"74.125.19.99";否则表示为IPv6格式,如"2001:4860:0:2001::68"。
type IPMask []byte
IPMask代表一个IP地址的掩码。
func IPv4Mask(a, b, c, d byte) IPMask
IPv4Mask返回一个4字节格式的IPv4掩码a.b.c.d。
func CIDRMask(ones, bits int) IPMask
CIDRMask返回一个IPMask类型值,该返回值总共有bits个字位,其中前ones个字位都是1,其余字位都是0。
func (m IPMask) Size() (ones, bits int)
Size返回m的前导的1字位数和总字位数。如果m不是规范的子网掩码(字位:/^1+0+$/),将返会(0, 0)。
func (m IPMask) String() string
String返回m的十六进制格式,没有标点。
Conn接口代表通用的面向流的网络连接
type Conn interface {
// Read从连接中读取数据
// Read方法可能会在超过某个固定时间限制后超时返回错误,该错误的Timeout()方法返回真
Read(b []byte) (n int, err error)
// Write从连接中写入数据
// Write方法可能会在超过某个固定时间限制后超时返回错误,该错误的Timeout()方法返回真
Write(b []byte) (n int, err error)
// Close方法关闭该连接
// 并会导致任何阻塞中的Read或Write方法不再阻塞并返回错误
Close() error
// 返回本地网络地址
LocalAddr() Addr
// 返回远端网络地址
RemoteAddr() Addr
// 设定该连接的读写deadline,等价于同时调用SetReadDeadline和SetWriteDeadline
// deadline是一个绝对时间,超过该时间后I/O操作就会直接因超时失败返回而不会阻塞
// deadline对之后的所有I/O操作都起效,而不仅仅是下一次的读或写操作
// 参数t为零值表示不设置期限
SetDeadline(t time.Time) error
// 设定该连接的读操作deadline,参数t为零值表示不设置期限
SetReadDeadline(t time.Time) error
// 设定该连接的写操作deadline,参数t为零值表示不设置期限
// 即使写入超时,返回值n也可能>0,说明成功写入了部分数据
SetWriteDeadline(t time.Time) error
}
func Dial(network, address string) (Conn, error)
在网络network上连接地址address,并返回一个Conn接口。
Dial("tcp", "12.34.56.78:80")
Dial("tcp", "google.com:http")
Dial("tcp", "[2001:db8::1]:http")
Dial("tcp", "[fe80::1%lo0]:80")
对IP网络,network必须是"ip"、"ip4"、"ip6"后跟冒号和协议号或者协议名,地址必须是IP地址字面值。
Dial("ip4:1", "127.0.0.1")
Dial("ip6:ospf", "::1")
func DialTimeout(network, address string, timeout time.Duration) (Conn, error)
DialTimeout类似Dial但采用了超时。timeout参数如果必要可包含名称解析。
func Pipe() (Conn, Conn)
Pipe创建一个内存中的同步、全双工网络连接。连接的两端都实现了Conn接口。一端的读取对应另一端的写入,直接将数据在两端之间作拷贝;没有内部缓冲。
type PacketConn interface {
// ReadFrom方法从连接读取一个数据包,并将有效信息写入b
// ReadFrom方法可能会在超过某个固定时间限制后超时返回错误,该错误的Timeout()方法返回真
// 返回写入的字节数和该数据包的来源地址
ReadFrom(b []byte) (n int, addr Addr, err error)
// WriteTo方法将有效数据b写入一个数据包发送给addr
// WriteTo方法可能会在超过某个固定时间限制后超时返回错误,该错误的Timeout()方法返回真
// 在面向数据包的连接中,写入超时非常罕见
WriteTo(b []byte, addr Addr) (n int, err error)
// Close方法关闭该连接
// 会导致任何阻塞中的ReadFrom或WriteTo方法不再阻塞并返回错误
Close() error
// 返回本地网络地址
LocalAddr() Addr
// 设定该连接的读写deadline
SetDeadline(t time.Time) error
// 设定该连接的读操作deadline,参数t为零值表示不设置期限
// 如果时间到达deadline,读操作就会直接因超时失败返回而不会阻塞
SetReadDeadline(t time.Time) error
// 设定该连接的写操作deadline,参数t为零值表示不设置期限
// 如果时间到达deadline,写操作就会直接因超时失败返回而不会阻塞
// 即使写入超时,返回值n也可能>0,说明成功写入了部分数据
SetWriteDeadline(t time.Time) error
}
PacketConn接口代表通用的面向数据包的网络连接。
func ListenPacket(net, laddr string) (PacketConn, error)
ListenPacket函数监听本地网络地址laddr。网络类型net必须是面向数据包的网络类型:"ip"、"ip4"、"ip6"、"udp"、"udp4"、"udp6"、或"unixgram"。
type Listener interface {
// Addr返回该接口的网络地址
Addr() Addr
// Accept等待并返回下一个连接到该接口的连接
Accept() (c Conn, err error)
// Close关闭该接口,并使任何阻塞的Accept操作都会不再阻塞并返回错误。
Close() error
}
Listener是一个用于面向流的网络协议的公用的网络监听器接口。
func Listen(net, laddr string) (Listener, error)
返回在一个本地网络地址laddr上监听的Listener。网络类型参数net必须是面向流的网络:
"tcp"、"tcp4"、"tcp6"、"unix"或"unixpacket"。
type IPAddr struct {
IP IP
Zone string // IPv6范围寻址域
}
func ResolveIPAddr(net, addr string) (*IPAddr, error)
ResolveIPAddr将addr作为一个格式为"host"或"ipv6-host%zone"的IP地址来解析。 函数会在参数net指定的网络类型上解析,net必须是"ip"、"ip4"或"ip6"。
func (a *IPAddr) Network() string
Network返回地址的网络类型:"ip"。
func (a *IPAddr) String() string
type TCPAddr struct {
IP IP
Port int
Zone string // IPv6范围寻址域
}
方法与ipaddr相同
type UDPAddr struct {
IP IP
Port int
Zone string // IPv6范围寻址域
}
方法相同
type UnixAddr struct {
Name string
Net string
}
UnixAddr代表一个Unix域socket终端地址。
resp, err := http.Get("http://example.com/")
...
resp, err := http.Post("http://example.com/upload", "image/jpeg", &buf)
...
resp, err := http.PostForm("http://example.com/form",
url.Values{"key": {"Value"}, "id": {"123"}})
程序在使用完response后必须关闭回复的主体。
resp, err := http.Get("http://example.com/")
if err != nil {
// handle error
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
// ...
func main() {
// url
apiUrl := "http://127.0.0.1:8080/get"
u, err := url.ParseRequestURI(apiUrl)
// param
data := url.Values{}
data.Set("username", "小老弟")
data.Set("age", "00")
u.RawQuery = data.Encode() // URL encode
fmt.Println(u.String())
// http://127.0.0.1:8080/get?age=00&username=%E5%B0%8F%E8%80%81%E5%BC%9F
resp, err := http.Get(u.String())
defer resp.Body.Close()
b, err := ioutil.ReadAll(resp.Body)
fmt.Println(string(b))
}
func main() {
url := "http://127.0.0.1:9090/post"
// 表单数据
//contentType := "application/x-www-form-urlencoded"
//data := "name=小王子&age=18"
// json数据
contentType := "application/json"
data := `{"name":"小王子","age":18}`
resp, err := http.Post(url, contentType, strings.NewReader(data))
defer resp.Body.Close()
b, err := ioutil.ReadAll(resp.Body)
fmt.Println(string(b))
}
要管理HTTP客户端的头域、重定向策略和其他设置,创建一个Client:
client := &http.Client{
CheckRedirect: redirectPolicyFunc,
}
resp, err := client.Get("http://example.com")
// ...
req, err := http.NewRequest("GET", "http://example.com", nil)
// ...
req.Header.Add("If-None-Match", `W/"wyzzy"`)
resp, err := client.Do(req)
// ...
要管理代理、TLS配置、keep-alive、压缩和其他设置,创建一个Transport:
tr := &http.Transport{
TLSClientConfig: &tls.Config{RootCAs: pool},
DisableCompression: true,
}
client := &http.Client{Transport: tr}
resp, err := client.Get("https://example.com")
ListenAndServe使用指定的监听地址和处理器启动一个HTTP服务端。处理器参数通常是nil,这表示采用包变量DefaultServeMux作为处理器。
Handle和HandleFunc函数可以向DefaultServeMux添加处理器。
要管理服务端的行为,可以创建一个自定义的Server:
s := &http.Server{
Addr: ":8080",
Handler: myHandler,
ReadTimeout: 10 * time.Second,
WriteTimeout: 10 * time.Second,
MaxHeaderBytes: 1 << 20,
}
log.Fatal(s.ListenAndServe())