8-1 http标准库

package mainimport ("fmt""net/http""net/http/httputil")func main() {resp, err := http.Get("http://www.imooc.com")if err != nil {panic(err)}defer resp.Body.Close()response, err := httputil.DumpResponse(resp, true)if err != nil {panic(err)}fmt.Printf("%s\n", response)}
我现在想对 httpclinet进行控制
比如我想要访问手机版的imooc
package mainimport ("fmt""net/http""net/http/httputil")func main() {request, err := http.NewRequest(http.MethodGet,"http://www.imooc.com",nil,)request.Header.Add("User-Agent","Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1")resp, err := http.DefaultClient.Do(request)if err != nil {panic(err)}defer resp.Body.Close()response, err := httputil.DumpResponse(resp, true)if err != nil {panic(err)}fmt.Printf("%s\n", response)}


8-2 json数据格式的处理
+v格式化打印
package mainimport "fmt"type Order struct {Id stringName stringQuantity intTotalPrice int}func main() {o:=Order{Id: "124",Name: "lreag go",Quantity: 3,TotalPrice: 30,}fmt.Printf("%+v",o)}
使用 json库 格式化库
package mainimport ("encoding/json""fmt")type Order struct {Id stringName stringQuantity intTotalPrice int}func main() {o:=Order{Id: "124",Name: "lreag go",Quantity: 3,TotalPrice: 30,}//fmt.Printf("%+v",o)b,err:=json.Marshal(o)if err != nil {panic(err)}fmt.Printf("%s\n",b)}
json字段
package mainimport ("encoding/json""fmt")type Order struct {Id string `json:"id"`Name string `json:"name"`Quantity int `json:"quantity"`TotalPrice int`json:"total_price"`}func main() {o:=Order{Id: "124",Name: "lreag go",Quantity: 3,TotalPrice: 30,}//fmt.Printf("%+v",o)b,err:=json.Marshal(o)if err != nil {panic(err)}fmt.Printf("%s\n",b)}
在结构体里面,首字母小写的字段是不能被看到的
省略空字段
package mainimport ("encoding/json""fmt")type Order struct {Id string `json:"id"`Name string `json:"name,omitempty"`Quantity int `json:"quantity"`TotalPrice int `json:"total_price"`}func main() {o := Order{Id: "124",//Name: "lreag go",Quantity: 3,TotalPrice: 30,}//fmt.Printf("%+v",o)b, err := json.Marshal(o)if err != nil {panic(err)}fmt.Printf("%s\n", b)}/**{"id":"124","quantity":3,"total_price":30}Process finished with the exit code 0*/
json 嵌套
package mainimport ("encoding/json""fmt")type OrderItem struct {ID string `json:"id"`Name string `json:"name"`Price float64 `json:"price"`}type Order struct {Id string `json:"id"`Item OrderItem `json:"item"`Quantity int `json:"quantity"`TotalPrice int `json:"total_price"`}func main() {o := Order{Id: "124",Item: OrderItem{ID: "8675645",Name: "nancy",Price: 0,},Quantity: 3,TotalPrice: 30,}//fmt.Printf("%+v",o)b, err := json.Marshal(o)if err != nil {panic(err)}fmt.Printf("%s\n", b)}/**{"id": "124","item": {"id": "8675645","name": "nancy","price": 0},"quantity": 3,"total_price": 30}*/
指针也可以
package mainimport ("encoding/json""fmt")type OrderItem struct {ID string `json:"id"`Name string `json:"name"`Price float64 `json:"price"`}type Order struct {Id string `json:"id"`Item *OrderItem `json:"item"`Quantity int `json:"quantity"`TotalPrice int `json:"total_price"`}func main() {o := Order{Id: "124",Item: &OrderItem{ID: "8675645",Name: "nancy",Price: 0,},Quantity: 3,TotalPrice: 30,}//fmt.Printf("%+v",o)b, err := json.Marshal(o)if err != nil {panic(err)}fmt.Printf("%s\n", b)}/**{"id": "124","item": {"id": "8675645","name": "nancy","price": 0},"quantity": 3,"total_price": 30}*/
切片也支持
package mainimport ("encoding/json""fmt")type OrderItem struct {ID string `json:"id"`Name string `json:"name"`Price float64 `json:"price"`}type Order struct {Id string `json:"id"`Item *[]OrderItem `json:"item"`Quantity int `json:"quantity"`TotalPrice int `json:"total_price"`}func main() {o := Order{Id: "124",Item: &[]OrderItem{{ID: "8675645",Name: "nancy",Price: 50,},{ID: "2456733",Name: "yael",Price: 20,},},Quantity: 3,TotalPrice: 30,}//fmt.Printf("%+v",o)b, err := json.Marshal(o)if err != nil {panic(err)}fmt.Printf("%s\n", b)}/**{"id": "124","item": [{"id": "8675645","name": "nancy","price": 50},{"id": "2456733","name": "yael","price": 20}],"quantity": 3,"total_price": 30}*/

8-3 第三方API数据格式的解析技巧
map类型收 json
package mainimport ("encoding/json""fmt")type OrderItem struct {ID string `json:"id"`Name string `json:"name"`Price float64 `json:"price"`}type Order struct {Id string `json:"id"`Item []*OrderItem `json:"item"`Quantity int `json:"quantity"`TotalPrice int `json:"total_price"`}func marshal() {o := Order{Id: "124",Item: []*OrderItem{{ID: "8675645",Name: "nancy",Price: 50,},{ID: "2456733",Name: "yael",Price: 20,},},Quantity: 3,TotalPrice: 30,}fmt.Println(o)}func unmarshal() {s := `{"id":"124","item":[{"id":"8675645","name":"nancy","price":50},{"id":"2456733","name":"yael","price":20}],"quantity":3,"total_price":30}`var o Orderjson.Unmarshal([]byte(s), &o)fmt.Printf("%+v", o)}func parseNLP() {res := `{"data": [{"synonym":"","weight":"0.6","word": "真丝","tag":"材质"},{"synonym":"","weight":"0.8","word": "韩都衣舍","tag":"品牌"},{"synonym":"连身裙;联衣裙","weight":"1.0","word": "连衣裙","tag":"品类"}]}`//m := struct {// Data []struct {// Synonym string `json:"synonym"`// Tag string `json:"tag"`// } `json:"data"`//}{}m := make(map[string]interface{})err := json.Unmarshal([]byte(res), &m)if err != nil {panic(err)}fmt.Printf("-----------------------------------------------------------\n")fmt.Printf("%+v\n",m["data"].([]interface{})[2].(map[string]interface{})["synonym"])fmt.Printf("-----------------------------------------------------------\n")for k,v := range m{fmt.Println(k,v)for _,v2 := range v.([]interface{}){for v3,v4:=range v2.(map[string]interface{}){fmt.Printf("v3:%v---v4:%v\n",v3,v4)}//fmt.Printf("v1:%v---v2%v\n",v1,v2)}}fmt.Printf("%+v\n", m)//fmt.Printf("%+v, %+v\n", m.Data[2].Synonym, m.Data[2].Tag)}func main() {parseNLP()}
其中的map[string]interface 属实复杂
fmt.Printf("%+v\n",m["data"].([]interface{})[2].(map[string]interface{})["synonym"],)
结构体收json
换成结构体的
m := struct {Data []struct {Synonym string `json:"synonym"`Tag string `json:"tag"`} `json:"data"`}{}
err := json.Unmarshal([]byte(res), &m)if err != nil {panic(err)}fmt.Printf("%+v, %+v\n", m.Data[2].Synonym, m.Data[2].Tag)
