go語言底層是什么實(shí)現(xiàn)的 go語言底層是什么實(shí)現(xiàn)的

golang底層用什么語言實(shí)現(xiàn)的

golang底層用什么語言實(shí)現(xiàn)的

公司主營業(yè)務(wù):網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出欽州免費(fèi)做網(wǎng)站回饋大家。

Go runtime的調(diào)度器:

在了解Go的運(yùn)行時(shí)的scheduler之前,需要先了解為什么需要它,因?yàn)槲覀兛赡軙耄琌S內(nèi)核不是已經(jīng)有一個(gè)線程scheduler了嘛?

熟悉POSIX API的人都知道,POSIX的方案在很大程度上是對Unix process進(jìn)場模型的一個(gè)邏輯描述和擴(kuò)展,兩者有很多相似的地方。 Thread有自己的信號掩碼,CPU affinity等。但是很多特征對于Go程序來說都是累贅。 尤其是context上下文切換的耗時(shí)。另一個(gè)原因是Go的垃圾回

workerman用什么語言實(shí)現(xiàn)的

Workerman是一款純PHP開發(fā)的開源高性能的PHP socket 服務(wù)器框架。被廣泛的用于手機(jī)app、移動(dòng)通訊,微信小程序,手游服務(wù)端、網(wǎng)絡(luò)游戲、PHP聊天室、硬件通訊、智能家居、車聯(lián)網(wǎng)、物聯(lián)網(wǎng)等領(lǐng)域的開發(fā)。 支持TCP長連接,支持Websocket、HTTP等協(xié)議,支持自定義協(xié)議。擁有異步Mysql、異步Redis、異步Http、異步消息隊(duì)列等眾多高性能組件

cassandra用什么語言實(shí)現(xiàn)的

Cassandra 的名稱來源于希臘神話,是特洛伊的一位悲劇性的女先知的名字,因此項(xiàng)目的Logo是一只放光的眼睛。

這個(gè)項(xiàng)目由就職于Facebook的Avinash Lakshman(也是Amazon Dynamo的作者之一)和Prashant Malik在為Facebook的Inbox編寫。2008年,F(xiàn)acebook將項(xiàng)目開源,Cassandra在2009年成為了Apache軟件基金會的Incubator項(xiàng)目,并在2010年2月走出孵化器,成為正式的基金會項(xiàng)目。目前這個(gè)項(xiàng)目主要由專門進(jìn)行Cassandra商業(yè)化運(yùn)作的DataStax公司來開發(fā),也有一些來自其他公司或獨(dú)立的開發(fā)者

zookepeer是用什么語言實(shí)現(xiàn)的

本文是Jason Wilder對于常見的服務(wù)發(fā)現(xiàn)項(xiàng)目 Zookeeper , Doozer , Etcd 所寫的一篇博客,其原文地址如下: Open-Source Service Discovery 。 服務(wù)發(fā)現(xiàn)是大多數(shù)分布式系統(tǒng)以及面向服務(wù)架構(gòu)(SOA)的一個(gè)核心組成部分。

ovation是用什么語言實(shí)現(xiàn)的

隨你高興,和語言沒有關(guān)系.就像你說的這句話可以用中文說,一樣可以用隨便什么語言表達(dá)同樣的意思.

SmoothDraw 3是用什么語言實(shí)現(xiàn)的

objectMainextendsApp{

varreverse_pairs = 0逆序數(shù)

defmsort[T](cmp:(T, T) = Boolean)(l:List[T]):List[T] = {

defmerge(l1:List[T], l2:List[T]):List[T]=(l1, l2)match{

case(Nil, _) = l2

case(_, Nil) = l1

case(x::left1, y::left2) =

if(cmp(x, y))

x::merge(left1, l2)

else{

reverse_pairs += l1.length

y::merge(l1, left2)

}

}

valn = l.length / 2

if(n == 0)

return l

else{

val(l1, l2) = l.splitAt(n)

merge(msort(cmp)(l1), msort(cmp)(l2))

}

}

println(msort((x:Int, y:Int) = xy)(List(5, 4, 3, 2, 7,6 )))

println(reverse_pairs)

}

