《Go語(yǔ)言從入門到精通》Go語(yǔ)言中數(shù)據(jù)格式的分析與轉(zhuǎn)換_第1頁(yè)
《Go語(yǔ)言從入門到精通》Go語(yǔ)言中數(shù)據(jù)格式的分析與轉(zhuǎn)換_第2頁(yè)
《Go語(yǔ)言從入門到精通》Go語(yǔ)言中數(shù)據(jù)格式的分析與轉(zhuǎn)換_第3頁(yè)
《Go語(yǔ)言從入門到精通》Go語(yǔ)言中數(shù)據(jù)格式的分析與轉(zhuǎn)換_第4頁(yè)
《Go語(yǔ)言從入門到精通》Go語(yǔ)言中數(shù)據(jù)格式的分析與轉(zhuǎn)換_第5頁(yè)
已閱讀5頁(yè),還剩34頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Go語(yǔ)言中數(shù)據(jù)格式的分析與轉(zhuǎn)換Go語(yǔ)言從入門到精通了解編程中常用的數(shù)據(jù)交換格式掌握Go語(yǔ)言中JSON格式數(shù)據(jù)的分析與處理01FORMAT02XML03JSONtarget目標(biāo)掌握Go語(yǔ)言中XML格式數(shù)據(jù)的分析與處理目錄導(dǎo)航10.1常見的數(shù)據(jù)交換格式Contents數(shù)據(jù)交換格式在不同的計(jì)算機(jī)之間、應(yīng)用程序之間,通過(guò)文件、網(wǎng)絡(luò)等各種途徑進(jìn)行信息交換時(shí),為了雙方都能夠理解而制定的數(shù)據(jù)格式。

數(shù)據(jù)交換格式的基本要求是能夠跨平臺(tái)、跨語(yǔ)言得到準(zhǔn)確無(wú)誤的理解常見的數(shù)據(jù)交換格式純文本

CSV

XML

JSON(及各種變體)YAMLProtoBuf目錄導(dǎo)航10.2XML格式的處理ContentsXML格式

XML是可擴(kuò)展標(biāo)記語(yǔ)言(EXtensibleMarkupLanguage)的縮寫簡(jiǎn)稱,它被設(shè)計(jì)為專注于數(shù)據(jù)的表達(dá)而非其他(例如數(shù)據(jù)的顯示樣式等)方面,因此特別適合也主要被應(yīng)用于傳輸數(shù)據(jù)和存儲(chǔ)數(shù)據(jù)XML格式XML格式是基于文本格式之上的,因此,XML文件就是純文本文件的一種。XML文件可以直接用文本編輯軟件打開,其中內(nèi)容也都是由人可以識(shí)別的字符組成的。XML數(shù)據(jù)在程序中的表現(xiàn)形式就是一個(gè)字符串XML對(duì)文本進(jìn)行了更高級(jí)別的格式要求,以便能夠用一定的文本格式規(guī)范來(lái)表現(xiàn)出各種類型的數(shù)據(jù)類型和數(shù)據(jù)結(jié)構(gòu),能夠支持復(fù)雜的數(shù)據(jù)類型并且能對(duì)數(shù)據(jù)的取值范圍等做出更具體的規(guī)定和限制將數(shù)據(jù)序列化成XML格式引用encoding/xml包//

Person

準(zhǔn)備進(jìn)行XML序列化的表示個(gè)人信息的數(shù)據(jù)結(jié)構(gòu)類型type

Person

struct

{

XMLName

xml.Name

`xml:"person"`

Name

string

`xml:"name"`

ID

string

`xml:"id,attr"`

Age

int

`xml:"age"`

Married

bool

Phone

string

`xml:"phone,omitempty"`

Mobile

[]string

`xml:"mobiles>mobile"`

height

float64

`xml:"height"`

AddressType

SecondAddress

AddressType

`xml:"secondAddress"`

Remark

string

`xml:",comment"`}

準(zhǔn)備數(shù)據(jù)結(jié)構(gòu)用到的嵌套數(shù)據(jù)結(jié)構(gòu)//

AddressType

