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

Go 語(yǔ)言中關(guān)于接口的三個(gè)

 更新時(shí)間:2020年06月16日 09:23:46   作者:Python編程時(shí)光  
這篇文章主要介紹了Go 語(yǔ)言中關(guān)于接口的三個(gè)"潛規(guī)則",本文通過實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

我的在線博客:http://golang.iswbm.com
我的 Github:github.com/iswbm/GolangCodingTime 

1. 對(duì)方法的調(diào)用限制

接口是一組固定的方法集,由于靜態(tài)類型的限制,接口變量有時(shí)僅能調(diào)用其中特定的一些方法。

請(qǐng)看下面這段代碼

package main

import "fmt"

type Phone interface {
 call()
}

type iPhone struct {
 name string
}

func (phone iPhone)call() {
 fmt.Println("Hello, iPhone.")
}

func (phone iPhone)send_wechat() {
 fmt.Println("Hello, Wechat.")
}

func main() {
 var phone Phone
 phone = iPhone{name:"ming's iphone"}
 phone.call()
 phone.send_wechat()
}

我定義了一個(gè) Phone 的接口,只要求實(shí)現(xiàn) call 方法即可,也就是只要能打電話的設(shè)備就是一個(gè)電話(好像是一句沒用的廢話)。

然后再定義了一個(gè) iPhone 的結(jié)構(gòu)體,該結(jié)構(gòu)體接收兩個(gè)方法,一個(gè)是打電話( call 函數(shù)),一個(gè)是發(fā)微信(send_wechat 函數(shù))。

最后一步是關(guān)鍵,我們定義了一個(gè) Phone 接口類型的 phone 對(duì)象,該對(duì)象的內(nèi)容是 iPhone 結(jié)構(gòu)體。然后我們調(diào)用該對(duì)象的 call 方法,一切正常。

但是當(dāng)你調(diào)用 phone.send_wechat 方法,程序會(huì)報(bào)錯(cuò),提示我們 Phone 類型的方法沒有 send_wechat 的字段或方法。

# command-line-arguments
./demo.go:30:10: phone.send_wechat undefined (type Phone has no field or method send_wechat)

原因也很明顯,因?yàn)槲覀兊膒hone對(duì)象顯示聲明為 Phone 接口類型,因此 phone調(diào)用的方法會(huì)受到此接口的限制。

那么如何讓 phone 可以調(diào)用 send_wechat 方法呢?

答案是可以不顯示的聲明為 Phone接口類型 ,但要清楚 phone 對(duì)象實(shí)際上是隱式的實(shí)現(xiàn)了 Phone 接口,如此一來,方法的調(diào)用就不會(huì)受到接口類型的約束。

修改 main 方法成如下

func main() {
 phone := iPhone{name:"ming's iphone"}
 phone.call()
 phone.send_wechat()
}

運(yùn)行后,一切正常,沒有報(bào)錯(cuò)。

Hello, iPhone.
Hello, Wechat.

2. 調(diào)用函數(shù)時(shí)的隱式轉(zhuǎn)換

Go 語(yǔ)言中的函數(shù)調(diào)用都是值傳遞的,變量會(huì)在方法調(diào)用前進(jìn)行類型轉(zhuǎn)換。

比如下面這段代碼

import (
 "fmt"
)

func printType(i interface{}) {

 switch i.(type) {
 case int:
 fmt.Println("參數(shù)的類型是 int")
 case string:
 fmt.Println("參數(shù)的類型是 string")
 }
}

func main() {
 a := 10
 printType(a)
}

如果你運(yùn)行后,會(huì)發(fā)現(xiàn)一切都很正常

參數(shù)的類型是 int

但是如果你把函數(shù)內(nèi)的內(nèi)容搬到到外面來

package main

import "fmt"


func main() {
 a := 10

 switch a.(type) {
 case int:
 fmt.Println("參數(shù)的類型是 int")
 case string:
 fmt.Println("參數(shù)的類型是 string")
 }
}