百度用什么編程語言實(shí)現(xiàn)的?

應(yīng)該是Java的技術(shù)(jsp/servlet)或PHP,平臺應(yīng)該是Linux/Unix.這個(gè)我是從百度的招聘頁面上的招聘信息,猜想的。

而且Java的面大

Struts1的底層用什么實(shí)現(xiàn)的?

struts原理其實(shí)就是一個(gè)Servlet,只不過有一個(gè)中央處理器在配置文件里面,

客戶端的請求先通過web.xml配置文件里面 找到ActionServlet來處理,ActionServlet會根據(jù)你的請求來分配具體的Action來處理你,處理完了以后,然后轉(zhuǎn)發(fā)頁面,顯示數(shù)據(jù),就這一系列操作。

用verilog語言實(shí)現(xiàn)的nand flash

這種題目太可笑了

用verilog實(shí)現(xiàn)其行為 并給出邏輯門搭建的陣列是很簡單

但是在不涉及任何工藝的情況下, K9 Flash(本身指的是利用浮柵晶體管雪崩效應(yīng)寫入 隧傳效應(yīng)成批擦出的一種工藝) 沒有任何意義

何況對于存儲器這種陣列邏輯 沒有用verilog 來半定制設(shè)計(jì)的道理

從來都是針對foundry工藝庫給定的宏進(jìn)行配置來直接生成可用的各種模型

行為模型的話 只要你清楚nand flash的工作原理就行了 很容易

python解釋器是用什么語言實(shí)現(xiàn)的

用的是python解釋器。 首先win+R 運(yùn)行cmd,如果 python --version不報(bào)錯(cuò),則表明環(huán)境正確 python file.name運(yùn)行即可

沒有類,C語言有結(jié)構(gòu)體,那么Go的結(jié)構(gòu)體有什么特別之處?

Go語言中沒有“類”的概念,也不支持“類”的繼承等面向?qū)ο蟮母拍?。Go語言中通過結(jié)構(gòu)體的內(nèi)嵌再配合接口比面向?qū)ο缶哂懈叩臄U(kuò)展性和靈活性。

自定義類型

在Go語言中有一些基本的數(shù)據(jù)類型,如string、整型、浮點(diǎn)型、布爾等數(shù)據(jù)類型, Go語言中可以使用type關(guān)鍵字來定義自定義類型。

自定義類型是定義了一個(gè)全新的類型。我們可以基于內(nèi)置的基本類型定義,也可以通過struct定義。例如:

通過Type關(guān)鍵字的定義,MyInt就是一種新的類型,它具有int的特性。

類型別名

類型別名是Go1.9版本添加的新功能。

類型別名規(guī)定:TypeAlias只是Type的別名,本質(zhì)上TypeAlias與Type是同一個(gè)類型。就像一個(gè)孩子小時(shí)候有小名、乳名,上學(xué)后用學(xué)名,英語老師又會給他起英文名,但這些名字都指的是他本人。

type TypeAlias = Type

我們之前見過的rune和byte就是類型別名,他們的定義如下:

類型定義和類型別名的區(qū)別

類型別名與類型定義表面上看只有一個(gè)等號的差異,我們通過下面的這段代碼來理解它們之間的區(qū)別。

結(jié)果顯示a的類型是main.NewInt,表示main包下定義的NewInt類型。b的類型是int。MyInt類型只會在代碼中存在,編譯完成時(shí)并不會有MyInt類型。

Go語言中的基礎(chǔ)數(shù)據(jù)類型可以表示一些事物的基本屬性,但是當(dāng)我們想表達(dá)一個(gè)事物的全部或部分屬性時(shí),這時(shí)候再用單一的基本數(shù)據(jù)類型明顯就無法滿足需求了,Go語言提供了一種自定義數(shù)據(jù)類型,可以封裝多個(gè)基本數(shù)據(jù)類型,這種數(shù)據(jù)類型叫結(jié)構(gòu)體,英文名稱struct。 也就是我們可以通過struct來定義自己的類型了。

Go語言中通過struct來實(shí)現(xiàn)面向?qū)ο蟆?/p>

