精品专区-精品自拍9-精品自拍三级乱伦-精品自拍视频-精品自拍视频曝光-精品自拍小视频

網站建設資訊

NEWS

網站建設資訊

go語言面向對象作業 go語言開發實戰

沒有類,C語言有結構體,那么Go的結構體有什么特別之處?

Go語言中沒有“類”的概念,也不支持“類”的繼承等面向對象的概念。Go語言中通過結構體的內嵌再配合接口比面向對象具有更高的擴展性和靈活性。

網站建設哪家好,找創新互聯!專注于網頁設計、網站建設、微信開發、微信平臺小程序開發、集團企業網站建設等服務項目。為回饋新老客戶創新互聯還提供了漠河免費建站歡迎大家使用!

自定義類型

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

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

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

類型別名

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

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

type TypeAlias = Type

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

類型定義和類型別名的區別

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

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

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

Go語言中通過struct來實現面向對象。

結構體的定義

使用type和struct關鍵字來定義結構體,具體代碼格式如下:

其中:

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

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

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

語言內置的基礎數據類型是用來描述一個值的,而結構體是用來描述一組值的。比如一個人有名字、年齡和居住城市等,本質上是一種聚合型的數據類型

結構體實例化

只有當結構體實例化時,才會真正地分配內存。也就是必須實例化后才能使用結構體的字段。

基本實例化

舉個例子:

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

匿名結構體

在定義一些臨時數據結構等場景下還可以使用匿名結構體。

創建指針類型結構體

我們還可以通過使用new關鍵字對結構體進行實例化,得到的是結構體的地址。 格式如下:

從打印的結果中我們可以看出p2是一個結構體指針。

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

取結構體的地址實例化

使用對結構體進行取地址操作相當于對該結構體類型進行了一次new實例化操作。

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

結構體初始化

沒有初始化的結構體,其成員變量都是對應其類型的零值。

使用鍵值對初始化

使用鍵值對對結構體進行初始化時,鍵對應結構體的字段,值對應該字段的初始值。

也可以對結構體指針進行鍵值對初始化,例如:

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

使用值的列表初始化

初始化結構體的時候可以簡寫,也就是初始化的時候不寫鍵,直接寫值:

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

結構體內存布局

結構體占用一塊連續的內存。

輸出:

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

面試題

請問下面代碼的執行結果是什么?

構造函數

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

調用構造函數

方法和接收者

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

方法的定義格式如下:

其中,

舉個例子:

方法與函數的區別是,函數不屬于任何類型,方法屬于特定的類型。

指針類型的接收者

指針類型的接收者由一個結構體的指針組成,由于指針的特性,調用方法時修改接收者指針的任意成員變量,在方法結束后,修改都是有效的。這種方式就十分接近于其他語言中面向對象中的this或者self。 例如我們為Person添加一個SetAge方法,來修改實例變量的年齡。

調用該方法:

值類型的接收者

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

什么時候應該使用指針類型接收者

任意類型添加方法

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

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

結構體的匿名字段

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

嵌套結構體

一個結構體中可以嵌套包含另一個結構體或結構體指針。

嵌套匿名結構體

當訪問結構體成員時會先在結構體中查找該字段,找不到再去匿名結構體中查找。

嵌套結構體的字段名沖突

嵌套結構體內部可能存在相同的字段名。這個時候為了避免歧義需要指定具體的內嵌結構體的字段。

結構體的“繼承”

Go語言中使用結構體也可以實現其他編程語言中面向對象的繼承。

結構體字段的可見性

結構體中字段大寫開頭表示可公開訪問,小寫表示私有(僅在定義當前結構體的包中可訪問)。

結構體與JSON序列化

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

結構體標簽(Tag)

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

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

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

例如我們為Student結構體的每個字段定義json序列化時使用的Tag:

Golang入門到項目實戰 | golang方法

go語言沒有面向對象的特性,也沒有類對象的概念。但是,可以使用結構體來模擬這些特性,我們都知道面向對象里面有類方法等概念。我們也可以聲明一些方法,屬于某個結構體。

Go中的方法,是一種特殊的函數,定義域struct之上(與struct關聯、綁定),被稱為struct的接受者(receiver)。通俗的講,方法就是有接收者的函數。

語法格式如下:

mytype:定義一個結構體

recv:接受該方法的結構體(receiver)

my_method:方法名稱

para:參數列表

return_type:返回值類型

從語法格式可以看出,一個方法和一個函數非常相似,多了一個接受類型。

實例

運行結果

go語言是面向對象的還是面向過程的?

兩者都不算吧,go語言沒有明顯的傾向,可能由于語言的設計者都是牛人的原因,他們更傾向于讓編程者去考慮該怎么去用它。也許它的特色就是靈活吧。你可以用它實現面向對象,但它本身不支持面向對象的語義。

為什么要使用 Go 語言?Go 語言的優勢在哪里

1. 保留但大幅度簡化指針

