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

Golang六個(gè)常用接口的使用總結(jié)

 更新時(shí)間:2023年07月31日 09:50:10   作者:程序員讀書  
在這篇文章中,小編來帶大家學(xué)習(xí)幾個(gè)Go標(biāo)準(zhǔn)庫的接口,看看Go標(biāo)準(zhǔn)庫是如何定義接口,以加深對(duì)Go語言接口的理解,感興趣的小伙伴快跟隨小編一起了解一下吧

在上一篇文章中,我們講解了接口,對(duì)于很多初學(xué)者來說,接口很抽象,我們有時(shí)候不知道如何定義自己的接口,基于此,在這篇文章中,我們來學(xué)習(xí)幾個(gè)Go標(biāo)準(zhǔn)庫的接口,看看Go標(biāo)準(zhǔn)庫是如何定義接口,以加深對(duì)Go語言接口的理解。

fmt.Stringer

在開發(fā)過程,我們經(jīng)常會(huì)調(diào)用fmt包下的打印函數(shù)(如printlnprintf)將調(diào)試信息輸出到控制臺(tái):

fmt.Println("test")
fmt.Printf("%d\n",10)

這些打印函數(shù)會(huì)自動(dòng)決定如何在控制臺(tái)輸出這些信息,對(duì)于自定義類型,如果我們想自定義其在控制臺(tái)的輸出,要怎么做呢?

fmt包的Stringer用于定義類型的格式化輸出,該接口的定義如下:

type Stringer interface {
    String() string
}

對(duì)于實(shí)現(xiàn)了Stringer接口的類型,打印函數(shù)會(huì)自動(dòng)調(diào)用該類型的String()方法,將該方法的返回值輸出到控制臺(tái),比如我們自定義一個(gè)Reason類型,用于表示季節(jié):

package main 
type Reason uint
const (
	SPRING Reason = iota + 1
	SUMMER
	AUTUMN
	WINTER
)
func main() {
	fmt.Println(SPRING) //輸出:1
    fmt.Println(SUMMER) //輸出:2
  	fmt.Println(AUTUMN) //輸出:3
  	fmt.Println(WINTER) //輸出:4
}

實(shí)現(xiàn)Stringer接口后,就可以將Reason類以中文的格式打印出來了:

func (r Reason) String() string {
	return ReasonText[r] //自定義輸出:將數(shù)值轉(zhuǎn)化為文本
}
var ReasonText = map[Reason]string{
	SPRING: "春天",
	SUMMER: "夏天",
	AUTUMN: "秋天",
	WINTER: "冬天",
}
func main() {
	fmt.Println(SPRING) //輸出:春天
  fmt.Println(SUMMER) //輸出:夏天
  fmt.Println(AUTUMN) //輸出:秋天
  fmt.Println(WINTER) //輸出:冬天
}

sort.Interface

除了格式化輸出信息外,排序功能也是開發(fā)中經(jīng)常用到的,Go標(biāo)準(zhǔn)庫的sort包的Sort()就是常用的排序函數(shù),該函數(shù)定義如下:

func Sort(data Interface) {
	n := data.Len()
	quickSort(data, 0, n, maxDepth(n))
}

可以看到,Sort函數(shù)接收一個(gè)Inferface類型的參數(shù),Interface類型是一個(gè)接口,其定義如下:

type Interface interface {
    Len() int
    Less(i, j int) bool
    Swap(i, j int)
}

Interface類型的Len方法用于返回長(zhǎng)度,Less方法用于元素比較大小,Swap方法實(shí)現(xiàn)元素位置交換,任何擁有這個(gè)方法的類型,都可以傳遞給sort.Sort進(jìn)行排序。

下面是一個(gè)實(shí)現(xiàn)sort.Interface接口,并調(diào)用sort.Sort函數(shù)的示例:

package main
import (
	"fmt"
	"sort"
)
type Student struct {
	ID    int
	Name  string
	Score int
}
type Students []Student
func (s Students) Len() int {
	return len(s)
}
func (s Students) Less(i, j int) bool {
	return s[i].Score > s[j].Score
}
func (s Students) Swap(i, j int) {
	s[i], s[j] = s[j], s[i]
}
func main() {
	students := []Student{
    {ID: 1, Name: "A", Score: 95},
		{ID: 2, Name: "B", Score: 100},
		{ID: 3, Name: "C", Score: 90},
    {ID: 4, Name: "D", Score: 80},             
	}
	sort.Sort(Students(students))
	fmt.Println(students)
}

io.Reader和io.Writer

網(wǎng)絡(luò)數(shù)據(jù)的讀取與發(fā)送、文件的讀取與寫入,本質(zhì)都是寫入或取出一段字節(jié)數(shù)據(jù)(即字節(jié)數(shù)組),Go標(biāo)準(zhǔn)庫對(duì)字節(jié)的讀取與寫入抽象為io包的ReaderWriter接口:

type Reader interface {
	Read(p []byte) (n int, err error)
}
type Writer interface {
	Write(p []byte) (n int, err error)
}

在Go標(biāo)準(zhǔn)庫內(nèi)有很多實(shí)現(xiàn)了io.Readerio.Writer接口,比如os.File或者Response.Boy:

package main
import (
	"io"
	"net/http"
	"os"
)
func main() {
	url := ""
	response, err := http.Get(url)
	if err != nil {
		panic(err)
	}
	//os.Stdout是os.File類型
	io.Copy(os.Stdout, response.Body)
}

上面我們調(diào)用io.Copy方法將請(qǐng)求到的數(shù)據(jù)輸出到控制臺(tái),io.Copy函數(shù)定義如下:

func Copy(dst Writer, src Reader) (written int64, err error) {
	return copyBuffer(dst, src, nil)
}

可以看到這個(gè)方法接收的參數(shù)就是WriterReader接口,我們也可以自定義類型來實(shí)現(xiàn)Writer或者Reader接口:

package main
import (
	"fmt"
	"io"
	"net/http"
)
type Data string
func (d *Data) Write(p []byte) (n int, err error) {
	n = len(p)
	*d = Data(string(p))
	return n, nil
}
func main() {
	url := ""
	response, err := http.Get(url)
	if err != nil {
		panic(err)
	}
	var d Data
	io.Copy(&d, response.Body)
	fmt.Println(d)
}

error

Go語言的函數(shù)支持多個(gè)返回值,一般推薦把error類型作為函數(shù)最后一個(gè)返回值,用于告訴調(diào)用者函數(shù)調(diào)用是否發(fā)生錯(cuò)誤,error類型實(shí)際上就是一個(gè)接口:

type error interface {
    Error() string
}

可以看到error只定義了一個(gè)方法,該方法返回一個(gè)字符串的錯(cuò)誤信息,我們可以使用errors包的方法創(chuàng)建并返回一個(gè)error類型:

var err error = errors.New("Not Found")

也可以在實(shí)現(xiàn)error接口的基礎(chǔ),包含更多的錯(cuò)誤信息,方便調(diào)用者判斷錯(cuò)誤類型:

package main
import (
	"fmt"
	"os"
)
type FileNotFound struct {
	Message  string
	FileName string
	err      error
}
func (f FileNotFound) Error() string {
	return f.Message
}
func GetLogFile(fileName string) (*os.File, error) {
	f, err := os.Open(fileName)
	if err != nil {
		return nil, &FileNotFound{FileName: fileName, err: err, Message: "Not found"}
	}
	return f, nil
}
func main() {
	var err error
	f, err = GetLogFile("1.txt")
	if e, ok := err.(FileNotFound); ok {
		fmt.Println(e.Message)
	}
}

http.Handler

http包的Handler接口定義如下,該接口定義了處理HTTP請(qǐng)求應(yīng)該實(shí)現(xiàn)的方法。

type Handler interface {
    ServeHTTP(w ResponseWriter, r *Request)
}

Go語言中,只需要簡(jiǎn)單的幾行代碼便可以啟動(dòng)一個(gè)Web服務(wù)器:

package main
import "net/http"
func main() {
	http.HandleFunc("/user", func(w http.ResponseWriter, r *http.Request) {
		w.Write([]byte("User Info"))
	})
	http.ListenAndServe(":8080", nil)
}

http.HandleFunc()會(huì)將我們自己的匿名函數(shù)封裝為HandlerFunc函數(shù),HandlerFunc函數(shù)的定義如下,可以看到這個(gè)函數(shù)實(shí)現(xiàn)了Handler接口:

type HandlerFunc func(ResponseWriter, *Request)
func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {
	f(w, r)
}

關(guān)于Go的Web開發(fā)部分,我們后面在其他文章再詳細(xì)講解!

小結(jié)

幾個(gè)Go接口講解下來,你會(huì)發(fā)現(xiàn),其實(shí)Go標(biāo)準(zhǔn)庫定義的接口簡(jiǎn)單且通用,一個(gè)接口就只描述一種行為,這就是Go語言的編程哲學(xué)是一個(gè)接口只做一件事,只完成一個(gè)功能,將多個(gè)功能堆砌在同一個(gè)接口內(nèi)是不可取的。

另外也不要在開發(fā)某個(gè)具體類型前預(yù)定義好接口,而是當(dāng)多個(gè)類型有共同行為但卻有不同實(shí)現(xiàn)的時(shí)候,才用接口加以概括和描述。