表示個(gè)人住址的數(shù)據(jù)結(jié)構(gòu)type

AddressType

struct

{

State

string

City

string

Detail

string

PostalCode

string

`xml:"postalCode,attr"`

remark

string}常見類型無(wú)需標(biāo)注進(jìn)行XML序列化(編碼)person1

:=

&Person{Name:

"張三",

ID:

,

Age:

25,

Married:

false,

Mobile:

[]string{,

},

height:

170,

AddressType:

AddressType{State:

"中國(guó)",

City:

"北京",

Detail:

"海淀區(qū)中關(guān)村1號(hào)",

PostalCode:

"100099",

remark:

"路口右轉(zhuǎn)"},

SecondAddress:

AddressType{State:

"中國(guó)",

City:

"上海",

Detail:

"徐匯區(qū)南京路1號(hào)",

PostalCode:

"210001",

remark:

"無(wú)"},

Remark:

"信息有待完善"}

var

strT

strings.BuilderencoderT

:=

xml.NewEncoder(&strT)errT

:=

encoderT.Encode(person1)if

errT

!=

nil

{

t.Printfln("XML編碼時(shí)發(fā)生錯(cuò)誤:%v",

errT.Error())

return}t.Printfln("XML字符串為:%#v",

strT.String())

outputT,

errT

:=

