1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關(guān)咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務(wù)時間:8:30-17:00
      你可能遇到了下面的問題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
      go語言的書寫格式 go語言?

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

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

      成都創(chuàng)新互聯(lián)長期為1000+客戶提供的網(wǎng)站建設(shè)服務(wù),團隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為壽縣企業(yè)提供專業(yè)的網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè)壽縣網(wǎng)站改版等技術(shù)服務(wù)。擁有10多年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。

      自定義類型

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

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

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

      類型別名

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

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

      type TypeAlias = Type

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

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

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

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

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

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

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

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

      其中:

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

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

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

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

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

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

      基本實例化

      舉個例子:

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

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

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

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

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

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

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

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

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

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

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

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

      使用鍵值對初始化

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

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

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

      使用值的列表初始化

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

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

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

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

      輸出:

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

      面試題

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

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

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

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

      方法和接收者

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

      方法的定義格式如下:

      其中,

      舉個例子:

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

      指針類型的接收者

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

      調(diào)用該方法:

      值類型的接收者

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

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

      任意類型添加方法

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

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

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

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

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

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

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

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

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

      嵌套結(jié)構(gòu)體內(nèi)部可能存在相同的字段名。這個時候為了避免歧義需要指定具體的內(nèi)嵌結(jié)構(gòu)體的字段。

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

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

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

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

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

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

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

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

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

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

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

      go語言語法(基礎(chǔ)語法篇)

      import "workname/packetfolder"

      導(dǎo)入多個包

      方法調(diào)用 包名.函數(shù)//不是函數(shù)或結(jié)構(gòu)體所處文件或文件夾名

      packagename.Func()

      前面加個點表示省略調(diào)用,那么調(diào)用該模塊里面的函數(shù),可以不用寫模塊名稱了:

      當(dāng)導(dǎo)入一個包時,該包下的文件里所有init()函數(shù)都會被執(zhí)行,然而,有些時候我們并不需要把整個包都導(dǎo)入進來,僅僅是是希望它執(zhí)行init()函數(shù)而已。下劃線的作用僅僅是為了調(diào)用init()函數(shù),所以無法通過包名來調(diào)用包中的其他函數(shù)

      import _ package

      變量聲明必須要使用否則會報錯。

      全局變量運行聲明但不使用。

      func 函數(shù)名 (參數(shù)1,參數(shù)2,...) (返回值a 類型a, 返回值b 類型b,...)

      func 函數(shù)名 (參數(shù)1,參數(shù)2,...) (返回值類型1, 返回值類型2,...)

      func (this *結(jié)構(gòu)體名) 函數(shù)名(參數(shù) string) (返回值類型1, 返回值類型2){}

      使用大小來區(qū)分函數(shù)可見性

      大寫是public類型

      小寫是private類型

      func prifunc int{}

      func pubfunc int{}

      聲明靜態(tài)變量

      const value int

      定義變量

      var value int

      聲明一般類型、接口和結(jié)構(gòu)體

      聲明函數(shù)

      func function () int{}

      go里面所有的空值對應(yīng)如下

      通道類型

      內(nèi)建函數(shù) new 用來分配內(nèi)存,它的第一個參數(shù)是一個類型,不是一個值,它的返回值是一個指向新分配類型零值的指針

      func new(Type) *Type

      [這位博主有非常詳細的分析]

      Go 語言支持并發(fā),我們只需要通過 go 關(guān)鍵字來開啟 goroutine 即可。

      goroutine 是輕量級線程,goroutine 的調(diào)度是由 Golang 運行時進行管理的。

      同一個程序中的所有 goroutine 共享同一個地址空間。

      語法格式如下:

      通道(channel)是用來傳遞數(shù)據(jù)的一個數(shù)據(jù)結(jié)構(gòu)。

      通道的聲明

      通道可用于兩個 goroutine 之間通過傳遞一個指定類型的值來同步運行和通訊。操作符 - 用于指定通道的方向,發(fā)送或接收。如果未指定方向,則為雙向通道。

      [這里有比較詳細的用例]

      go里面的空接口可以指代任何類型(無論是變量還是函數(shù))

      聲明空接口

      go里面的的強制類型轉(zhuǎn)換語法為:

      int(data)

      如果是接口類型的強制轉(zhuǎn)成其他類型的語法為:

      go里面的強制轉(zhuǎn)換是將值復(fù)制過去,所以在數(shù)據(jù)量的時候有比較高的運行代價

      Go語言基礎(chǔ)語法(一)

      本文介紹一些Go語言的基礎(chǔ)語法。

      先來看一個簡單的go語言代碼:

      go語言的注釋方法:

      代碼執(zhí)行結(jié)果:

      下面來進一步介紹go的基礎(chǔ)語法。

      go語言中格式化輸出可以使用 fmt 和 log 這兩個標(biāo)準(zhǔn)庫,

      常用方法:

      示例代碼:

      執(zhí)行結(jié)果:

      更多格式化方法可以訪問中的fmt包。

      log包實現(xiàn)了簡單的日志服務(wù),也提供了一些格式化輸出的方法。

      執(zhí)行結(jié)果:

      下面來介紹一下go的數(shù)據(jù)類型

      下表列出了go語言的數(shù)據(jù)類型:

      int、float、bool、string、數(shù)組和struct屬于值類型,這些類型的變量直接指向存在內(nèi)存中的值;slice、map、chan、pointer等是引用類型,存儲的是一個地址,這個地址存儲最終的值。

      常量是在程序編譯時就確定下來的值,程序運行時無法改變。

      執(zhí)行結(jié)果:

      執(zhí)行結(jié)果:

      Go 語言的運算符主要包括算術(shù)運算符、關(guān)系運算符、邏輯運算符、位運算符、賦值運算符以及指針相關(guān)運算符。

      算術(shù)運算符:

      關(guān)系運算符:

      邏輯運算符:

      位運算符:

      賦值運算符:

      指針相關(guān)運算符:

      下面介紹一下go語言中的if語句和switch語句。另外還有一種控制語句叫select語句,通常與通道聯(lián)用,這里不做介紹。

      if語法格式如下:

      if ... else :

      else if:

      示例代碼:

      語法格式:

      另外,添加 fallthrough 會強制執(zhí)行后面的 case 語句,不管下一條case語句是否為true。

      示例代碼:

      執(zhí)行結(jié)果:

      下面介紹幾種循環(huán)語句:

      執(zhí)行結(jié)果:

      執(zhí)行結(jié)果:

      也可以通過標(biāo)記退出循環(huán):

      --THE END--

      講講go語言的結(jié)構(gòu)體

      作為C語言家族的一員,go和c一樣也支持結(jié)構(gòu)體。可以類比于java的一個POJO。

      在學(xué)習(xí)定義結(jié)構(gòu)體之前,先學(xué)習(xí)下定義一個新類型。

      新類型 T1 是基于 Go 原生類型 int 定義的新自定義類型,而新類型 T2 則是 基于剛剛定義的類型 T1,定義的新類型。

      這里要引入一個底層類型的概念。

      如果一個新類型是基于某個 Go 原生類型定義的, 那么我們就叫 Go 原生類型為新類型的底層類型

      在上面的例子中,int就是T1的底層類型。

      但是T1不是T2的底層類型,只有原生類型才可以作為底層類型,所以T2的底層類型還是int

      底層類型是很重要的,因為對兩個變量進行顯式的類型轉(zhuǎn)換,只有底層類型相同的變量間才能相互轉(zhuǎn)換。底層類型是判斷兩個類型本質(zhì)上是否相同的根本。

      這種類型定義方式通常用在 項目的漸進式重構(gòu),還有對已有包的二次封裝方面

      類型別名表示新類型和原類型完全等價,實際上就是同一種類型。只不過名字不同而已。

      一般我們都是定義一個有名的結(jié)構(gòu)體。

      字段名的大小寫決定了字段是否包外可用。只有大寫的字段可以被包外引用。

      還有一個點提一下

      如果換行來寫

      Age: 66,后面這個都好不能省略

      還有一個點,觀察e3的賦值

      new返回的是一個指針。然后指針可以直接點號賦值。這說明go默認進行了取值操作

      e3.Age 等價于 (*e3).Age

      如上定義了一個空的結(jié)構(gòu)體Empty。打印了元素e的內(nèi)存大小是0。

      有什么用呢?

      基于空結(jié)構(gòu)體類型內(nèi)存零開銷這樣的特性,我們在日常 Go 開發(fā)中會經(jīng)常使用空 結(jié)構(gòu)體類型元素,作為一種“事件”信息進行 Goroutine 之間的通信

      這種以空結(jié)構(gòu)體為元素類建立的 channel,是目前能實現(xiàn)的、內(nèi)存占用最小的 Goroutine 間通信方式。

      這種形式需要說的是幾個語法糖。

      語法糖1:

      對于結(jié)構(gòu)體字段,可以省略字段名,只寫結(jié)構(gòu)體名。默認字段名就是結(jié)構(gòu)體名

      這種方式稱為 嵌入字段

      語法糖2:

      如果是以嵌入字段形式寫的結(jié)構(gòu)體

      可以省略嵌入的Reader字段,而直接訪問ReaderName

      此時book是一個各個屬性全是對應(yīng)類型零值的一個實例。不是nil。這種情況在Go中稱為零值可用。不像java會導(dǎo)致npe

      結(jié)構(gòu)體定義時可以在字段后面追加標(biāo)簽說明。

      tag的格式為反單引號

      tag的作用是可以使用[反射]來檢視字段的標(biāo)簽信息。

      具體的作用還要看使用的場景。

      比如這里的tag是為了幫助 encoding/json 標(biāo)準(zhǔn)包在解析對象時可以利用的規(guī)則。比如omitempty表示該字段沒有值就不打印出來。


      網(wǎng)頁名稱:go語言的書寫格式 go語言?
      URL地址:http://www.ef60e0e.cn/article/ddeisoh.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        泰顺县| 哈密市| 安西县| 神木县| 仙居县| 新闻| 兰考县| 沙雅县| 绿春县| 阿荣旗| 图们市| 义马市| 普格县| 克拉玛依市| 镇平县| 邯郸市| 共和县| 甘孜县| 兰州市| 武汉市| 新化县| 富锦市| 微博| 澄迈县| 蛟河市| 元阳县| 太仆寺旗| 交城县| 耒阳市| 玛纳斯县| 绥棱县| 阆中市| 乌苏市| 永修县| 宿迁市| 双流县| 汶上县| 离岛区| 蓝山县| 上高县| 沭阳县|