이동 핵심 개발 연구 노트 (Nianliu) - 문서 II 처리 : JSON을 명령 행 처리 매개 변수를

도입의 명령 줄 처리에 대해 알아보기 :

  1. 명령 줄 연결 MySQL 데이터베이스를 가정, 방법을 아래에 달성하기 위해
    mysql -uroot -p'123456' -h 192.168.240.23 -port 3306 
    
  2. 단 os.Args 불변 입력 시퀀스를 정의하기 위해 파라미터를 명령하는 경우.
  3. 패키지 플래그의 도입은, 구문 분석 명령 줄 인수를 깨달았다.

예 1 : 스타일의 V 변화 순서 : 많은 매개 변수 os.Args 통계 명령을 포함하는 방법, 이러한 매개 변수가되지 유사한 K 순서대로 전달되어야

package main
import (
	"fmt"
	"os"
)
func main() {
	/*
	在命令行中执行 xx.exe 位参1 位参2 ...类型这种方式
	使用os.Args 这个是一个切片
	打开终端,先讲本代码编译成 *.exe,然后在命令行输入 *.exe 参1 参2 ... 观察结果


	 */
	fmt.Printf("命令包含的参数个数一共有%d个,分别是:\n",len(os.Args))
	for i, v := range os.Args {
		fmt.Printf("第%d个参数的值为%v\n",i,v)
	}

	/*
	C:\Users\Administrator>test.exe asd asd aaa
	命令包含的参数个数一共有4个,分别是:
	第0个参数的值为test.exe第1个参数的值为asd第2个参数的值为asd第3个参数的值为aaa
	 */
}

실시 예 2 : MySQL의 로그인의 제조 커맨드 라인 파라미터를 위해 전송 될 수 밖에 필요하고, 그 결과를 출력합니다

package main

import (
	"flag"
	"fmt"
)

func main() {
	/*
	假设命令行连接mysql数据库: mysql -uroot -p'123456' -h 192.168.240.23 -port 3306 这些东西是如何实现的。
	引入flag包,构建出可以乱序的k:v对
	常用两个方法,
	func StringVar(p *string, name string, value string, usage string)
		StringVar用指定的名称、默认值、使用信息注册一个string类型flag,并将flag的值保存到p指向的变量。
	func IntVar(p *int, name string, value int, usage string)
		IntVar用指定的名称、默认值、使用信息注册一个int类型flag,并将flag的值保存到p指向的变量。

	写完上述之后必须使用flag.Parse()来确认生效,不然和不使用write.flush()的后果一样
	 */
	
	var user string    //建立了四个变量,把他们简化成 -xx的方式
	var pwd string
	var host string
	var port int

	flag.StringVar(&user,"u","","用户名默认为空")  //参数1指针就是后面 -u 后方的用户名
	flag.StringVar(&pwd,"p","","密码默认为空")     //参数2为选项,-xx
	flag.StringVar(&host,"h","localhost","主机名默认localhost")  //参数3为-xx后什么也不填的默认值
	flag.IntVar(&port,"port",3306,"数据库默认端口3306")   //-port 后面没参数,则参数就是3306

	/*
	在所有flag都注册之后,调用:
	flag.Parse()
	来解析命令行参数写入注册的flag里。
	 */
	
	flag.Parse()   //转换操作,必须使用这种方法,才可以生效,不然拿不到值,必须要在使用之前Parse
	fmt.Printf("[user]=%v\n[passwd]=%v\n[host]=%v\n[port]=%v\n",user,pwd,host,port)
}

최종 결과 컴파일 된 바이너리를 생성

\# go build -o test1.exe E:\Golear\文件处理\使用flag包解析命令行参数.go
\# test1.exe -u root -p root -h -port
	[user]=root
	[passwd]=root
	[host]=-port
	[port]=3306

