Golang通脈之類型定義
1、自定義類型
在Go語言中有一些基本的數(shù)據(jù)類型,如 string
、 整型 、 浮點型 、 布爾 等數(shù)據(jù)類型, Go
語言中可以使用 type 關(guān)鍵字來定義自定義類型。
type
是Go語法里的重要而且常用的關(guān)鍵字,type
絕不只是對應(yīng)于C/C++
中的typedef
。搞清楚type的使用,就容易理解go語言中的核心概念struct
、interface
、函數(shù)等的使用。
2、類型定義
2.1 定義結(jié)構(gòu)體
使用 type 可以定義結(jié)構(gòu)體類型:
//1、定義結(jié)構(gòu)體 //結(jié)構(gòu)體定義 type person struct { name string //注意后面不能有逗號 age int }
2.2 定義接口
使用 type 可以定義接口類型:
type USB interface { start() end() }
2.3 定義其他的新類型
使用 type
,還可以定義新類型。
語法:
type 類型名 Type
示例代碼:
type myint int type mystr string func main() { var i1 myint var i2 = 100 i1 = 100 fmt.Println(i1) //i1 = i2 //cannot use i2 (type int) as type myint in assignment fmt.Println(i1,i2) var name mystr name = "王二狗" var s1 string s1 = "李小花" fmt.Println(name) fmt.Println(s1) name = s1 //cannot use s1 (type string) as type mystr in assignment }
2.4 定義函數(shù)的類型
Go語言支持函數(shù)式編程,可以使用高階編程語法。一個函數(shù)可以作為另一個函數(shù)的參數(shù),也可以作為另一個函數(shù)的返回值,那么在定義這個高階函數(shù)的時候,如果函數(shù)的類型比較復(fù)雜,可以使用type來定義這個函數(shù)的類型:
func main() { res1 := fun1() fmt.Println(res1(10,20)) } type my_fun func (int,int)(string) //fun1()函數(shù)的返回值是my_func類型 func fun1 () my_fun{ fun := func(a,b int) string { s := strconv.Itoa(a) + strconv.Itoa(b) return s } return fun }
3、類型別名
類型別名規(guī)定:TypeAlias
只是Type
的別名,本質(zhì)上TypeAlias
與Type
是同一個類型。就像一個孩子小時候有小名、乳名,上學(xué)后用學(xué)名,英語老師又會給他起英文名,但這些名字都指的是他本人。
類型別名是 Go 1.9 版本添加的新功能。主要用于代碼升級、遷移中類型的兼容性問題。在 C/C++語言中,代碼重構(gòu)升級可以使用宏快速定義新的一段代碼。Go 語言中沒有選擇加入宏,而是將解決重構(gòu)中最麻煩的類型名變更問題。
type TypeAlias = Type
在 Go 1.9 版本之前的內(nèi)建類型定義的代碼是這樣寫的:
type byte uint8 type rune int32
而在 Go 1.9 版本之后變?yōu)椋?/strong>
type byte = uint8 type rune = int32
這個修改就是配合類型別名而進(jìn)行的修改。
4、類型定義和類型別名的區(qū)別
類型別名與類型定義表面上看只有一個等號的差異,我們通過下面的這段代碼來理解它們之間的區(qū)別。
//類型定義 type NewInt int //類型別名 type MyInt = int func main() { var a NewInt var b MyInt fmt.Printf("type of a:%T\n", a) //type of a:main.NewInt fmt.Printf("type of b:%T\n", b) //type of b:int }
結(jié)果顯示a的類型是 main.NewInt
,表示main
包下定義的 NewInt
類型。b的類型是 int
。 MyInt
類型只會在代碼中存在,編譯完成時并不會有 MyInt
類型。
5、非本地類型不能定義方法
能夠隨意地為各種類型起名字,是否意味著可以在自己包里為這些類型任意添加方法?
// 定義time.Duration的別名為MyDuration type MyDuration = time.Duration // 為MyDuration添加一個函數(shù) func (m MyDuration) EasySet(a string) { //cannot define new methods on non-local type time.Duration } func main() { }
以上代碼報錯。報錯信息:cannot define new methods on non-local type time.Duration
編譯器提示:不能在一個非本地的類型 time.Duration
上定義新方法。非本地方法指的就是使用 time.Duration
的代碼所在的包,也就是 main
包。因為 time.Duration
是在 time
包中定義的,在 main 包中使用。time.Duration
包與 main
包不在同一個包中,因此不能為不在一個包中的類型定義方法。
解決這個問題有下面兩種方法:
- 將類型別名改為類型定義:
type MyDuration time.Duration
,也就是將 MyDuration 從別名改為類型。 - 將
MyDuration
的別名定義放在time
包中。
6、在結(jié)構(gòu)體成員嵌入時使用別名
當(dāng)類型別名作為結(jié)構(gòu)體嵌入的成員時會發(fā)生什么情況?
type Person struct { name string } func (p Person) Show() { fmt.Println("Person-->",p.name) } //類型別名 type People = Person type Student struct { // 嵌入兩個結(jié)構(gòu) Person People } func (p People) Show2(){ fmt.Println("People------>",p.name) } func main() { // var s Student //s.name = "王二狗" //ambiguous selector s.name s.People.name = "李小花" s.Person.name = "王二狗" //s.Show() //ambiguous selector s.Show s.Person.Show() s.People.Show2() fmt.Printf("%T,%T\n",s.Person,s.People) //main.Person,main.Person }
在通過s直接訪問name
的時候,或者s直接調(diào)用Show()
方法,因為兩個類型都有 name
字段和Show()
方法,會發(fā)生歧義,證明People
的本質(zhì)確實是Person
類型。
到此這篇關(guān)于Golang通脈之類型定義的文章就介紹到這了,更多相關(guān)Golang 類型定義內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang RSA生成密鑰、加密、解密、簽名與驗簽的實現(xiàn)
RSA 是最常用的非對稱加密算法,本文主要介紹了Golang RSA生成密鑰、加密、解密、簽名與驗簽的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下2023-11-11Go構(gòu)建器模式構(gòu)建復(fù)雜對象方法實例
本文介紹了構(gòu)建器模式,如何通過構(gòu)建器對象構(gòu)建復(fù)雜業(yè)務(wù)對象的方法實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12重學(xué)Go語言之運算符與控制結(jié)構(gòu)詳解
對于任何編程語言來說,運算符和控制結(jié)構(gòu)都算是最基礎(chǔ)的知識了,既然是基礎(chǔ),當(dāng)然非常有必要學(xué)習(xí),因此在這篇文章中我們就來討論一下2023-02-02