xml.MarshalIndent(person1,

"

",

"

")if

errT

!=

nil

{

t.Printfln("XML縮進(jìn)編碼時(shí)發(fā)生錯(cuò)誤:%v",

errT)

return}

os.Stdout.Write(outputT)序列化結(jié)果XML字符串為:"<personid=\"postalCode=\"100099\"><name>張三</name><age>25</age><Married>false</Married><mobiles><mobile>lt;/mobile><mobile>lt;/mobile></mobiles><State>中國(guó)</State><City>北京</City><Detail>海淀區(qū)中關(guān)村1號(hào)</Detail><secondAddresspostalCode=\"210001\"><State>中國(guó)</State><City>上海</City><Detail>徐匯區(qū)南京路1號(hào)</Detail></secondAddress><!--信息有待完善--></person>"<personid=postalCode="100099"><name>張三</name><age>25</age><Married>false</Married><mobiles><mobile>lt;/mobile><mobile>lt;/mobile></mobiles><State>中國(guó)</State><City>北京</City><Detail>海淀區(qū)中關(guān)村1號(hào)</Detail><secondAddresspostalCode="210001"><State>中國(guó)</State><City>上海</City><Detail>徐匯區(qū)南京路1號(hào)</Detail></secondAddress><!--信息有待完善--></person>進(jìn)行XML序列化(編碼)person1

:=

&Person{Name:

"張三",

ID:

,

Age:

25,

Married:

false,

Mobile:

[]string{,

},

height:

170,

AddressType:

AddressType{State:

"中國(guó)",

City:

"北京",

Detail:

"海淀區(qū)中關(guān)村1號(hào)",

PostalCode:

"100099",

remark:

"路口右轉(zhuǎn)"},

SecondAddress:

AddressType{State:

"中國(guó)",

City:

"上海",

Detail:

"徐匯區(qū)南京路1號(hào)",

PostalCode:

"210001",

remark:

"無(wú)"},

Remark:

"信息有待完善"}

var

strT

strings.BuilderencoderT

:=

xml.NewEncoder(&strT)errT

:=

encoderT.Encode(person1)if

errT

!=

nil

{

t.Printfln("XML編碼時(shí)發(fā)生錯(cuò)誤:%v",

errT.Error())

return}t.Printfln("XML字符串為:%#v",

strT.String())

outputT,

errT

:=

xml.MarshalIndent(person1,

"

",

"

")if

errT

!=

nil

{

t.Printfln("XML縮進(jìn)編碼時(shí)發(fā)生錯(cuò)誤:%v",

errT)

return}

os.Stdout.Write(outputT)XML序列化說(shuō)明1

處理XML格式文本需要使用“encoding/xml”包

Person類型是自定義的用于存儲(chǔ)個(gè)人信息的數(shù)據(jù)結(jié)構(gòu)類型

Person結(jié)構(gòu)類型中的大多數(shù)字段(成員變量)后都有一個(gè)用于指導(dǎo)如何進(jìn)行XML序列化的特殊字符串,稱作“標(biāo)記”(tag),也稱為XML序列化描述字符串,簡(jiǎn)稱描述字符串

例如,“Name”字段后用反引號(hào)括起來(lái)的描述字符串`xml:"name"`,表示Name字段在序列化后的XML中將被轉(zhuǎn)換成名字為“name”的XML元素節(jié)點(diǎn)XML序列化說(shuō)明2

Person結(jié)構(gòu)中的第一行“XMLNamexml.Name`xml:"person"`”并非定義一個(gè)字段,而是結(jié)構(gòu)體中為XML序列化專用的一個(gè)設(shè)置寫法,用于指定該結(jié)構(gòu)在XML序列化后根節(jié)點(diǎn)的名稱

描述字符串如果是類似`xml:“id,attr”`的形式,則表明該字段將被序列化成為它上級(jí)節(jié)點(diǎn)的一個(gè)名為“id”的屬性(例子中是Person結(jié)構(gòu)中的ID字段)

描述字符串如果是類似`xml:"phone,omitempty"`的形式,則表示如果該字段有值則將正常序列化為名字為“phone”的XML元素節(jié)點(diǎn),否則如果是空值(包括各種Go語(yǔ)言中的零值,例如nil)則該節(jié)點(diǎn)將被省略XML序列化說(shuō)明3描述字符串如果是類似`xml:"mobiles>mobile"的形式,則表示該字段將被序列化成名為mobile的元素節(jié)點(diǎn),并且放在mobiles元素節(jié)點(diǎn)之內(nèi)成為它的下一級(jí)節(jié)點(diǎn);這種嵌套的級(jí)別可以是多級(jí)的,例如`xml:"mobiles>mobile>subs“

Person結(jié)構(gòu)中的Mobile字段是[]string類型的,表示一個(gè)人可以有多個(gè)手機(jī)號(hào),結(jié)合描述字符串`xml:"mobiles>mobile",這樣序列化出來(lái)的XML文本中,將用mobiles節(jié)點(diǎn)下并列的名為“mobile”的XML元素節(jié)點(diǎn)來(lái)表示多個(gè)手機(jī)號(hào);如果描述字符串為`xml:"mobile",則會(huì)有多個(gè)mobile節(jié)點(diǎn)被直接放在根節(jié)點(diǎn)(即本例中的person節(jié)點(diǎn))下形如`xml:",comment"`的描述字符串修飾的字段將被序列化成XML中的注釋,將不起數(shù)據(jù)存儲(chǔ)的作用XML序列化說(shuō)明4沒(méi)有加上描述字符串的字段,類似Person結(jié)構(gòu)中的Married字段,將被序列化為與該字段名字一致的XML節(jié)點(diǎn)所有被導(dǎo)出的字段(即大寫字母開頭的字段)才可以被序列化,小寫字母開頭的字段將被忽略,例如本例Person結(jié)構(gòu)中的height字段,雖然后面寫有XML序列化描述字符串,但仍然在序列化后的XML文本中被忽略掉

Person結(jié)構(gòu)中的SecondAddress字段是AddressType類型的,這也是我們?cè)诖a中自定義的一個(gè)結(jié)構(gòu),用于表示個(gè)人住址信息;這是結(jié)構(gòu)體中包含復(fù)合數(shù)據(jù)類型以及嵌套另一個(gè)結(jié)構(gòu)的方法XML序列化說(shuō)明5

匿名字段:在Person結(jié)構(gòu)中沒(méi)有字段名的也是AddressType類型的字段

匿名字段是Go語(yǔ)言中實(shí)現(xiàn)類似面向?qū)ο笾小袄^承”概念的重要手段

