最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Golang通脈之類(lèi)型定義

 更新時(shí)間:2021年10月25日 14:47:04   作者:羌  
這篇文章主要介紹了Golang通脈之類(lèi)型定義,在Go語(yǔ)言中有一些基本的數(shù)據(jù)類(lèi)型,如 string 、 整型 、 浮點(diǎn)型 、 布爾 等數(shù)據(jù)類(lèi)型, Go語(yǔ)言中可以使用 type 關(guān)鍵字來(lái)定義自定義類(lèi)型,下面和小編一起進(jìn)入文章看具體內(nèi)容吧

1、自定義類(lèi)型

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

type是Go語(yǔ)法里的重要而且常用的關(guān)鍵字,type絕不只是對(duì)應(yīng)于C/C++中的typedef。搞清楚type的使用,就容易理解go語(yǔ)言中的核心概念struct、interface、函數(shù)等的使用。

2、類(lèi)型定義

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

使用 type 可以定義結(jié)構(gòu)體類(lèi)型:

//1、定義結(jié)構(gòu)體
//結(jié)構(gòu)體定義
type person struct {
   name string //注意后面不能有逗號(hào)
   age  int
}

2.2 定義接口

使用 type 可以定義接口類(lèi)型:

type USB interface {
 start()
 end()
}

2.3 定義其他的新類(lèi)型

使用 type ,還可以定義新類(lèi)型。

語(yǔ)法:

type 類(lèi)型名 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ù)的類(lèi)型

Go語(yǔ)言支持函數(shù)式編程,可以使用高階編程語(yǔ)法。一個(gè)函數(shù)可以作為另一個(gè)函數(shù)的參數(shù),也可以作為另一個(gè)函數(shù)的返回值,那么在定義這個(gè)高階函數(shù)的時(shí)候,如果函數(shù)的類(lèi)型比較復(fù)雜,可以使用type來(lái)定義這個(gè)函數(shù)的類(lèi)型:

func main() {
  res1 := fun1()
  fmt.Println(res1(10,20))
}


type my_fun  func (int,int)(string)

//fun1()函數(shù)的返回值是my_func類(lèi)型
func fun1 () my_fun{
 fun := func(a,b int) string {
  s := strconv.Itoa(a) + strconv.Itoa(b)
  return s
 }
 return fun
}

3、類(lèi)型別名

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

類(lèi)型別名是 Go 1.9 版本添加的新功能。主要用于代碼升級(jí)、遷移中類(lèi)型的兼容性問(wèn)題。在 C/C++語(yǔ)言中,代碼重構(gòu)升級(jí)可以使用宏快速定義新的一段代碼。Go 語(yǔ)言中沒(méi)有選擇加入宏,而是將解決重構(gòu)中最麻煩的類(lèi)型名變更問(wèn)題。

type TypeAlias = Type

在 Go 1.9 版本之前的內(nèi)建類(lèi)型定義的代碼是這樣寫(xiě)的:

type byte uint8
type rune int32


而在 Go 1.9 版本之后變?yōu)椋?/strong>

type byte = uint8
type rune = int32


這個(gè)修改就是配合類(lèi)型別名而進(jìn)行的修改。

4、類(lèi)型定義和類(lèi)型別名的區(qū)別

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

//類(lèi)型定義
type NewInt int

//類(lèi)型別名
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的類(lèi)型是 main.NewInt ,表示main包下定義的 NewInt 類(lèi)型。b的類(lèi)型是 int 。 MyInt 類(lèi)型只會(huì)在代碼中存在,編譯完成時(shí)并不會(huì)有 MyInt 類(lèi)型。

5、非本地類(lèi)型不能定義方法

能夠隨意地為各種類(lèi)型起名字,是否意味著可以在自己包里為這些類(lèi)型任意添加方法?

// 定義time.Duration的別名為MyDuration
type MyDuration = time.Duration
// 為MyDuration添加一個(gè)函數(shù)
func (m MyDuration) EasySet(a string) { //cannot define new methods on non-local type time.Duration
}
func main() {
}

以上代碼報(bào)錯(cuò)。報(bào)錯(cuò)信息:cannot define new methods on non-local type time.Duration

編譯器提示:不能在一個(gè)非本地的類(lèi)型 time.Duration 上定義新方法。非本地方法指的就是使用 time.Duration 的代碼所在的包,也就是 main 包。因?yàn)?code> time.Duration 是在 time 包中定義的,在 main 包中使用。time.Duration 包與 main 包不在同一個(gè)包中,因此不能為不在一個(gè)包中的類(lèi)型定義方法。

解決這個(gè)問(wèn)題有下面兩種方法:

  • 將類(lèi)型別名改為類(lèi)型定義: type MyDuration time.Duration ,也就是將 MyDuration 從別名改為類(lèi)型。
  • MyDuration 的別名定義放在 time 包中。

6、在結(jié)構(gòu)體成員嵌入時(shí)使用別名

當(dāng)類(lèi)型別名作為結(jié)構(gòu)體嵌入的成員時(shí)會(huì)發(fā)生什么情況?

type Person struct {
 name string
}

func (p Person) Show() {
 fmt.Println("Person-->",p.name)
}