結(jié)構(gòu)體的定義

使用type和struct關(guān)鍵字來定義結(jié)構(gòu)體,具體代碼格式如下:

其中:

舉個(gè)例子,我們定義一個(gè)Person(人)結(jié)構(gòu)體,代碼如下:

同樣類型的字段也可以寫在一行,

這樣我們就擁有了一個(gè)person的自定義類型,它有name、city、age三個(gè)字段,分別表示姓名、城市和年齡。這樣我們使用這個(gè)person結(jié)構(gòu)體就能夠很方便的在程序中表示和存儲人信息了。

語言內(nèi)置的基礎(chǔ)數(shù)據(jù)類型是用來描述一個(gè)值的,而結(jié)構(gòu)體是用來描述一組值的。比如一個(gè)人有名字、年齡和居住城市等,本質(zhì)上是一種聚合型的數(shù)據(jù)類型

結(jié)構(gòu)體實(shí)例化

只有當(dāng)結(jié)構(gòu)體實(shí)例化時(shí),才會真正地分配內(nèi)存。也就是必須實(shí)例化后才能使用結(jié)構(gòu)體的字段。

基本實(shí)例化

舉個(gè)例子:

我們通過.來訪問結(jié)構(gòu)體的字段(成員變量),例如p1.name和p1.age等。

匿名結(jié)構(gòu)體

在定義一些臨時(shí)數(shù)據(jù)結(jié)構(gòu)等場景下還可以使用匿名結(jié)構(gòu)體。

創(chuàng)建指針類型結(jié)構(gòu)體

我們還可以通過使用new關(guān)鍵字對結(jié)構(gòu)體進(jìn)行實(shí)例化,得到的是結(jié)構(gòu)體的地址。 格式如下:

從打印的結(jié)果中我們可以看出p2是一個(gè)結(jié)構(gòu)體指針。

需要注意的是在Go語言中支持對結(jié)構(gòu)體指針直接使用.來訪問結(jié)構(gòu)體的成員。

取結(jié)構(gòu)體的地址實(shí)例化

使用對結(jié)構(gòu)體進(jìn)行取地址操作相當(dāng)于對該結(jié)構(gòu)體類型進(jìn)行了一次new實(shí)例化操作。

p3.name = "七米"其實(shí)在底層是(*p3).name = "七米",這是Go語言幫我們實(shí)現(xiàn)的語法糖。

結(jié)構(gòu)體初始化

沒有初始化的結(jié)構(gòu)體,其成員變量都是對應(yīng)其類型的零值。

使用鍵值對初始化

使用鍵值對對結(jié)構(gòu)體進(jìn)行初始化時(shí),鍵對應(yīng)結(jié)構(gòu)體的字段,值對應(yīng)該字段的初始值。

也可以對結(jié)構(gòu)體指針進(jìn)行鍵值對初始化,例如:

當(dāng)某些字段沒有初始值的時(shí)候,該字段可以不寫。此時(shí),沒有指定初始值的字段的值就是該字段類型的零值。

使用值的列表初始化

初始化結(jié)構(gòu)體的時(shí)候可以簡寫,也就是初始化的時(shí)候不寫鍵,直接寫值:

使用這種格式初始化時(shí),需要注意:

結(jié)構(gòu)體內(nèi)存布局

結(jié)構(gòu)體占用一塊連續(xù)的內(nèi)存。

輸出:

【進(jìn)階知識點(diǎn)】關(guān)于Go語言中的內(nèi)存對齊推薦閱讀:在 Go 中恰到好處的內(nèi)存對齊

面試題

請問下面代碼的執(zhí)行結(jié)果是什么?

構(gòu)造函數(shù)

Go語言的結(jié)構(gòu)體沒有構(gòu)造函數(shù),我們可以自己實(shí)現(xiàn)。 例如,下方的代碼就實(shí)現(xiàn)了一個(gè)person的構(gòu)造函數(shù)。 因?yàn)閟truct是值類型,如果結(jié)構(gòu)體比較復(fù)雜的話,值拷貝性能開銷會比較大,所以該構(gòu)造函數(shù)返回的是結(jié)構(gòu)體指針類型。

