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:
區別:
1、Go不允許函數重載,必須具有方法和函數的唯一名稱;java允許函數重載。
2、Java默認允許多態,Go沒有。
3、Go代碼可以自動擴展到多個核心;而Java并不總是具有足夠的可擴展性。
4、Java不支持多繼承,Go支持多繼承。
什么是go語言?
Go也稱為Golang,是一種編程語言。作為一種開源編程語言,Go可以輕松構建可靠,簡單和高效的軟件。
Go是鍵入的靜態編譯語言。Go語言提供垃圾收集,CSP風格的并發性,內存安全性和結構類型。
什么是java?
Java是一種用于一般用途的計算機編程語言,它是基于類的,并發的和面向對象的。Java專門設計為包含很少的實現依賴項。Java應用程序在JVM(Java虛擬機)上運行。它是當今最著名和最著名的編程語言之一。
1、簡單易學。
Go語言的作者本身就很懂C語言,所以同樣Go語言也會有C語言的基因,所以對于程序員來說,Go語言天生就會讓人很熟悉,容易上手。
2、并發性好。
Go語言天生支持并發,可以充分利用多核,輕松地使用并發。 這是Go語言最大的特點。
描述
Go的語法接近C語言,但對于變量的聲明有所不同。Go支持垃圾回收功能。Go的并行模型是以東尼·霍爾的通信順序進程(CSP)為基礎,采取類似模型的其他語言包括Occam和Limbo,但它也具有Pi運算的特征,比如通道傳輸。
在1.8版本中開放插件(Plugin)的支持,這意味著現在能從Go中動態加載部分函數。
與C++相比,Go并不包括如枚舉、異常處理、繼承、泛型、斷言、虛函數等功能,但增加了 切片(Slice) 型、并發、管道、垃圾回收、接口(Interface)等特性的語言級支持。
golang 沒有繼承 另外 組合用結構和接口解決了
你說的繼承 在golang被拆分成 接口interface 和 結構了 這兩個內容中有部分類似繼承
組合也沒有 也是用 接口和結構 解決了
Go語言自亮相以來并沒有展示一個明確的方向,Google員工將Go語言稱為一個“試驗性語言”,稱其試圖融合Python等動態語言的開發速度和C或C++等編譯語言的性能和安全。一位Go語言的支持者概括而言Go語言如下:簡單、快速、安全、并發、快樂編程、開源;但Go語言缺乏方向以及其“集大成者”的嘗試很容易會導致其學貓不成學狗也不成,淪為四不像。盡管如此,編者仍然覺得Go語言有相當大的潛力:很多開發者對它感興趣——不僅它的最初設計者陣容強大,而且在參與修改源代碼的人群中也不乏大牛級人物。這很有可能幫助Go語言找到適合自己的方向,開拓系統編程的新方向。
Java是一門較為成熟的語言,相對于C++要簡單的多,C++里沒有內存回收,所以比較麻煩,Java加入了內存自動回收,簡單是簡單,卻變慢了,go語言是一門新興的語言,現在版本是1.9 ? go語言的性能比Java要好,但由于出現晚,資料較Java少,有些Java的功能go也沒有,并且有許多的軟件是支持Java但支持go的很少.所以在短期內Java是比go通用的
C語言的最大的優勢是時間性能好,只比匯編慢20%~30%,C++最大的優勢是快且面向對象,Java最大的優勢是垃圾回收機制,GO語言的目標是具備以上三者的優勢
分享文章:go語言有繼承功能嗎 go接口繼承
瀏覽路徑:http://vcdvsql.cn/article46/hepoeg.html
成都網站建設公司_創新互聯,為您提供網站設計公司、營銷型網站建設、虛擬主機、面包屑導航、搜索引擎優化、Google
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