在 go 1.9 版本之前定義內建型別的**是這樣寫的:
type byte uint8
type rune int32
而在 go 1.9 版本之後變為:
type byte = uint8
type rune = int32
這個修改就是配合型別別名而進行的修改。
定義型別別名的寫法:
type typealias = type
型別別名規定:typealias 只是 type 的別名,本質上 typealias 與 type 是同乙個型別.
型別別名與型別定義表面上看只有乙個等號的差異,那麼它們之間實際的區別有哪些呢?
package main
import "fmt"
// 將newint 定義為int型別
type newint int
// 將int 取別名叫intalias
type intalias = int
func main()
結果:
a type: main.newint
b type: int
分析:
1、newint 定義為 int 型別,這是常見的定義型別的方法,通過 type 關鍵字的定義,newint 會形成一種新的型別,newint 本身依然具備 int 型別的特性。
2、將 intalias 設定為 int 的乙個別名,使用 intalias 與 int 等效。
3、將 a 宣告為 newint 型別,此時若列印,則 a 的值為 0
4、將 b 宣告為 intalias 型別,此時列印 b 的值為 0。
結果顯示 a 的型別是 main.newint,表示 main 包下定義的 newint 型別 b 型別是 int,intalias 型別只會在**中存在,編譯完成時,不會有 intalias 型別
package main
import (
"time"
)// 定義time.duration的別名為myduration
type myduration = time.duration
// 為myduration新增乙個函式
func (m myduration) easyset(a string)
func main()
time.duration 設定乙個型別別名叫 myduration
為這個別名新增乙個方法。
編譯上面**報錯,資訊如下:
cannot define new methods on non-local type time.duration
解決這個問題有下面兩種方法:
package main
import (
"fmt"
"reflect"
)// 定義商標結構
type brand struct
// 為商標結構新增show()方法
func (t brand) show()
// 為brand定義乙個別名fakebrand
type fakebrand = brand
// 定義車輛結構
type vehicle struct
func main()
}
fieldname: fakebrand, fieldtype: brand
fieldname: brand, fieldtype: brand
這個例子中,fakebrand 是 brand 的乙個別名,在 vehicle 中嵌入 fakebrand 和 brand 並不意味著嵌入兩個 brand,fakebrand 的型別會以名字的方式保留在 vehicle 的成員中。
a.show()
編譯器將發生報錯:
ambiguous selector a.show
在呼叫 show() 方法時,因為兩個型別都有 show() 方法,會發生歧義,證明 fakebrand 的本質確實是 brand 型別。
Go語言之GO 語言常量
相對於變數,常量是恆定不變的值,多用於定義程式執行期間不會改變的那些值。常量的宣告和變數宣告非常類似,只是把var換成了const,常量在定義的時候必須賦值。const pi 3.1415 const e 2.7182宣告了pi和e這兩個常量之後,在整個程式執行期間它們的值都不能再發生變化了。多個常...
Go語言之嵌入型別
嵌入型別,或者巢狀型別,這是一種可以把已有的型別宣告在新的型別裡的一種方式,這種功能對 復用非常重要。在其他語言中,有繼承可以做同樣的事情,但是在go語言中,沒有繼承的概念。go提倡的 復用的方式是組合,所以這也是嵌入型別的意義所在。組合而不是繼承,所以go才會更靈活。type reader int...
Go語言之Go語言網路程式設計
go語言的 net 包中有乙個 tcpconn 型別,可以用來建立 tcp 客戶端和 tcp 伺服器端間的通訊通道,tcpconn 型別裡有兩個主要的函式 func c tcpconn write b byte n int,err os.error func c tcpconn read b byt...