欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

go語(yǔ)言左移,go 左移右移

golang 變量左移是什么意思

編譯型語(yǔ)言,編譯器的靜態(tài)求值是自然的。

創(chuàng)新互聯(lián)主營(yíng)蘭溪網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,成都app軟件開(kāi)發(fā)公司,蘭溪h5小程序開(kāi)發(fā)搭建,蘭溪網(wǎng)站營(yíng)銷(xiāo)推廣歡迎蘭溪等地區(qū)企業(yè)咨詢(xún)

必須使用強(qiáng)制類(lèi)型轉(zhuǎn)換。甚至于對(duì)一個(gè)uint16變量賦uint8的值都是不允許的。

整數(shù)字面值不包含存儲(chǔ)空間的大小,可以直接賦給各種uintX(必須不溢出)。

運(yùn)算的結(jié)果的類(lèi)型,以左側(cè)操作數(shù)為準(zhǔn)。

【golang詳解】go語(yǔ)言GMP(GPM)原理和調(diào)度

Goroutine調(diào)度是一個(gè)很復(fù)雜的機(jī)制,下面嘗試用簡(jiǎn)單的語(yǔ)言描述一下Goroutine調(diào)度機(jī)制,想要對(duì)其有更深入的了解可以去研讀一下源碼。

首先介紹一下GMP什么意思:

G ----------- goroutine: 即Go協(xié)程,每個(gè)go關(guān)鍵字都會(huì)創(chuàng)建一個(gè)協(xié)程。

M ---------- thread內(nèi)核級(jí)線程,所有的G都要放在M上才能運(yùn)行。

P ----------- processor處理器,調(diào)度G到M上,其維護(hù)了一個(gè)隊(duì)列,存儲(chǔ)了所有需要它來(lái)調(diào)度的G。

Goroutine 調(diào)度器P和 OS 調(diào)度器是通過(guò) M 結(jié)合起來(lái)的,每個(gè) M 都代表了 1 個(gè)內(nèi)核線程,OS 調(diào)度器負(fù)責(zé)把內(nèi)核線程分配到 CPU 的核上執(zhí)行

模型圖:

避免頻繁的創(chuàng)建、銷(xiāo)毀線程,而是對(duì)線程的復(fù)用。

1)work stealing機(jī)制

當(dāng)本線程無(wú)可運(yùn)行的G時(shí),嘗試從其他線程綁定的P偷取G,而不是銷(xiāo)毀線程。

2)hand off機(jī)制

當(dāng)本線程M0因?yàn)镚0進(jìn)行系統(tǒng)調(diào)用阻塞時(shí),線程釋放綁定的P,把P轉(zhuǎn)移給其他空閑的線程執(zhí)行。進(jìn)而某個(gè)空閑的M1獲取P,繼續(xù)執(zhí)行P隊(duì)列中剩下的G。而M0由于陷入系統(tǒng)調(diào)用而進(jìn)被阻塞,M1接替M0的工作,只要P不空閑,就可以保證充分利用CPU。M1的來(lái)源有可能是M的緩存池,也可能是新建的。當(dāng)G0系統(tǒng)調(diào)用結(jié)束后,根據(jù)M0是否能獲取到P,將會(huì)將G0做不同的處理:

如果有空閑的P,則獲取一個(gè)P,繼續(xù)執(zhí)行G0。

如果沒(méi)有空閑的P,則將G0放入全局隊(duì)列,等待被其他的P調(diào)度。然后M0將進(jìn)入緩存池睡眠。

如下圖

GOMAXPROCS設(shè)置P的數(shù)量,最多有GOMAXPROCS個(gè)線程分布在多個(gè)CPU上同時(shí)運(yùn)行

在Go中一個(gè)goroutine最多占用CPU 10ms,防止其他goroutine被餓死。

具體可以去看另一篇文章

【Golang詳解】go語(yǔ)言調(diào)度機(jī)制 搶占式調(diào)度

當(dāng)創(chuàng)建一個(gè)新的G之后優(yōu)先加入本地隊(duì)列,如果本地隊(duì)列滿了,會(huì)將本地隊(duì)列的G移動(dòng)到全局隊(duì)列里面,當(dāng)M執(zhí)行work stealing從其他P偷不到G時(shí),它可以從全局G隊(duì)列獲取G。