JSON 개념

  1. JSON은 : 자바 스크립트 객체 표기법 , 경량 데이터 교환 형식은 쉽게 인간을 읽을뿐만 아니라, 쉽게 기계가 분석하고 생성 할 .
  2. 메인 스트림 데이터 포맷과 YAML JSON 무손실 교체.
  3. JSON 효과적으로 네트워크 전송 효율을 증가시키는 것은, 시퀀스 JSON 문자열에 첫 번째 데이터 전송 네트워크 (구조,지도 등), 수신자 JSON 문자열을 수득 할 프로그램은, 그 후,이 원래의 데이터 형식으로 복원 역 직렬화 여러 가지 방법은 표준 언어가되었다.
  4. JS 언어, 모든 데이터 유형 JSON 표현 될 수 있도록, JSON 키 - 값 쌍은 데이터를 저장하는 방법은, 목적으로한다.
  5. 문자열, 숫자는, 배열, 맵은 구조 요소 JSON 데이터로서 사용될 수있다.
  6. 형식, 매우 유연한 확장,
    { "키": "값", "키": { "키": "값"}, "키": [ "VALUE1", "값 2"]}
  7. 웹 사이트 https://www.json.cn는 JSON 형식을 구문 분석 할 수 있습니다, 당신은 확장, 압축, 변환 방법 XML 형식을 조정할 수 있습니다.
    예 1 :
    {"name":"蔡徐坤","hobbies":["唱","跳","rap","篮球"]} 
    解析结果为:
    {
     "name":"蔡徐坤",
     "hobbies":[
         "唱",
         "跳",
         "rap",
         "篮球",
     	]
     }
    
    2 설명 :
    {"name":"蔡徐坤","hobbies":[{"唱":"鸡你太美"},"跳","rap","篮球"]}
    XML解析结果为:
    <?xml version="1.0" encoding="UTF-8"?><root>
    <name>蔡徐坤</name>
    <hobbies>
      <唱>鸡你太美</唱>
    </hobbies>
    <hobbies>跳</hobbies>
    <hobbies>rap</hobbies>
    <hobbies>篮球</hobbies>
    </root>
    

어떻게 직렬화 JSON (직렬화)

  1. 직렬화 된 객체 : 배열, 조각, 구조,지도 .
  2. 아무 의미 연재 문자열, INT, 같은 비 KV 쌍으로 부울 데이터 유형 .
  3. JSON 직렬화 안전 주입 트레이닝 시퀀스 전에 음성 동작에 존재 KV JSON 문자열 데이터의 입력 순서를 의미 시퀀스의 일부 값을 변경함으로써 공격.

실시 예 3 : 인 코드 / JSON 구조,지도, 슬라이스, 다음의 예시적인 서열은 모든 기술을 포함

package main

import (
	"encoding/json"
	"fmt"
)

type Perfo struct {                       //序列化后的key由我们自行制定,那么就通过反射打个tag
	Name string       `json:"name"`       //反射机制,后续学到再研究
	Age int           `json:"age"`        //如果结构体中字段小写,那么json.Marshal()是另外一个包,这个字段是不可被导入的,也就丢掉了
	Hobbies []string  `json:"hobbies"`    //如果真强制需要小写,那么就只能通过写一个方法,setValue(),getValue()实现了
	Skill string      `json:"skill"`      //这样保持json结构体拿到小写
}

func structSerial() {
	//定义结构体变量
	var Caixukun Perfo = Perfo{"caixukun",18,[]string{"唱","跳","rap","篮球"},"律师函警告"}
	/*
	func Marshal(v interface{}) ([]byte, error)
	Marshal函数返回一个切片和error
	 */
	slice, err := json.Marshal(&Caixukun)
	if err != nil {
		fmt.Println("序列化失败,失败原因为: ",err)
	}
	fmt.Printf("%T:%v",string(slice),string(slice))
}

func mapSerial() {
	//定义一个map,一定要使用make为其开辟内存空间才可以后续使用,不然是无法使用的
	var Caixukun1 map[string]interface{}
	Caixukun1 = make(map[string]interface{})
	Caixukun1["name"] = "蔡徐坤"
	Caixukun1["skill"] = "律师函警告"
	Caixukun1["hobby"] = []string{"唱","跳","rap","篮球"}
	slice, err := json.Marshal(&Caixukun1)
	if err != nil {
		fmt.Println("序列化失败,失败原因为: ",err)
	}
	fmt.Printf("%T:%v",string(slice),string(slice))
}

func sliceSerial() {
	//定义一个切片,其中添加map数据类型
	var slice []map[string]string
	var Caixukun2 map[string]string
	Caixukun2 = make(map[string]string)
	Caixukun2["name"] = "蔡徐坤"
	Caixukun2["skill"] = "鸡你太美"
	Caixukun2["hobby"] = "唱,跳,rap,篮球"
	slice = append(slice,Caixukun2)

	var Caixukun3 map[string]string
	Caixukun3 = make(map[string]string)
	Caixukun3["name"] = "蔡徐坤"
	Caixukun3["skill"] = "crush on you"
	Caixukun3["hobby"] = "唱,跳,rap,篮球"
	slice = append(slice,Caixukun3)

	//将切片序列化
	slice1, err := json.Marshal(slice)
	if err != nil {
		fmt.Println("序列化失败,失败原因为: ",err)
	}
	fmt.Printf("%T:%v",string(slice1),string(slice1))
}

