中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

go語言中的type是什么

go語言中的type是什么?可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

公司主營(yíng)業(yè)務(wù):成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出阿克塞哈薩克族自治免費(fèi)做網(wǎng)站回饋大家。

type是go語法里的重要而且常用的關(guān)鍵字,type絕不只是對(duì)應(yīng)于C/C++中的typedef。type又有兩種使用方式,一種是類型別名,一種是類型定義,是不是熟悉的C語言(define和typedef)味道?

類型定義

type Student struct {
  name String
  age int
}
type I int

類型別名

type Sdt = Student
type I = int

type有如下幾種用法:

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

定義接口

類型定義

類型別名

類型查詢

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

結(jié)構(gòu)體是用戶自定義的一種抽象的數(shù)據(jù)結(jié)構(gòu),golang中struct類似于java語言中的class, 在程序設(shè)計(jì)中,有著舉足輕重的地位。結(jié)構(gòu)體的用法,將會(huì)在struct關(guān)鍵字中詳細(xì)的介紹。下邊來看一下定義一個(gè)結(jié)構(gòu)體的語法格式:

type name struct {
    Field1  dataType
    Field2  dataType
    Field3  dataType
}

定義接口

接口相關(guān)知識(shí)點(diǎn),將會(huì)在interface關(guān)鍵字中詳細(xì)介紹,下邊來看一段定義接口的語法格式:

type name interface{
    Read()
    Write()
}

類型定義

使用類型定義定義出來的類型與原類型不相同,所以不能使用新類型變量賦值給原類型變量,除非使用強(qiáng)制類型轉(zhuǎn)換。下面來看一段示例代碼,根據(jù)string類型,定義一種新的類型,新類型名稱是name:

type name string

為什么要使用類型定義呢?

類型定義可以在原類型的基礎(chǔ)上創(chuàng)造出新的類型,有些場(chǎng)合下可以使代碼更加簡(jiǎn)潔,如下邊示例代碼:

package main
import (
  "fmt"
)
// 定義一個(gè)接收一個(gè)字符串類型參數(shù)的函數(shù)類型
type handle func(str string)
// exec函數(shù),接收handle類型的參數(shù)
func exec(f handle) {
  f("hello")
}
func main() {
  // 定義一個(gè)函數(shù)類型變量,這個(gè)函數(shù)接收一個(gè)字符串類型的參數(shù)
  var p = func(str string) {
    fmt.Println("first", str)
  }
  exec(p)
  // 匿名函數(shù)作為參數(shù)直接傳遞給exec函數(shù)
  exec(func(str string) {
    fmt.Println("second", str)
  })
}

輸出信息是:

first hello
second hello

上邊的示例是類型定義的一種簡(jiǎn)單應(yīng)用場(chǎng)合,如果不使用類型定義,那么想要實(shí)現(xiàn)上邊示例中的功能,應(yīng)該怎么書寫這段代碼呢?

// exec函數(shù),接收handle類型的參數(shù)
func exec(f func(str string)) {
  f("hello")
}

exec函數(shù)中的參數(shù)類型,需要替換成func(str string)了,咋一看去也不復(fù)雜,但是假如exec接收一個(gè)需要5個(gè)參數(shù)的函數(shù)變量呢?是不是感覺參數(shù)列表就會(huì)很長(zhǎng)了。

func exec(f func(str string, str2 string, num int, money float64, flag bool)) {
  f("hello")
}

從上邊的代碼可以發(fā)現(xiàn),exec函數(shù)的參數(shù)列表可讀性變差了。下邊再來看看使用類型定義是怎么實(shí)現(xiàn)這個(gè)功能:

package main
import (
  "fmt"
)
// 定義一個(gè)需要五個(gè)參數(shù)的函數(shù)類型
type handle func(str string, str2 string, num int, money float64, flag bool)
// exec函數(shù),接收handle類型的參數(shù)
func exec(f handle) {
  f("hello", "world", 10, 11.23, true)
}
func demo(str string, str2 string, num int, money float64, flag bool) {
  fmt.Println(str, str2, num, money, flag)
}
func main() {
  exec(demo)
}

類型別名

類型別名這個(gè)特性在golang1.9中引入。使用類型別名定義出來的類型與原類型一樣,即可以與原類型變量互相賦值,又擁有了原類型的所有方法集。給strng類型取一個(gè)別名,別名名稱是name:

type name = string

類型別名與類型定義不同之處在于,使用類型別名需要在別名和原類型之間加上賦值符號(hào)(=);使用類型別名定義的類型與原類型等價(jià),而使用類型定義出來的類型是一種新的類型。

如下邊示例:

package main
import (
  "fmt"
)
type a = string
type b string
func SayA(str a) {
  fmt.Println(str)
}
func SayB(str b) {
  fmt.Println(str)
}
func main() {
  var str = "test"
  SayA(str)
  
  //錯(cuò)誤參數(shù)傳遞,str是字符串類型,不能賦值給b類型變量
  SayB(str)
}