就會(huì)有意想不到的結(jié)果,居然報(bào)錯(cuò)了。

# command-line-arguments
./demo.go:9:5: cannot type switch on non-interface value a (type int)

這個(gè)操作會(huì)讓一個(gè)新人摸不著頭腦,代碼邏輯都是一樣的,為什么一個(gè)不會(huì)報(bào)錯(cuò),一個(gè)會(huì)報(bào)錯(cuò)呢?

原因其實(shí)很簡(jiǎn)單。

當(dāng)一個(gè)函數(shù)接口 interface{} 空接口類型時(shí),我們說它可以接收什么任意類型的參數(shù)(江湖上稱之為無招勝有招)。

當(dāng)你使用這種寫法時(shí),Go 會(huì)默默地為我們做一件事,就是把傳入函數(shù)的參數(shù)值(注意:Go 語(yǔ)言中的函數(shù)調(diào)用都是值傳遞的)的類型隱式的轉(zhuǎn)換成 interface{} 類型。

如何進(jìn)行接口類型的顯示轉(zhuǎn)換

上面了解了函數(shù)中 接口類型的隱式轉(zhuǎn)換后,你的心里可能開始有了疑問了,難道我使用類型斷言,只能通過一個(gè)接收空接口類型的函數(shù)才能實(shí)現(xiàn)嗎?

答案當(dāng)然是 No.

如果你想手動(dòng)對(duì)其進(jìn)行類型轉(zhuǎn)換,可以像下面這樣子,就可以將變量 a 的靜態(tài)類型轉(zhuǎn)換為 interface{} 類型然后賦值給 b (此時(shí) a 的靜態(tài)類型還是 int,而 b 的靜態(tài)類型為 interface{})

var a int = 25
b := interface{}(a)

知道了方法后,將代碼修改成如下:

package main

import "fmt"


func main() {
 a := 10

 switch interface{}(a).(type) {
 case int:
 fmt.Println("參數(shù)的類型是 int")
 case string:
 fmt.Println("參數(shù)的類型是 string")
 }
}

運(yùn)行后,一切正常。

參數(shù)的類型是 int

3. 類型斷言中的隱式轉(zhuǎn)換

上面我們知道了,只有靜態(tài)類型為接口類型的對(duì)象才可以進(jìn)行類型斷言。

而當(dāng)類型斷言完成后,會(huì)返回一個(gè)靜態(tài)類型為你斷言的類型的對(duì)象,也就是說,當(dāng)我們使用了類型斷言,Go 實(shí)際上又會(huì)默認(rèn)為我們進(jìn)行了一次隱式的類型轉(zhuǎn)換。

驗(yàn)證方法也很簡(jiǎn)單,使用完一次類型斷言后,對(duì)返回的對(duì)象再一次使用類型斷言,Goland 立馬就會(huì)提示我們新對(duì)象 b 不是一個(gè)接口類型的對(duì)象,不允許進(jìn)行類型斷言。

總結(jié)