func main() {
	//对int,float,string类型序列化后,就是都转成字符串格式,意义不大

	//对结构体进行序列化,import encoding/json
	//结果为:string {"Name":"caixukun","Age":18,"Hobbies":["唱","跳","rap","篮球"],"Skill":"律师函警告"}
	structSerial()
	fmt.Println()

	//注意map是无序的,如果想排序按照之前对key赋予升序降序的方式排列
	//结果为:string:{"hobby":["唱","跳","rap","篮球"],"name":"蔡徐坤","skill":"律师函警告"}
	mapSerial()
	fmt.Println()

	//两个map元素组成的切片
	//结果为:string:[{"hobby":"唱,跳,rap,篮球","name":"蔡徐坤","skill":"鸡你太美"},
	// {"hobby":"唱,跳,rap,篮球","name":"蔡徐坤","skill":"crush on you"}]
	sliceSerial()

	//将上述所有序列化后的结果放入www.json.cn里面去查看结果
}

JSON의 직렬화를 unserialize (위해)

  1. 비아 B / S 구성 서버로 송신 JSON 문자열 브라우저 JQuery와 또는 JS 해결 .
  2. 대응하는 데이터 유형으로 역 직렬화 역 직렬화 JSON 문자열을 지칭 JSON (-> 맵 구조체 조각), 반전 과정의 시퀀스이다.
  3. ★★★ 데이터 직렬화 후 유형 및 데이터는 원래의 직렬화 이전에 동의해야합니다! ! ! 그들은 반드시 특수 구조 제공되지 않는 경우 필드는 동일해야하지만, 수는 중요하지 않습니다 .
  4. (가) 따옴표를 탈출하기 전에 JSON 아날로그 필기 문자열을 추가해야하지만 프로그램은 더 사용 설명서를 추가하지, 탈출받을 JSON 완료되었습니다 .

예 4 : 구조,지도, 슬라이스로 직렬화 json으로 문자열은, 모든 지식을 포함한다

package main

import (
	"encoding/json"
	"fmt"
)

type Perfo1 struct {
	Name string `json:"name"`
	Age int `json:"age"`
	Hobbies []string `json:"hobbies"`
	Skill string `json:"skill"`
}

func unserialStruct() {
	var Caixukun Perfo1
	str := "{\"Name\":\"蔡徐坤\",\"Age\":18,\"Hobbies\":[\"唱\",\"跳\",\"rap\",\"篮球\"],\"Skill\":\"律师函警告\"}"
	err := json.Unmarshal([]byte(str), &Caixukun)      //err := json.Unmarshal([]byte(string), &<struct结构体变量>)
	if err != nil {
		fmt.Println("反序列化出现异常,异常报错为:",err)
	}
	fmt.Println(Caixukun)
}

func unserialMap() {
	//map反序列化是不需要先make一个map空间,make函数被封装到Unmarshal()中了。
	str := "{\"Name\":\"蔡徐坤\",\"Age\":18,\"Hobbies\":[\"唱\",\"跳\",\"rap\",\"篮球\"],\"Skill\":\"律师函警告\"}"
	var cxk map[string]interface{}
	err := json.Unmarshal([]byte(str), &cxk)      //err := json.Unmarshal([]byte(string), &<map变量>)
	if err != nil {
		fmt.Println("反序列化出现异常,异常报错为:",err)
	}
	fmt.Println(cxk)
}

func unserialSlice() {
	str := "[{\"hobby\":\"唱,跳,rap,篮球\",\"name\":\"蔡徐坤\",\"skill\":\"鸡你太美\"},{\"hobby\":\"唱,跳,rap,篮球\",\"name\":\"蔡徐坤\",\"skill\":\"crush on you\"}]"
	var cxk1 []map[string]string
	err := json.Unmarshal([]byte(str), &cxk1)      //err := json.Unmarshal([]byte(string), &<map变量>)
	if err != nil {
		fmt.Println("反序列化出现异常,异常报错为:",err)
	}
	fmt.Println(cxk1)
}

func main() {
	/*
	func Unmarshal(data []byte, v interface{}) error
	Unmarshal函数解析json编码的数据并将结果存入v指向的值。
	解析:
	data是一个byte切片,所以对于json string来讲必须要强转一手,string = []byte(string)再传入即可
	v 对应的就是要转换成哪个类型,v必须为引用类型,只有引用类型才可以改变函数外部的,也就是假如想反序列化结构体,
	就需要如下写法  err := json.Unmarshal([]byte(string), &<struct结构体变量>)
	 */

	//结果为: {蔡徐坤 18 [唱 跳 rap 篮球] 律师函警告}
	unserialStruct()

	//结果为:map[Age:18 Hobbies:[唱 跳 rap 篮球] Name:蔡徐坤 Skill:律师函警告]
	unserialMap()

	//结果为:[map[hobby:唱,跳,rap,篮球 name:蔡徐坤 skill:鸡你太美] map[hobby:唱,跳,rap,篮球 name:蔡徐坤 skill:crush on you]]
	unserialSlice()
}
게시 49 개 원래 기사 · 원의 찬양 (18) · 전망 4000

추천

출처blog.csdn.net/weixin_41047549/article/details/90321373