package main import ( "fmt" "net/url" "strings" ) func main() { Url := "https://root:123456@www.baidu.com:0000/login?name=xiaoming&name=xiaoqing&age=24&age1=23#fffffff" //Parse函数解析Url为一个URL结构体,Url可以是绝对地址,也可以是相对地址 // type URL struct { // Scheme string // Opaque string // 编码后的不透明数据 // User *Userinfo // 用户名和密码信息 // Host string // host或host:port // Path string // RawQuery string // 编码后的查询字符串,没有'?' // Fragment string // 引用的片段(文档位置),没有'#' //} u, err := url.Parse(Url) if err == nil { fmt.Println(u) // output: https://root:123456@www.baidu.com:0000/login?name=xiaoming&name=xiaoqing&age=24&age1=23#fffffff } //ParseRequestURI函数解析Url为一个URL结构体,本函数会假设Url是在一个HTTP请求里, // 因此会假设该参数是一个绝对URL或者绝对路径,并会假设该URL没有#fragment后缀 u1, err := url.ParseRequestURI(Url) if err == nil { fmt.Println(u1) // output: https://root:123456@www.baidu.com:0000/login?name=xiaoming&name=xiaoqing&age=24&age1=23#fffffff } //得到Scheme fmt.Println(u.Scheme) // output: https //User 包含认证信息 username and password user := u.User fmt.Println(user) // output: root:123456 username := user.Username() fmt.Println(username) // output: root password, b := user.Password() fmt.Println(password, b) // output: 123456 true //Host 包括主机名和端口信息,如过有端口,用strings.Split() 从Host中手动提取端口 host := u.Host fmt.Println(host) // output: www.baidu.com:0000 ho := strings.Split(host, ":") fmt.Println("主机名:", ho[0]) // output: 主机名: www.baidu.com fmt.Println("端口号:", ho[1]) // output: 端口号: 0000 //获取path path := u.Path fmt.Println(path) // output: /login //获取参数 将查询参数解析为一个map。 map以查询字符串为键,对应值字符串切片为值。 fmt.Println(u.RawQuery) // output: name=xiaoming&name=xiaoqing&age=24&age1=23 urlParam := u.RawQuery fmt.Println("urlParam:", urlParam) // output: urlParam: name=xiaoming&name=xiaoqing&age=24&age1=23 m, err := url.ParseQuery(urlParam) if err == nil { fmt.Println(m) // output: map[name:[xiaoming xiaoqing] age:[24] age1:[23]] for k, v := range m { fmt.Println(k, v) /* output: name [xiaoming xiaoqing] age [24] age1 [23] */ } } //与ParseQuery功能一样,只是将上边的方法分装了一下 m1 := u.Query() fmt.Println(m1) // output: map[age:[24] age1:[23] name:[xiaoming xiaoqing]] for k, v := range m1 { fmt.Println(k, v) /* output: name [xiaoming xiaoqing] age [24] age1 [23] */ } //得到查询片段信息 fmt.Println(u.Fragment) // output: fffffff 生成参数形如:name=xiaoming&name=xiaoqing&age=24&age1=23 v := url.Values{} //添加一个k-v值 v.Set("name", "xiaoming") v.Add("name", "xiaoqing") v.Set("Age", "23") fmt.Println(v) // output: map[name:[xiaoming xiaoqing] Age:[23]] fmt.Println(v.Get("name")) // output: xiaoming v.Del("name") fmt.Println(v) // output: map[Age:[23]] //把map编码成name=xiaoming&name=xiaoqing&age=24&age1=23的形式 v.Set("name", "xiaoming") v.Add("name", "xiaoqing") fmt.Println(v.Encode()) // output: Age=23&name=xiaoming&name=xiaoqing }