調(diào)用構(gòu)造函數(shù)

方法和接收者

Go語言中的方法(Method)是一種作用于特定類型變量的函數(shù)。這種特定類型變量叫做接收者(Receiver)。接收者的概念就類似于其他語言中的this或者 self。

方法的定義格式如下:

其中,

舉個(gè)例子:

方法與函數(shù)的區(qū)別是,函數(shù)不屬于任何類型,方法屬于特定的類型。

指針類型的接收者

指針類型的接收者由一個(gè)結(jié)構(gòu)體的指針組成,由于指針的特性,調(diào)用方法時(shí)修改接收者指針的任意成員變量,在方法結(jié)束后,修改都是有效的。這種方式就十分接近于其他語言中面向?qū)ο笾械膖his或者self。 例如我們?yōu)镻erson添加一個(gè)SetAge方法,來修改實(shí)例變量的年齡。

調(diào)用該方法:

值類型的接收者

當(dāng)方法作用于值類型接收者時(shí),Go語言會在代碼運(yùn)行時(shí)將接收者的值復(fù)制一份。在值類型接收者的方法中可以獲取接收者的成員值,但修改操作只是針對副本,無法修改接收者變量本身。

什么時(shí)候應(yīng)該使用指針類型接收者

任意類型添加方法

在Go語言中,接收者的類型可以是任何類型,不僅僅是結(jié)構(gòu)體,任何類型都可以擁有方法。 舉個(gè)例子,我們基于內(nèi)置的int類型使用type關(guān)鍵字可以定義新的自定義類型,然后為我們的自定義類型添加方法。

注意事項(xiàng): 非本地類型不能定義方法,也就是說我們不能給別的包的類型定義方法。

結(jié)構(gòu)體的匿名字段

匿名字段默認(rèn)采用類型名作為字段名,結(jié)構(gòu)體要求字段名稱必須唯一,因此一個(gè)結(jié)構(gòu)體中同種類型的匿名字段只能有一個(gè)。

嵌套結(jié)構(gòu)體

一個(gè)結(jié)構(gòu)體中可以嵌套包含另一個(gè)結(jié)構(gòu)體或結(jié)構(gòu)體指針。

嵌套匿名結(jié)構(gòu)體

當(dāng)訪問結(jié)構(gòu)體成員時(shí)會先在結(jié)構(gòu)體中查找該字段,找不到再去匿名結(jié)構(gòu)體中查找。

嵌套結(jié)構(gòu)體的字段名沖突

嵌套結(jié)構(gòu)體內(nèi)部可能存在相同的字段名。這個(gè)時(shí)候?yàn)榱吮苊馄缌x需要指定具體的內(nèi)嵌結(jié)構(gòu)體的字段。

結(jié)構(gòu)體的“繼承”

Go語言中使用結(jié)構(gòu)體也可以實(shí)現(xiàn)其他編程語言中面向?qū)ο蟮睦^承。

結(jié)構(gòu)體字段的可見性

結(jié)構(gòu)體中字段大寫開頭表示可公開訪問,小寫表示私有(僅在定義當(dāng)前結(jié)構(gòu)體的包中可訪問)。

結(jié)構(gòu)體與JSON序列化

JSON(JavaScript Object Notation) 是一種輕量級的數(shù)據(jù)交換格式。易于人閱讀和編寫。同時(shí)也易于機(jī)器解析和生成。JSON鍵值對是用來保存JS對象的一種方式,鍵/值對組合中的鍵名寫在前面并用雙引號""包裹,使用冒號:分隔,然后緊接著值;多個(gè)鍵值之間使用英文,分隔。

結(jié)構(gòu)體標(biāo)簽(Tag)

Tag是結(jié)構(gòu)體的元信息,可以在運(yùn)行的時(shí)候通過反射的機(jī)制讀取出來。 Tag在結(jié)構(gòu)體字段的后方定義,由一對反引號包裹起來,具體的格式如下:

`key1:"value1" key2:"value2"`