到此這篇關(guān)于Go 語(yǔ)言中關(guān)于接口的三個(gè)"潛規(guī)則"的文章就介紹到這了,更多相關(guān)go語(yǔ)言接口內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一文教你如何優(yōu)雅處理Golang中的異常

    一文教你如何優(yōu)雅處理Golang中的異常

    我們?cè)谑褂肎olang時(shí),不可避免會(huì)遇到異常情況的處理,與Java、Python等語(yǔ)言不同的是,Go中并沒有try...catch...這樣的語(yǔ)句塊,這個(gè)時(shí)候我們?nèi)绾尾拍芨玫奶幚懋惓D兀勘疚膩斫棠阏_方法
    2022-11-11
  • golang 切片的三種使用方式及區(qū)別的說明

    golang 切片的三種使用方式及區(qū)別的說明

    這篇文章主要介紹了golang 切片的三種使用方式及區(qū)別的說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • go build -tags構(gòu)建約束試驗(yàn)示例解析

    go build -tags構(gòu)建約束試驗(yàn)示例解析

    這篇文章主要為大家介紹了go build -tags構(gòu)建約束試驗(yàn)示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • GoLang中Module的基本使用方法

    GoLang中Module的基本使用方法

    Go module是從Go 1.11版本才引入的新功能,下面這篇文章主要給大家介紹了關(guān)于GoLang中Module的基本使用方法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01
  • go redis實(shí)現(xiàn)滑動(dòng)窗口限流的方式(redis版)

    go redis實(shí)現(xiàn)滑動(dòng)窗口限流的方式(redis版)

    這篇文章主要介紹了go redis實(shí)現(xiàn)滑動(dòng)窗口限流的方式(redis版),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • Go語(yǔ)言轉(zhuǎn)換所有字符串為大寫或者小寫的方法

    Go語(yǔ)言轉(zhuǎn)換所有字符串為大寫或者小寫的方法

    這篇文章主要介紹了Go語(yǔ)言轉(zhuǎn)換所有字符串為大寫或者小寫的方法,實(shí)例分析了ToLower和ToUpper函數(shù)的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02
  • Go框架三件套Gorm?Kitex?Hertz基本用法與常見API講解

    Go框架三件套Gorm?Kitex?Hertz基本用法與常見API講解

    這篇文章主要為大家介紹了Go框架三件套Gorm?Kitex?Hertz的基本用法與常見API講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>
    2023-02-02
  • 深入分析Go?實(shí)現(xiàn)?MySQL?數(shù)據(jù)庫(kù)事務(wù)

    深入分析Go?實(shí)現(xiàn)?MySQL?數(shù)據(jù)庫(kù)事務(wù)

    本文深入分析了Go語(yǔ)言實(shí)現(xiàn)MySQL數(shù)據(jù)庫(kù)事務(wù)的原理和實(shí)現(xiàn)方式,包括事務(wù)的ACID特性、事務(wù)的隔離級(jí)別、事務(wù)的實(shí)現(xiàn)方式等。同時(shí),本文還介紹了Go語(yǔ)言中的事務(wù)處理機(jī)制和相關(guān)的API函數(shù),以及如何使用Go語(yǔ)言實(shí)現(xiàn)MySQL數(shù)據(jù)庫(kù)事務(wù)。
    2023-06-06
  • golang中net的tcp服務(wù)使用

    golang中net的tcp服務(wù)使用

    這篇文章主要介紹了golang中net的tcp服務(wù)使用,文章通過服務(wù)端監(jiān)聽端口 展開主題的詳細(xì)內(nèi)容,具有一定的參考價(jià)值,需要的 小伙伴可以參考一下
    2022-04-04
  • golang實(shí)現(xiàn)對(duì)JavaScript代碼混淆

    golang實(shí)現(xiàn)對(duì)JavaScript代碼混淆

    在Go語(yǔ)言中,你可以使用一些工具來混淆JavaScript代碼,一個(gè)常用的工具是Terser,它可以用于壓縮和混淆JavaScript代碼,你可以通過Go語(yǔ)言的`os/exec`包來調(diào)用Terser工具,本文給通過一個(gè)簡(jiǎn)單的示例給大家介紹一下,感興趣的朋友可以參考下
    2024-01-01

最新評(píng)論

五常市| 福清市| 高尔夫| 永兴县| 曲水县| 板桥市| 朝阳市| 安平县| 密云县| 聂拉木县| 井冈山市| 桃江县| 左贡县| 元谋县| 香格里拉县| 海伦市| 金昌市| 勐海县| 英山县| 淮北市| 古交市| 双流县| 喀喇沁旗| 库车县| 万州区| 泰来县| 宜宾市| 安庆市| 阳朔县| 镇赉县| 九龙县| 九龙城区| 会宁县| 北碚区| 新绛县| 金乡县| 承德县| 东阿县| 陆河县| 谢通门县| 新疆|