//類(lèi)型別名
type People = Person

type Student struct {
 // 嵌入兩個(gè)結(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

}

在通過(guò)s直接訪問(wèn)name的時(shí)候,或者s直接調(diào)用Show()方法,因?yàn)閮蓚€(gè)類(lèi)型都有 name字段和Show() 方法,會(huì)發(fā)生歧義,證明People 的本質(zhì)確實(shí)是Person 類(lèi)型。

到此這篇關(guān)于Golang通脈之類(lèi)型定義的文章就介紹到這了,更多相關(guān)Golang 類(lèi)型定義內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go語(yǔ)言利用ssh連接服務(wù)器的方法步驟

    Go語(yǔ)言利用ssh連接服務(wù)器的方法步驟

    這篇文章主要介紹了Go語(yǔ)言利用ssh連接服務(wù)器的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • 剖析Go編寫(xiě)的Socket服務(wù)器模塊解耦及基礎(chǔ)模塊的設(shè)計(jì)

    剖析Go編寫(xiě)的Socket服務(wù)器模塊解耦及基礎(chǔ)模塊的設(shè)計(jì)

    這篇文章主要介紹了Go的Socket服務(wù)器模塊解耦及日志和定時(shí)任務(wù)的模塊設(shè)計(jì),舉了一些Go語(yǔ)言編寫(xiě)的服務(wù)器模塊的例子,需要的朋友可以參考下
    2016-03-03
  • GO語(yǔ)言中接口和接口型函數(shù)的具體使用

    GO語(yǔ)言中接口和接口型函數(shù)的具體使用

    本文主要介紹了GO語(yǔ)言中接口和接口型函數(shù)的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • golang testing使用示例小結(jié)

    golang testing使用示例小結(jié)

    golang自帶了testing測(cè)試包,使用該包可以進(jìn)行自動(dòng)化的單元測(cè)試,輸出結(jié)果驗(yàn)證,并且可以測(cè)試性能,下面通過(guò)示例代碼給大家講解golang testing使用示例小結(jié),感興趣的朋友一起看看吧
    2024-05-05
  • Go 計(jì)時(shí)器使用示例全面講解

    Go 計(jì)時(shí)器使用示例全面講解

    這篇文章主要為大家介紹了Go 計(jì)時(shí)器使用示例全面講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • Go?Error?嵌套實(shí)現(xiàn)創(chuàng)建方式

    Go?Error?嵌套實(shí)現(xiàn)創(chuàng)建方式

    這篇文章主要介紹了Go?Error?嵌套到底是怎么實(shí)現(xiàn)的?大家都知道創(chuàng)建error有兩種方式分別是errors.new()另一種是fmt.errorf(),本文通過(guò)詳細(xì)例子給大家介紹,需要的朋友可以參考下
    2022-01-01
  • 詳解Go中處理時(shí)間數(shù)據(jù)的方法

    詳解Go中處理時(shí)間數(shù)據(jù)的方法

    在許多場(chǎng)合,你將不得不編寫(xiě)必須處理時(shí)間的代碼。在Go中處理時(shí)間數(shù)據(jù)需要你從Go標(biāo)準(zhǔn)庫(kù)中導(dǎo)入?time?包。這個(gè)包有很多方法和類(lèi)型供你使用,但我選取了最常用的方法和類(lèi)型,并在這篇文章中進(jìn)行了描述,感興趣的可以了解一下
    2023-04-04
  • Go語(yǔ)言學(xué)習(xí)之Switch語(yǔ)句的使用

    Go語(yǔ)言學(xué)習(xí)之Switch語(yǔ)句的使用

    這篇文章主要通過(guò)一些示例為大家介紹一下Go語(yǔ)言中Switch語(yǔ)句的基本語(yǔ)法以及使用,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-06-06
  • Go語(yǔ)言進(jìn)行多時(shí)區(qū)時(shí)間轉(zhuǎn)換的示例代碼

    Go語(yǔ)言進(jìn)行多時(shí)區(qū)時(shí)間轉(zhuǎn)換的示例代碼

    本文介紹了使用Go語(yǔ)言進(jìn)行多時(shí)區(qū)時(shí)間轉(zhuǎn)換,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-12-12
  • Golang反射修改變量值的操作代碼

    Golang反射修改變量值的操作代碼

    這篇文章主要介紹了Golang反射修改變量值,也就是Golang反射三大定律中的前兩個(gè),即從interface{}到反射對(duì)象和從反射對(duì)象到interface{},需要的朋友可以參考下
    2022-12-12

最新評(píng)論

正宁县| 蓝田县| 区。| 宁城县| 都兰县| 登封市| 崇文区| 宜城市| 营山县| 阳春市| 古丈县| 聂荣县| 阿克苏市| 澳门| 大石桥市| 保亭| 宜兴市| 磐石市| 临漳县| 富蕴县| 周至县| 赣榆县| 东乌| 凤山市| 中西区| 镇宁| 平湖市| 盘山县| 芒康县| 德令哈市| 沈丘县| 分宜县| 威远县| 绍兴市| 六盘水市| 政和县| 通州市| 汤原县| 南部县| 遵义县| 阿合奇县|