這段代碼在編譯時(shí)會(huì)出現(xiàn)如下錯(cuò)誤:

.\main.go:21:6: cannot use str (type string) as type b in argument to SayB

從錯(cuò)誤信息可知,str為字符串類型,不能當(dāng)做b類型參數(shù)傳入SayB函數(shù)中。而str卻可以當(dāng)做a類型參數(shù)傳入到SayA函數(shù)中。由此可見,使用類型別名定義的類型與原類型一致,而類型定義定義出來的類型,是一種新的類型。

給類型別名新增方法,會(huì)添加到原類型方法集中

給類型別名新增方法后,原類型也能使用這個(gè)方法。下邊請(qǐng)看一段示例代碼:

package main
import (
  "fmt"
)
// 根據(jù)string類型,定義類型S
type S string
func (r *S) Hi() {
  fmt.Println("S hi")
}
// 定義S的類型別名為T
type T = S
func (r *T) Hello() {
  fmt.Println("T hello")
}
// 函數(shù)參數(shù)接收S類型的指針變量
func exec(obj *S) {
  obj.Hello()
  obj.Hi()
}
func main() {
  t := new(T)
  s := new(S)
  exec(s)
  // 將T類型指針變量傳遞給S類型指針變量
  exec(t)
}

輸出信息是:

T hello
S hi
T hello
S hi

上邊的示例中,S是原類型,T是S類型別名。在給T增加了Hello方法后,S類型的變量也可以使用Hello方法。說明給類型別名新增方法后,原類型也能使用這個(gè)方法。從示例中可知,變量t可以賦值給S類型變量s,所以類型別名是給原類型取了一個(gè)小名,本質(zhì)上沒有發(fā)生任何變化。

類型別名,只能對(duì)同一個(gè)包中的自定義類型產(chǎn)生作用。舉個(gè)例子,golang sdk中有很多個(gè)包,是不是我們可以使用類型別名,給sdk包中的結(jié)構(gòu)體類型新增方法呢?答案是:不行。請(qǐng)牢記一點(diǎn):類型別名,只能對(duì)包內(nèi)的類型產(chǎn)生作用,對(duì)包外的類型采用類型別名,在編譯時(shí)將會(huì)提示如下信息:

cannot define new methods on non-local type string

類型查詢

類型查詢,就是根據(jù)變量,查詢這個(gè)變量的類型。為什么會(huì)有這樣的需求呢?goalng中有一個(gè)特殊的類型interface{},這個(gè)類型可以被任何類型的變量賦值,如果想要知道到底是哪個(gè)類型的變量賦值給了interface{}類型變量,就需要使用類型查詢來解決這個(gè)需求,示例代碼如下:

package main
import (
  "fmt"
)
func main() {
    // 定義一個(gè)interface{}類型變量,并使用string類型值”abc“初始化
    var a interface{} = "abc"
    
    // 在switch中使用 變量名.(type) 查詢變量是由哪個(gè)類型數(shù)據(jù)賦值。
    switch v := a.(type) {
    case string:
      fmt.Println("字符串")
    case int:
        fmt.Println("整型")
    default:
      fmt.Println("其他類型", v)
    }
}

如果使用.(type)查詢類型的變量不是interface{}類型,則在編譯時(shí)會(huì)報(bào)如下錯(cuò)誤:

cannot type switch on non-interface value a (type string)

如果在switch以外地方使用.(type),則在編譯時(shí)會(huì)提示如下錯(cuò)誤:

use of .(type) outside type switch

所以,使用type進(jìn)行類型查詢時(shí),只能在switch中使用,且使用類型查詢的變量類型必須是interface{}

看完上述內(nèi)容,你們對(duì)go語言中的type有進(jìn)一步的了解嗎?如果還想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀。

網(wǎng)頁名稱:go語言中的type是什么
文章網(wǎng)址:http://www.rwnh.cn/article46/jjsphg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、定制開發(fā)、網(wǎng)站設(shè)計(jì)公司、網(wǎng)站設(shè)計(jì)、網(wǎng)站策劃、電子商務(wù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)
报价| 凌源市| 通山县| 哈密市| 华阴市| 陆良县| 双鸭山市| 绍兴县| 阿巴嘎旗| 姜堰市| 江孜县| 铜梁县| 天台县| 河北省| 中阳县| 永昌县| 潼关县| 吉木萨尔县| 韶山市| 鲜城| 汤原县| 大连市| 郑州市| 宜春市| 武冈市| 乌拉特中旗| 黑山县| 井陉县| 甘德县| 惠水县| 安远县| 东辽县| 石渠县| 吴旗县| 胶南市| 英吉沙县| 罗平县| 丹江口市| 克拉玛依市| 闽清县| 邮箱|