協(xié)程經(jīng)歷過(guò)程

我們創(chuàng)建一個(gè)協(xié)程 go func()經(jīng)歷過(guò)程如下圖:

說(shuō)明:

這里有兩個(gè)存儲(chǔ)G的隊(duì)列,一個(gè)是局部調(diào)度器P的本地隊(duì)列、一個(gè)是全局G隊(duì)列。新創(chuàng)建的G會(huì)先保存在P的本地隊(duì)列中,如果P的本地隊(duì)列已經(jīng)滿了就會(huì)保存在全局的隊(duì)列中;處理器本地隊(duì)列是一個(gè)使用數(shù)組構(gòu)成的環(huán)形鏈表,它最多可以存儲(chǔ) 256 個(gè)待執(zhí)行任務(wù)。

G只能運(yùn)行在M中,一個(gè)M必須持有一個(gè)P,M與P是1:1的關(guān)系。M會(huì)從P的本地隊(duì)列彈出一個(gè)可執(zhí)行狀態(tài)的G來(lái)執(zhí)行,如果P的本地隊(duì)列為空,就會(huì)想其他的MP組合偷取一個(gè)可執(zhí)行的G來(lái)執(zhí)行;

一個(gè)M調(diào)度G執(zhí)行的過(guò)程是一個(gè)循環(huán)機(jī)制;會(huì)一直從本地隊(duì)列或全局隊(duì)列中獲取G

上面說(shuō)到P的個(gè)數(shù)默認(rèn)等于CPU核數(shù),每個(gè)M必須持有一個(gè)P才可以執(zhí)行G,一般情況下M的個(gè)數(shù)會(huì)略大于P的個(gè)數(shù),這多出來(lái)的M將會(huì)在G產(chǎn)生系統(tǒng)調(diào)用時(shí)發(fā)揮作用。類(lèi)似線程池,Go也提供一個(gè)M的池子,需要時(shí)從池子中獲取,用完放回池子,不夠用時(shí)就再創(chuàng)建一個(gè)。

work-stealing調(diào)度算法:當(dāng)M執(zhí)行完了當(dāng)前P的本地隊(duì)列隊(duì)列里的所有G后,P也不會(huì)就這么在那躺尸啥都不干,它會(huì)先嘗試從全局隊(duì)列隊(duì)列尋找G來(lái)執(zhí)行,如果全局隊(duì)列為空,它會(huì)隨機(jī)挑選另外一個(gè)P,從它的隊(duì)列里中拿走一半的G到自己的隊(duì)列中執(zhí)行。

如果一切正常,調(diào)度器會(huì)以上述的那種方式順暢地運(yùn)行,但這個(gè)世界沒(méi)這么美好,總有意外發(fā)生,以下分析goroutine在兩種例外情況下的行為。

Go runtime會(huì)在下面的goroutine被阻塞的情況下運(yùn)行另外一個(gè)goroutine:

用戶態(tài)阻塞/喚醒

當(dāng)goroutine因?yàn)閏hannel操作或者network I/O而阻塞時(shí)(實(shí)際上golang已經(jīng)用netpoller實(shí)現(xiàn)了goroutine網(wǎng)絡(luò)I/O阻塞不會(huì)導(dǎo)致M被阻塞,僅阻塞G,這里僅僅是舉個(gè)栗子),對(duì)應(yīng)的G會(huì)被放置到某個(gè)wait隊(duì)列(如channel的waitq),該G的狀態(tài)由_Gruning變?yōu)開(kāi)Gwaitting,而M會(huì)跳過(guò)該G嘗試獲取并執(zhí)行下一個(gè)G,如果此時(shí)沒(méi)有可運(yùn)行的G供M運(yùn)行,那么M將解綁P,并進(jìn)入sleep狀態(tài);當(dāng)阻塞的G被另一端的G2喚醒時(shí)(比如channel的可讀/寫(xiě)通知),G被標(biāo)記為,嘗試加入G2所在P的runnext(runnext是線程下一個(gè)需要執(zhí)行的 Goroutine。), 然后再是P的本地隊(duì)列和全局隊(duì)列。