結(jié)構(gòu)體標(biāo)簽由一個(gè)或多個(gè)鍵值對組成。鍵與值使用冒號分隔,值用雙引號括起來。鍵值對之間使用一個(gè)空格分隔。 注意事項(xiàng): 為結(jié)構(gòu)體編寫Tag時(shí),必須嚴(yán)格遵守鍵值對的規(guī)則。結(jié)構(gòu)體標(biāo)簽的解析代碼的容錯(cuò)能力很差,一旦格式寫錯(cuò),編譯和運(yùn)行時(shí)都不會提示任何錯(cuò)誤,通過反射也無法正確取值。例如不要在key和value之間添加空格。

例如我們?yōu)镾tudent結(jié)構(gòu)體的每個(gè)字段定義json序列化時(shí)使用的Tag:

goland map底層原理

map 是Go語言中基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu),在日常的使用中經(jīng)常被用到。但是它底層是如何實(shí)現(xiàn)的呢?

總體來說golang的map是hashmap,是使用數(shù)組+鏈表的形式實(shí)現(xiàn)的,使用拉鏈法消除hash沖突。

golang的map由兩種重要的結(jié)構(gòu),hmap和bmap(下文中都有解釋),主要就是hmap中包含一個(gè)指向bmap數(shù)組的指針,key經(jīng)過hash函數(shù)之后得到一個(gè)數(shù),這個(gè)數(shù)低位用于選擇bmap(當(dāng)作bmap數(shù)組指針的下表),高位用于放在bmap的[8]uint8數(shù)組中,用于快速試錯(cuò)。然后一個(gè)bmap可以指向下一個(gè)bmap(拉鏈)。

Golang中map的底層實(shí)現(xiàn)是一個(gè)散列表,因此實(shí)現(xiàn)map的過程實(shí)際上就是實(shí)現(xiàn)散表的過程。在這個(gè)散列表中,主要出現(xiàn)的結(jié)構(gòu)體有兩個(gè),一個(gè)叫 hmap (a header for a go map),一個(gè)叫 bmap (a bucket for a Go map,通常叫其bucket)。這兩種結(jié)構(gòu)的樣子分別如下所示:

hmap :

圖中有很多字段,但是便于理解map的架構(gòu),你只需要關(guān)心的只有一個(gè),就是標(biāo)紅的字段: buckets數(shù)組 。Golang的map中用于存儲的結(jié)構(gòu)是bucket數(shù)組。而bucket(即bmap)的結(jié)構(gòu)是怎樣的呢?

bucket :

相比于hmap,bucket的結(jié)構(gòu)顯得簡單一些,標(biāo)紅的字段依然是“核心”,我們使用的map中的key和value就存儲在這里?!案呶还V怠睌?shù)組記錄的是當(dāng)前bucket中key相關(guān)的“索引”,稍后會詳細(xì)敘述。還有一個(gè)字段是一個(gè)指向擴(kuò)容后的bucket的指針,使得bucket會形成一個(gè)鏈表結(jié)構(gòu)。例如下圖:

由此看出hmap和bucket的關(guān)系是這樣的:

而bucket又是一個(gè)鏈表,所以,整體的結(jié)構(gòu)應(yīng)該是這樣的:

哈希表的特點(diǎn)是會有一個(gè)哈希函數(shù),對你傳來的key進(jìn)行哈希運(yùn)算,得到唯一的值,一般情況下都是一個(gè)數(shù)值。Golang的map中也有這么一個(gè)哈希函數(shù),也會算出唯一的值,對于這個(gè)值的使用,Golang也是很有意思。

Golang把求得的值按照用途一分為二:高位和低位。

如圖所示,藍(lán)色為高位,紅色為低位。 然后低位用于尋找當(dāng)前key屬于hmap中的哪個(gè)bucket,而高位用于尋找bucket中的哪個(gè)key。上文中提到:bucket中有個(gè)屬性字段是“高位哈希值”數(shù)組,這里存的就是藍(lán)色的高位值,用來聲明當(dāng)前bucket中有哪些“key”,便于搜索查找。 需要特別指出的一點(diǎn)是:我們map中的key/value值都是存到同一個(gè)數(shù)組中的。數(shù)組中的順序是這樣的:

并不是key0/value0/key1/value1的形式,這樣做的好處是:在key和value的長度不同的時(shí)候,可 以消除padding(內(nèi)存對齊)帶來的空間浪費(fèi) 。

現(xiàn)在,我們可以得到Go語言map的整個(gè)的結(jié)構(gòu)圖了:(hash結(jié)果的低位用于選擇把KV放在bmap數(shù)組中的哪一個(gè)bmap中,高位用于key的快速預(yù)覽,用于快速試錯(cuò))

map的擴(kuò)容

當(dāng)以上的哈希表增長的時(shí)候,Go語言會將bucket數(shù)組的數(shù)量擴(kuò)充一倍,產(chǎn)生一個(gè)新的bucket數(shù)組,并將舊數(shù)組的數(shù)據(jù)遷移至新數(shù)組。

加載因子

判斷擴(kuò)充的條件,就是哈希表中的加載因子(即loadFactor)。

加載因子是一個(gè)閾值,一般表示為:散列包含的元素?cái)?shù) 除以 位置總數(shù)。是一種“產(chǎn)生沖突機(jī)會”和“空間使用”的平衡與折中:加載因子越小,說明空間空置率高,空間使用率小,但是加載因子越大,說明空間利用率上去了,但是“產(chǎn)生沖突機(jī)會”高了。

每種哈希表的都會有一個(gè)加載因子,數(shù)值超過加載因子就會為哈希表擴(kuò)容。

Golang的map的加載因子的公式是:map長度 / 2^B(這是代表bmap數(shù)組的長度,B是取的低位的位數(shù))閾值是6.5。其中B可以理解為已擴(kuò)容的次數(shù)。

當(dāng)Go的map長度增長到大于加載因子所需的map長度時(shí),Go語言就會將產(chǎn)生一個(gè)新的bucket數(shù)組,然后把舊的bucket數(shù)組移到一個(gè)屬性字段oldbucket中。注意:并不是立刻把舊的數(shù)組中的元素轉(zhuǎn)義到新的bucket當(dāng)中,而是,只有當(dāng)訪問到具體的某個(gè)bucket的時(shí)候,會把bucket中的數(shù)據(jù)轉(zhuǎn)移到新的bucket中。

如下圖所示:當(dāng)擴(kuò)容的時(shí)候,Go的map結(jié)構(gòu)體中,會保存舊的數(shù)據(jù),和新生成的數(shù)組

上面部分代表舊的有數(shù)據(jù)的bucket,下面部分代表新生成的新的bucket。藍(lán)色代表存有數(shù)據(jù)的bucket,橘黃色代表空的bucket。

擴(kuò)容時(shí)map并不會立即把新數(shù)據(jù)做遷移,而是當(dāng)訪問原來舊bucket的數(shù)據(jù)的時(shí)候,才把舊數(shù)據(jù)做遷移,如下圖:

注意:這里并不會直接刪除舊的bucket,而是把原來的引用去掉,利用GC清除內(nèi)存。

map中數(shù)據(jù)的刪除

如果理解了map的整體結(jié)構(gòu),那么查找、更新、刪除的基本步驟應(yīng)該都很清楚了。這里不再贅述。

值得注意的是,找到了map中的數(shù)據(jù)之后,針對key和value分別做如下操作:

1

2

3

4

1、如果``key``是一個(gè)指針類型的,則直接將其置為空,等待GC清除;

2、如果是值類型的,則清除相關(guān)內(nèi)存。

3、同理,對``value``做相同的操作。

4、最后把key對應(yīng)的高位值對應(yīng)的數(shù)組index置為空。

網(wǎng)站標(biāo)題:go語言底層是什么實(shí)現(xiàn)的 go語言底層是什么實(shí)現(xiàn)的
網(wǎng)頁鏈接:http://muchs.cn/article24/doccjce.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化、動(dòng)態(tài)網(wǎng)站、網(wǎng)頁設(shè)計(jì)公司、Google、響應(yīng)式網(wǎng)站自適應(yīng)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)