一個(gè)結(jié)構(gòu)體中如果有一個(gè)匿名字段,而該匿名字段又是一個(gè)結(jié)構(gòu)類型,則該匿名字段所代表結(jié)構(gòu)類型的所有字段會(huì)被自動(dòng)導(dǎo)入到該結(jié)構(gòu)體中引用結(jié)構(gòu)體中匿名字段時(shí),直接用該匿名字段的數(shù)據(jù)類型作為字段名即可XML序列化說(shuō)明6

AddressType結(jié)構(gòu)類型中的PostalCode字段的XML描述字符串演示了如何在某個(gè)子節(jié)點(diǎn)而非根節(jié)點(diǎn)中添加屬性

使用encoding/xml包中的Encoder數(shù)據(jù)類型來(lái)做XML的編碼(將數(shù)據(jù)序列化為XMLxml.MarshalIndent函數(shù)可以編碼出帶有縮進(jìn)的XML文本,返回的是[]byte類型的數(shù)據(jù),需要轉(zhuǎn)換成字符串才能輸出XML序列化說(shuō)明7

AddressType結(jié)構(gòu)類型中的PostalCode字段的XML描述字符串演示了如何在某個(gè)子節(jié)點(diǎn)而非根節(jié)點(diǎn)中添加屬性

使用encoding/xml包中的Encoder數(shù)據(jù)類型來(lái)做XML的編碼(將數(shù)據(jù)序列化為XMLxml.MarshalIndent函數(shù)可以編碼出帶有縮進(jìn)的XML文本,返回的是[]byte類型的數(shù)據(jù),需要轉(zhuǎn)換成字符串才能輸出XML格式的文本反序列化decoderT

:=

xml.NewDecoder(fileT)errT

=

decoderT.Decode(person1)

if

errT

!=

nil

{}

t.Printfln("person1:%#v",

person1)

person2

:=

&Person{}

bytesT,

errT

:=

ioutil.ReadFile(`c:\test\person1.xml`)if

errT

!=

nil

{}

errT

=

xml.Unmarshal(bytesT,

person2)if

errT

!=

nil

{}

t.Printfln("person2:%#v",

person2)XML處理的補(bǔ)充知識(shí)1如果在結(jié)構(gòu)體中沒(méi)有定義XMLName字段,XML序列化時(shí)將以結(jié)構(gòu)名字作為XML文本中根節(jié)點(diǎn)的名稱普通的數(shù)據(jù)類型也可以被進(jìn)行XML編碼,此時(shí)生成的節(jié)點(diǎn)名為該類型的名稱描述字符串為`xml:"-"`的結(jié)構(gòu)體中字段將被忽略描述字符串為`xml:",innerxml"`的字段,將原樣放在XML中而不會(huì)被加上標(biāo)簽(即不會(huì)生成XML元素節(jié)點(diǎn)),如果需要標(biāo)簽則應(yīng)自行加上XML處理的補(bǔ)充知識(shí)2描述字符串為`xml:",chardata"`的字段,也不會(huì)生成XML元素節(jié)點(diǎn),將被作為字符數(shù)據(jù)直接放入描述字符串為`xml:",cdata"`的字段,同樣也不會(huì)生成XML元素節(jié)點(diǎn),而是編碼為XML中的CDATA字符數(shù)據(jù)形式,該形式主要用于放入包含一些特殊字符的文本如果要讓CDATA字符數(shù)據(jù)在XML中放于一個(gè)元素節(jié)點(diǎn)之內(nèi),需要定義一個(gè)結(jié)構(gòu)類型,例子見下頁(yè):CDATA的應(yīng)用示例1type

CDATA

struct

{

string

`xml:",cdata"`}type

CodeData

struct

{

CodeName

string

CodeType

string

`xml:",attr"`

CodeDescription

string

`xml:",innerxml"`

CodeData1

[]byte

`xml:",chardata"`

CodeData2

CDATA

Remark

string

`xml:"-"`}CDATA的應(yīng)用示例2func

main()

{

code1

:=

new(CodeData)

code1.CodeName

=

"測(cè)試代碼"

code1.CodeType

=

"Go"

code1.CodeDescription

=

"\n<CodeDescription>本段描述將被原樣保留</CodeDescription>"

code1.CodeData1

=

[]byte{0x65,

0x33,

0x32}

code1.CodeData2

=

CDATA{`for

i

:=

0;

i

<=

18;

i

++

{fmt.Printf("18");}`}

code1.Remark

=

"本段備注將被忽略"

xmlBytesT,

errT

:=

xml.MarshalIndent(code1,

"",

"

")

if

errT

!=

nil

{

t.Printfln("XML編碼時(shí)發(fā)生錯(cuò)誤:%v",

errT)

return

}

t.Printfln("%v",

string(xmlBytesT))}CDATA的應(yīng)用示例3單個(gè)浮點(diǎn)數(shù)的XML:<float64>64.8</float64>code1編碼后的XML:<CodeDataCodeType="Go"><CodeName>測(cè)試代碼</CodeName><CodeDescription>本段描述將被原樣保留</CodeDescription>e32<CodeData2><![CDATA[fori:=0;i<=18;i++{fmt.Printf("18");}]]></CodeData2></CodeData>運(yùn)行結(jié)果自行控制某數(shù)據(jù)類型的XML序列化反序列化func

(v

AddressType)

MarshalXML(e

*xml.Encoder,

start

xml.StartElement)

error

{

stringAllT

:=

v.State

+

"|"

+

v.City

+

"|"

+

v.Detail

+

"|"

+

v.PostalCode

+

"|"

+

v.remark

e.EncodeElement(stringAllT,

start)

return

nil}

func

(p

*AddressType)

UnmarshalXML(d

*xml.Decoder,

start

xml.StartElement)

error

{

var

stringBufT

string

d.DecodeElement(&stringBufT,

&start)

listT

:=

strings.Split(stringBufT,

"|")

*p

=

AddressType{State:

listT[0],

City:

listT[1],

Detail:

listT[2],

PostalCode:

listT[3],

remark:

listT[4]}

return

nil}定義在AddressType數(shù)據(jù)類型上目錄導(dǎo)航10.3JSON格式的處理ContentsJSON數(shù)據(jù)格式

JSON格式是數(shù)據(jù)交換格式中使用最廣泛的格式之一,雖然起源于JavaScript語(yǔ)言,但實(shí)際應(yīng)用中已經(jīng)完全實(shí)現(xiàn)了跨語(yǔ)言、跨平臺(tái)的使用JSON格式最大的特點(diǎn)就是寫法簡(jiǎn)單易懂,處理快速,并具備大多數(shù)主要基本數(shù)據(jù)類型的表達(dá)能力

Go語(yǔ)言中處理JSON格式的序列化和反序列化與XML相比要簡(jiǎn)單很多將數(shù)據(jù)序列化成JSON格式1//

AddressType

表示個(gè)人住址的數(shù)據(jù)結(jié)構(gòu)type

AddressType

struct

{

State

string

City

string

Detail

string

PostalCode

string

remark

string}

//

Person

表示個(gè)人信息的數(shù)據(jù)結(jié)構(gòu)類型type

Person

struct

{

Name

string

ID

string

Age

int

Married

bool

Phone

string

Mobile

[]string

height

float64

AddressType

SecondAddress

AddressType

Remark

string}數(shù)據(jù)結(jié)構(gòu)一般無(wú)需特別處理將數(shù)據(jù)序列化成JSON格式2person1

:=

&Person{Name:

"張三",

ID:

,

Age:

25,

Married:

false,

Mobile:

[]string{,

},

height:

170,

AddressType:

AddressType{State:

"中國(guó)",

City:

"北京",

Detail:

"海淀區(qū)中關(guān)村1號(hào)",

PostalCode:

"100099",

remark:

"路口右轉(zhuǎn)"},

SecondAddress:

AddressType{State:

"中國(guó)",

City:

"上海",

Detail:

"徐匯區(qū)南京路1號(hào)",

PostalCode:

"210001",

remark:

"無(wú)"},

Remark:

"信息有待完善"}

var

strT

strings.BuilderencoderT

:=

json.NewEncoder(&strT)errT

:=

encoderT.Encode(person1)if

errT

!=

nil

{}

t.Printfln("JSON字符串為:%#v",

strT.String())

outputT,

errT

:=

json.MarshalIndent(person1,

"

",

"

")if

errT

!=

nil

{}

os.Stdout.Write(outputT)t.SaveStringToFile(string(outputT),

`c:\test\person1.json`)將數(shù)據(jù)序列化成JSON格式3JSON字符串為:"{\"Name\":\"張三\",\"ID\":\",\"Age\":25,\"Married\":false,\"Phone\":\"\",\"Mobile\":[\",\"],\"State\":\"中國(guó)\",\"City\":\"北京\",\"Detail\":\"海淀區(qū)中關(guān)村1號(hào)\",\"PostalCode\":\"100099\",\"SecondAddress\":{\"State\":\"中國(guó)\",\"City\":\"上海\",\"Detail\":\"徐匯區(qū)南京路1號(hào)\",\"PostalCode\":\"210001\"},\"Remark\":\"信息有待完善\"}\n"

{"Name":"張三","ID":,"Age":25,"Married":false,"Phone":"","Mobile":[,],"State":"中國(guó)","City":"北京","Detail":"海淀區(qū)中關(guān)村1號(hào)","PostalCode":"100099","SecondAddress":{"State":"中國(guó)","City":"上海","Detail":"徐匯區(qū)南京路1號(hào)","PostalCode":"210001"},"Remark":"信息有待完善"}將JSON格式的文本反序列化decoderT

:=

json.NewDecoder(fileT)errT

=

decoderT.Decode(person1)if

errT

!=

nil

{}

t.Printfln("person1:%#v",

person1)

person2

:=

&Person{}

bytesT,

errT

:=

ioutil.ReadFile(`c:\test\person1.json`)if

errT

!=

nil

{}

errT

=

json.Unmarshal(bytesT,

person2)if

errT

!=

nil

{}

t.Printfln("person2:%#v",

person2)JSON序列化/反序列化時(shí)使用描述字符串type

Person

struct

{

Name

string

`json:"name"`

ID

string

Age

int

`json:",string"`

Married

bool

`json:",omitempty"`

Phone

string

Mobile

[]string

height

float64

`json:"height"`

AddressType

SecondAddress

AddressType

Remark

string

`json:"-"`}與XML類似,JSON也可以加描述字符串特殊說(shuō)明使用類似`json:"name"`的JSON序列化描述字符串,可以設(shè)置該字段在JSON中的鍵(key)名,這也可以突破不使用描述字符串時(shí)鍵名必須為大寫字母開頭的限制,這一點(diǎn)在解析網(wǎng)絡(luò)上很多JSON接口或文件時(shí)非常有用,因?yàn)槌薌o語(yǔ)言之外,很少有其他語(yǔ)言限制這一點(diǎn)

`json:",string"`這樣的描述字符串一般用于描述數(shù)字類型的字段,表示雖然該字段是數(shù)字,但是也按照字符串形式來(lái)編碼控制自定義數(shù)據(jù)類型的JSON序列化/反序列化func

(v

AddressType)

MarshalJSON()

([]byte,

error)

{

stringAllT

:=

v.State

+

"|"

+

v.City

+

"|"

+

v.Detail

+

"|"

+

v.PostalCode

+

"|"

+

v.remark

return

json.Marshal(stringAllT)}

func

(p

*AddressType)

UnmarshalJSON(b

[]byte)

error

{

var

stringBufT

string

errT

:=

json.Unmarshal(b,

&stringBufT)

if

errT

!=

nil

{

return

errT

}

listT

:=

strings.Split(stringBufT,

"|")

*p

=

AddressType{State:

listT[0],

City:

listT[1],

Detail:

listT[2],

PostalCode:

listT[3],

remark:

listT[4]}

return

nil}注意思考兩個(gè)函數(shù)為什么一個(gè)定義在值上,一個(gè)定義在引用上用空接口類型實(shí)現(xiàn)復(fù)雜結(jié)構(gòu)的JSON序列化map1T

:=

map[string]interface{}{

"Name":

"小明",

"Age":

11,

"Gender":

"男",

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論