系統(tǒng)調(diào)用阻塞

當(dāng)M執(zhí)行某一個(gè)G時(shí)候如果發(fā)生了阻塞操作,M會(huì)阻塞,如果當(dāng)前有一些G在執(zhí)行,調(diào)度器會(huì)把這個(gè)線程M從P中摘除,然后再創(chuàng)建一個(gè)新的操作系統(tǒng)的線程(如果有空閑的線程可用就復(fù)用空閑線程)來(lái)服務(wù)于這個(gè)P。當(dāng)M系統(tǒng)調(diào)用結(jié)束時(shí)候,這個(gè)G會(huì)嘗試獲取一個(gè)空閑的P執(zhí)行,并放入到這個(gè)P的本地隊(duì)列。如果獲取不到P,那么這個(gè)線程M變成休眠狀態(tài), 加入到空閑線程中,然后這個(gè)G會(huì)被放入全局隊(duì)列中。

隊(duì)列輪轉(zhuǎn)

可見(jiàn)每個(gè)P維護(hù)著一個(gè)包含G的隊(duì)列,不考慮G進(jìn)入系統(tǒng)調(diào)用或IO操作的情況下,P周期性的將G調(diào)度到M中執(zhí)行,執(zhí)行一小段時(shí)間,將上下文保存下來(lái),然后將G放到隊(duì)列尾部,然后從隊(duì)列中重新取出一個(gè)G進(jìn)行調(diào)度。

除了每個(gè)P維護(hù)的G隊(duì)列以外,還有一個(gè)全局的隊(duì)列,每個(gè)P會(huì)周期性地查看全局隊(duì)列中是否有G待運(yùn)行并將其調(diào)度到M中執(zhí)行,全局隊(duì)列中G的來(lái)源,主要有從系統(tǒng)調(diào)用中恢復(fù)的G。之所以P會(huì)周期性地查看全局隊(duì)列,也是為了防止全局隊(duì)列中的G被餓死。

除了每個(gè)P維護(hù)的G隊(duì)列以外,還有一個(gè)全局的隊(duì)列,每個(gè)P會(huì)周期性地查看全局隊(duì)列中是否有G待運(yùn)行并將其調(diào)度到M中執(zhí)行,全局隊(duì)列中G的來(lái)源,主要有從系統(tǒng)調(diào)用中恢復(fù)的G。之所以P會(huì)周期性地查看全局隊(duì)列,也是為了防止全局隊(duì)列中的G被餓死。

M0

M0是啟動(dòng)程序后的編號(hào)為0的主線程,這個(gè)M對(duì)應(yīng)的實(shí)例會(huì)在全局變量rutime.m0中,不需要在heap上分配,M0負(fù)責(zé)執(zhí)行初始化操作和啟動(dòng)第一個(gè)G,在之后M0就和其他的M一樣了

G0

G0是每次啟動(dòng)一個(gè)M都會(huì)第一個(gè)創(chuàng)建的goroutine,G0僅用于負(fù)責(zé)調(diào)度G,G0不指向任何可執(zhí)行的函數(shù),每個(gè)M都會(huì)有一個(gè)自己的G0,在調(diào)度或系統(tǒng)調(diào)用時(shí)會(huì)使用G0的棧空間,全局變量的G0是M0的G0

一個(gè)G由于調(diào)度被中斷,此后如何恢復(fù)?

中斷的時(shí)候?qū)⒓拇嫫骼锏臈P畔ⅲ4娴阶约旱腉對(duì)象里面。當(dāng)再次輪到自己執(zhí)行時(shí),將自己保存的棧信息復(fù)制到寄存器里面,這樣就接著上次之后運(yùn)行了。

我這里只是根據(jù)自己的理解進(jìn)行了簡(jiǎn)單的介紹,想要詳細(xì)了解有關(guān)GMP的底層原理可以去看Go調(diào)度器 G-P-M 模型的設(shè)計(jì)者的文檔或直接看源碼

參考: ()

()

如何配置go語(yǔ)言開(kāi)發(fā)環(huán)境