Go語言保留著C中值和指針的區別,但是對于指針繁瑣用法進行了大量的簡化,引入引用的概念。所以在Go語言中,你幾乎不用擔心會因為直接操作內寸而引起各式各樣的錯誤。

2. 多參數返回

還記得在C里面為了回饋多個參數,不得不開辟幾段指針傳到目標函數中讓其操作么?在Go里面這是完全不必要的。而且多參數的支持讓Go無需使用繁瑣的exceptions體系,一個函數可以返回期待的返回值加上error,調用函數后立刻處理錯誤信息,清晰明了。

3. Array,slice,map等內置基本數據結構

如果你習慣了Python中簡潔的list和dict操作,在Go語言中,你不會感到孤單。一切都是那么熟悉,而且更加高效。如果你是C++程序員,你會發現你又找到了STL的vector 和 map這對朋友。

4. Interface

Go語言最讓人贊嘆不易的特性,就是interface的設計。任何數據結構,只要實現了interface所定義的函數,自動就implement了這個interface,沒有像Java那樣冗長的class申明,提供了靈活太多的設計度和OO抽象度,讓你的代碼也非常干凈。千萬不要以為你習慣了Java那種一條一條加implements的方式,感覺還行,等接口的設計越來越復雜的時候,無數Bug正在后面等著你。

同時,正因為如此,Go語言的interface可以用來表示任何generic的東西,比如一個空的interface,可以是string可以是int,可以是任何數據類型,因為這些數據類型都不需要實現任何函數,自然就滿足空interface的定義了。加上Go語言的type assertion,可以提供一般動態語言才有的duck typing特性, 而仍然能在compile中捕捉明顯的錯誤。

5. OO

Go語言本質上不是面向對象語言,它還是過程化的。但是,在Go語言中, 你可以很輕易的做大部分你在別的OO語言中能做的事,用更簡單清晰的邏輯。是的,在這里,不需要class,仍然可以繼承,仍然可以多態,但是速度卻快得多。因為本質上,OO在Go語言中,就是普通的struct操作。

6. Goroutine

這個幾乎算是Go語言的招牌特性之一了,我也不想多提。如果你完全不了解Goroutine,那么你只需要知道,這玩意是超級輕量級的類似線程的東西,但通過它,你不需要復雜的線程操作鎖操作,不需要care調度,就能玩轉基本的并行程序。在Go語言里,觸發一個routine和erlang spawn一樣簡單。基本上要掌握Go語言,以Goroutine和channel為核心的內存模型是必須要懂的。不過請放心,真的非常簡單。

7. 更多現代的特性

和C比較,Go語言完全就是一門現代化語言,原生支持的Unicode, garbage collection, Closures(是的,和functional programming language類似), function是first class object,等等等等。

看到這里,你可能會發現,我用了很多輕易,簡單,快速之類的形容詞來形容Go語言的特點。我想說的是,一點都不夸張,連Go語言的入門學習到提高,都比別的語言門檻低太多太多。在大部分人都有C的背景的時代,對于Go語言,從入門到能夠上手做項目,最多不過半個月。Go語言給人的感覺就是太直接了,什么都直接,讀源代碼直接,寫自己的代碼也直接。

go語言中的面向對象

類的成員函數 有時也稱為 方法 。因此,方法可以認為是傳統面向對象中 類的成員函數 。不同的是,go中方法可以綁定到任何類型上,但是成員函數只能屬于類。

用來描述主調方法,就像向對象發送消息。

不允許本身是指針的類型進行方法聲明。

與繼承的不同,組合中的順序也是無意義的。

參考一等函數,方法做變量

首字母大小寫,要封裝一個對象,只能通過結構體。


網頁名稱:go語言面向對象作業 go語言開發實戰
文章源于:http://m.jcarcd.cn/article/hhsepp.html
主站蜘蛛池模板: 伦视频在线观看 | 91国内在线视频 | 国内精品91福利 | 日本伦理片在线看 | 精品国产人成在线 | 精品免费一 | 国产91对白| 日本高清视频 | 欧美在线a | 日韩亚洲产 | 国产福利萌白酱 | 欧美一进| 成人品观看免费 | 国产欧美精品 | 韩国欧美在线 | 日本www.色| 国产精品色 | 国产自产中文一区 | 不卡一区二区 | 最新国产拍偷 | 国产精品素人福利 | www精品网站| 欧美日韩午夜福利 | 97国产在线观看 | 成人做爰视 | 最新精品国偷自产在线91 | 韩国三级在线中 | 欧美日韩动漫亚洲 | 国产情趣酒店鸳鸯 | 午夜免费一级视频 | 国产一区在线免费 | 日本精品a在线观看 | 欧美制服丝袜在线 | 91男女免费福利 | 国产手机视频自拍 | 精品亚洲a∨ | 区免费国产在线观看 | 精品精品国产精品 | 成人影视网 | 国产精精品免费观看 | 成人福利国产视频 |