到此這篇關(guān)于Golang六個(gè)常用接口的使用總結(jié)的文章就介紹到這了,更多相關(guān)Golang接口內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go語言中的各類運(yùn)算操作符詳解

    Go語言中的各類運(yùn)算操作符詳解

    本文全面探討了Go語言中的各類運(yùn)算操作符,從基礎(chǔ)的數(shù)學(xué)和位運(yùn)算到邏輯和特殊運(yùn)算符,文章旨在深入解析每一種運(yùn)算操作符的工作原理、應(yīng)用場(chǎng)景和注意事項(xiàng),以幫助開發(fā)者編寫更高效、健壯和可讀的Go代碼,</P><P>
    2023-09-09
  • GO語言快速入門的全面學(xué)習(xí)筆記總結(jié)(實(shí)例代碼)

    GO語言快速入門的全面學(xué)習(xí)筆記總結(jié)(實(shí)例代碼)

    本博客分享Go語言學(xué)習(xí)筆記總結(jié),助讀者快速掌握基本編碼能力,介紹了Go語言誕生背景、應(yīng)用場(chǎng)景,指出Java等程序員學(xué)習(xí)誤區(qū),還涵蓋環(huán)境搭建、程序結(jié)構(gòu)、常用集合、函數(shù)、面向?qū)ο缶幊?、錯(cuò)誤機(jī)制、包管理和并發(fā)編程等內(nèi)容,并給出代碼示例和驗(yàn)證
    2026-01-01
  • Go語言面向?qū)ο筇匦?封裝、組合、多態(tài))超詳細(xì)講解

    Go語言面向?qū)ο筇匦?封裝、組合、多態(tài))超詳細(xì)講解

    面向?qū)ο缶幊叹哂懈邇?nèi)聚低耦合,易維護(hù)、易擴(kuò)展、易復(fù)用的優(yōu)點(diǎn),而Go語言中也是可以進(jìn)行面向?qū)ο缶幊痰?這篇文章主要介紹了Go語言面向?qū)ο筇匦?封裝、組合、多態(tài))的相關(guān)資料,需要的朋友可以參考下
    2026-03-03
  • golang多維度排序及題解最長(zhǎng)連續(xù)序列

    golang多維度排序及題解最長(zhǎng)連續(xù)序列

    這篇文章主要為大家介紹了golang多維度排序及題解最長(zhǎng)連續(xù)序列示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • Go語言-為什么返回值為接口類型,卻返回結(jié)構(gòu)體

    Go語言-為什么返回值為接口類型,卻返回結(jié)構(gòu)體

    這篇文章主要介紹了Go語言返回值為接口類型,卻返回結(jié)構(gòu)體的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Go語言實(shí)現(xiàn)順序存儲(chǔ)的線性表實(shí)例

    Go語言實(shí)現(xiàn)順序存儲(chǔ)的線性表實(shí)例

    這篇文章主要介紹了Go語言實(shí)現(xiàn)順序存儲(chǔ)的線性表的方法,實(shí)例分析了Go語言實(shí)現(xiàn)線性表的定義、插入、刪除元素等的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-03-03
  • 探索Golang?Redis實(shí)現(xiàn)發(fā)布訂閱功能實(shí)例

    探索Golang?Redis實(shí)現(xiàn)發(fā)布訂閱功能實(shí)例

    這篇文章主要介紹了Golang?Redis發(fā)布訂閱功能實(shí)例探索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • Go語言開發(fā)k8s之Service操作解析

    Go語言開發(fā)k8s之Service操作解析

    這篇文章主要為大家介紹了Go語言開發(fā)k8s之Service操作解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • Go語言文件開關(guān)及讀寫操作示例

    Go語言文件開關(guān)及讀寫操作示例

    這篇文章主要為大家介紹了Go語言文件開關(guān)及讀寫操作的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Golang 利用反射對(duì)結(jié)構(gòu)體優(yōu)雅排序的操作方法

    Golang 利用反射對(duì)結(jié)構(gòu)體優(yōu)雅排序的操作方法

    這篇文章主要介紹了Golang 利用反射對(duì)結(jié)構(gòu)體優(yōu)雅排序的操作方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-10-10

最新評(píng)論

江源县| 鄂尔多斯市| 大田县| 石林| 东丽区| 凭祥市| 英山县| 景德镇市| 宿松县| 尉氏县| 惠安县| 隆林| 筠连县| 鄱阳县| 吴桥县| 泸水县| 荥经县| 孟州市| 博野县| 吴堡县| 理塘县| 扎兰屯市| 贡嘎县| 新巴尔虎右旗| 承德市| 茌平县| 澄城县| 台前县| 白玉县| 西乌珠穆沁旗| 麟游县| 栾川县| 瑞丽市| 平定县| 泗水县| 长宁县| 同德县| 卢湾区| 成武县| 武穴市| 来凤县|