1、下載go的zip文件。并且一定要把文件解壓到c:\go目錄下。

2、配置windows的高級(jí)環(huán)境變量。包括:GOROOT、GOOS、GOBIN、GOARCH。并且在path變量里面把c:\go\bin加入。以便可以在命令行直接運(yùn)行g(shù)o命令。

舉例:我的機(jī)器:

GOPATH= c:\go;c:\go\src;F:\workspace\goSample01;

GOBIN=c:\go\bin;F:\workspace\goSample01\bin;

其中,c:\go是go的安裝路徑;

F:\workspace\goSample01是我寫(xiě)的go語(yǔ)言項(xiàng)目的工程目錄;

F:\workspace\goSample01\bin是go語(yǔ)言項(xiàng)目的工程目錄下的可執(zhí)行文件路徑;

3、在完成環(huán)境變量配置后,打開(kāi)一個(gè)命令行窗口,直接輸入go,然后回車(chē),看看是否出現(xiàn)go的幫助信息。如果出現(xiàn),那么go的基本環(huán)境就OK了。

注意:這個(gè)基本環(huán)境不包含開(kāi)發(fā)工具,也不能直接編譯帶C代碼的go程序。

4、(可選)為了支持Import遠(yuǎn)程包,最好裝個(gè)gomingw。下載地址:。如果下的是壓縮包,請(qǐng)把它解壓到C盤(pán)。例如,C:\gowin-env。里面有個(gè)Console.bat是以后使用go get的環(huán)境。舉例:有個(gè)文件a.go,里面import(

"fmt"

"github.com/astaxie/beedb"

_ "github.com/ziutek/mymysql/godrv"

為了編譯該a.go文件,需要啟動(dòng)Console.bat,然后在該命令行窗口,進(jìn)入c:\go\src目錄下,執(zhí)行g(shù)o getgithub.com/astaxie/beedb

Go get github.com/ziutek/mymysql/godrv .

Go會(huì)自動(dòng)下載該遠(yuǎn)程包并編譯和安裝這些包。

配置goclipse(可選)

(如果不喜歡eclipse開(kāi)發(fā)工具,請(qǐng)?zhí)^(guò)這個(gè)配置。)

1、下載并安裝goclipse插件。Goclipse是go語(yǔ)言for eclipse的插件,下載地址:

2、啟動(dòng)eclipse并創(chuàng)建go項(xiàng)目。然后寫(xiě)個(gè)最簡(jiǎn)單的helloworld.go文件,并運(yùn)行。代碼如下:

packagemainimport"fmt"func main(){ fmt.Printf("hello, world")}

配置gocode(可選)

如果不需要go語(yǔ)法輔助和eclipse里面的(按ALT+/)彈出go語(yǔ)言自動(dòng)輔助功能,請(qǐng)?zhí)^(guò)這個(gè)配置。

1、下載gocode的zip文件,解壓后放在go的bin目錄下。

2、下載并安裝Git軟件。并且在path里面配置git的執(zhí)行路徑。例如c:\git\bin

3、在命令行執(zhí)行:go build .\gocode。如果一切正常,那么將會(huì)編譯生成一個(gè)gocode.exe文件在go的bin目錄下。如果編譯失敗,那么就轉(zhuǎn)第4步。

4、如果第3步直接編譯gocode源文件成功,那就直接到第5步。否則,就需要通過(guò)git下載gocode源文件,然后再編譯。在命令行執(zhí)行:go get -u github.com/nsf/gocode 。就會(huì)生成gocode.exe文件。

5、在goclipse插件里面指定gocode的路徑。就可以在elcipse里面調(diào)用gocode來(lái)幫助寫(xiě)編碼了。

從開(kāi)發(fā)工具這塊看,go語(yǔ)言還不夠成熟,開(kāi)發(fā)工具都還不完善,有待改進(jìn)。

下載go-tour教程源代碼(可選)

Google有個(gè)在線運(yùn)行g(shù)o語(yǔ)言的教程(),很不錯(cuò)。支持在web上直接運(yùn)行大部分的go程序,想了解這個(gè)教程的源代碼的朋友可以通過(guò)以下方式獲取。如果沒(méi)興趣,可以跳過(guò)這個(gè)步驟。

1、下載安裝Mercurial軟件。

2、在命令行下輸入:

hg clone

這個(gè)URL是我從google的go-tour源代碼的一個(gè)clone。作為測(cè)試用的。如果把http改成https協(xié)議,下載就會(huì)失敗。搞不懂。

編譯帶調(diào)用C代碼的go文件(可選)

1、為了在windows下編譯帶C代碼的go程序,你首先需要下載并安裝MinGW或者Cygwin。

2、首選安裝MinGW。在安裝MinGW之后,記得要把MinGW安裝目錄\bin路徑設(shè)置在path環(huán)境變量里面,以便能在dos窗口下直接調(diào)用gcc。

3、下載一個(gè)gowin-env。下載地址:gowin-env。下載后解壓到某個(gè)目錄下,例如:C:\gowin-env. 然后,編輯go-env.bat。配置相關(guān)的go參數(shù)。例如,我的配置是:

set GOARCH=386

set GOOS=windows

set GOROOT=c:\go

set GOBIN=%GOROOT%\bin

set GOPATH=%GOROOT%;F:\workspace\goSample01;

設(shè)置好go-env.bat后,就可以點(diǎn)擊Console.bat來(lái)啟動(dòng)編譯和運(yùn)行窗口。

4、編寫(xiě)一個(gè)帶C代碼的go程序。例如,testc.go

5、編譯

例如:

go build -compiler gccgo test_c.go

運(yùn)行調(diào)用C代碼的go文件(可選)

1、testc.go.

創(chuàng)建rand目錄,然后在rand里面創(chuàng)建testc.go. 代碼如下:

package rand

/*

//

#include stdio.h

*/

import "C"

func PrintHello() {

C.puts(C.CString("Hello, world\n"))

}

2、a.go

在rand下創(chuàng)建a.go.代碼如下:

package rand

import "fmt"

func SayHello(name string){

fmt.Println(name)

}

3、test_import.go

在rand的上一級(jí)創(chuàng)建test_import.go。代碼如下:

package main

import "./rand"

func main(){

rand.SayHello("tom")

rand.PrintHello()

}

4、運(yùn)行test_import.go

go run test_import.go

在測(cè)試其它幾個(gè)C代碼的時(shí)候,發(fā)現(xiàn)windows版本的cgo還有些編譯問(wèn)題,同樣的代碼轉(zhuǎn)移到蘋(píng)果的XCODE下就沒(méi)有問(wèn)題。后來(lái)終于發(fā)現(xiàn)原因了,原來(lái)有些例子是unix平臺(tái)下的,而在windows平臺(tái)下,方法名和參數(shù)需要做調(diào)整。

例如:下面代碼在windows下編譯報(bào)一堆錯(cuò)誤。

package rand

/*

#include stdlib.h

*/

import "C"

func Random() int {

return int(C.random())

}

func Seed(i int) {

C.srandom(C.uint(i))

}

這里需要把return int(C.random()) 修改為“return int(C.rand())”

C.srandom(C.uint(i))修改為“C.srand(C.uint(i))”編譯就OK了。

Go語(yǔ)言中的符號(hào)"

左移運(yùn)算符()

將一個(gè)運(yùn)算對(duì)象的各二進(jìn)制位全部左移若干位(左邊的二進(jìn)制位丟棄,右邊補(bǔ)0)。

例:a = a 2 將a的二進(jìn)制位左移2位,右補(bǔ)0,

左移1位后a = a * 2;

若左移時(shí)舍棄的高位不包含1,則每左移一位,相當(dāng)于該數(shù)乘以2。

右移運(yùn)算符()

將一個(gè)數(shù)的各二進(jìn)制位全部右移若干位,正數(shù)左補(bǔ)0,負(fù)數(shù)左補(bǔ)1,右邊丟棄。

操作數(shù)每右移一位,相當(dāng)于該數(shù)除以2。

例如:a = a 2 將a的二進(jìn)制位右移2位,

左補(bǔ)0 or 補(bǔ)1 得看被移數(shù)是正還是負(fù)。

GO語(yǔ)言學(xué)習(xí)系列八——GO函數(shù)(func)的聲明與使用

GO是編譯性語(yǔ)言,所以函數(shù)的順序是無(wú)關(guān)緊要的,為了方便閱讀,建議入口函數(shù) main 寫(xiě)在最前面,其余函數(shù)按照功能需要進(jìn)行排列

GO的函數(shù) 不支持嵌套,重載和默認(rèn)參數(shù)

GO的函數(shù) 支持 無(wú)需聲明變量,可變長(zhǎng)度,多返回值,匿名,閉包等

GO的函數(shù)用 func 來(lái)聲明,且左大括號(hào) { 不能另起一行

一個(gè)簡(jiǎn)單的示例:

輸出為:

參數(shù):可以傳0個(gè)或多個(gè)值來(lái)供自己用

返回:通過(guò)用 return 來(lái)進(jìn)行返回

輸出為:

上面就是一個(gè)典型的多參數(shù)傳遞與多返回值

對(duì)例子的說(shuō)明:

按值傳遞:是對(duì)某個(gè)變量進(jìn)行復(fù)制,不能更改原變量的值

引用傳遞:相當(dāng)于按指針傳遞,可以同時(shí)改變?cè)瓉?lái)的值,并且消耗的內(nèi)存會(huì)更少,只有4或8個(gè)字節(jié)的消耗

在上例中,返回值 (d int, e int, f int) { 是進(jìn)行了命名,如果不想命名可以寫(xiě)成 (int,int,int){ ,返回的結(jié)果都是一樣的,但要注意:

當(dāng)返回了多個(gè)值,我們某些變量不想要,或?qū)嶋H用不到,我們可以使用 _ 來(lái)補(bǔ)位,例如上例的返回我們可以寫(xiě)成 d,_,f := test(a,b,c) ,我們不想要中間的返回值,可以以這種形式來(lái)舍棄掉

在參數(shù)后面以 變量 ... type 這種形式的,我們就要以判斷出這是一個(gè)可變長(zhǎng)度的參數(shù)

輸出為:

在上例中, strs ...string 中, strs 的實(shí)際值是b,c,d,e,這就是一個(gè)最簡(jiǎn)單的傳遞可變長(zhǎng)度的參數(shù)的例子,更多一些演變的形式,都非常類(lèi)似

在GO中 defer 關(guān)鍵字非常重要,相當(dāng)于面相對(duì)像中的析構(gòu)函數(shù),也就是在某個(gè)函數(shù)執(zhí)行完成后,GO會(huì)自動(dòng)這個(gè);

如果在多層循環(huán)中函數(shù)里,都定義了 defer ,那么它的執(zhí)行順序是先進(jìn)后出;

當(dāng)某個(gè)函數(shù)出現(xiàn)嚴(yán)重錯(cuò)誤時(shí), defer 也會(huì)被調(diào)用

輸出為

這是一個(gè)最簡(jiǎn)單的測(cè)試了,當(dāng)然還有更復(fù)雜的調(diào)用,比如調(diào)試程序時(shí),判斷是哪個(gè)函數(shù)出了問(wèn)題,完全可以根據(jù) defer 打印出來(lái)的內(nèi)容來(lái)進(jìn)行判斷,非常快速,這種留給你們?nèi)?shí)現(xiàn)

一個(gè)函數(shù)在函數(shù)體內(nèi)自己調(diào)用自己我們稱(chēng)之為遞歸函數(shù),在做遞歸調(diào)用時(shí),經(jīng)常會(huì)將內(nèi)存給占滿,這是非常要注意的,常用的比如,快速排序就是用的遞歸調(diào)用

本篇重點(diǎn)介紹了GO函數(shù)(func)的聲明與使用,下一篇將介紹GO的結(jié)構(gòu) struct

本文名稱(chēng):go語(yǔ)言左移,go 左移右移
文章源于:http://chinadenli.net/article43/dsehshs.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營(yíng)銷(xiāo)推廣品牌網(wǎng)站設(shè)計(jì)域名注冊(cè)網(wǎng)站設(shè)計(jì)公司搜索引擎優(yōu)化

廣告

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

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司