2023年9月26日 Go生態洞察:深入解析類型參數


🌷🍁 博主貓頭虎(🐅🐾)帶您 Go to New World?🍁

🦄 博客首頁——🐅🐾貓頭虎的博客🎐
🐳 《面試題大全專欄》 🦕 文章圖文并茂🦖生動形象🐅簡單易學!歡迎大家來踩踩~🌺
🌊 《IDEA開發秘籍專欄》 🐾 學會IDEA常用操作,工作效率翻倍~💐
🌊 《100天精通Golang(基礎入門篇)》 🐅 學會Golang語言,暢玩云原生,走遍大小廠~💐

🐅🐾貓頭虎建議Go程序員必備技術棧一覽表📖:

??🐳 Go語言開發者必備技術棧??:
🐹 GoLang | 🌿 Git | 🐳 Docker | ?? Kubernetes | 🔧 CI/CD | ? Testing | 💾 SQL/NoSQL | 📡 gRPC | ?? Cloud | 📊 Prometheus | 📚 ELK Stack


🪁🍁 希望本文能夠給您帶來一定的幫助🌸文章粗淺,敬請批評指正!🐅🐾🍁🐥


在這里插入圖片描述

文章目錄

    • 🐅🐾貓頭虎建議Go程序員必備技術棧一覽表📖:
  • 2023年9月26日 Go生態洞察:深入解析類型參數
    • 🐾 正文內容
      • 🐈 `slices`包函數簽名
      • 🐈 簡單的克隆實現
      • 🐈 靈活的克隆實現
      • 🐈 底層類型約束
      • 🐈 類型推斷
      • 🐈 類型參數的解構
    • 🐾 總結
  • 原創聲明

  • 原創作者: 貓頭虎

  • 作者wx: Libin9iOak

  • 作者公眾號: 貓頭虎技術團隊

在這里插入圖片描述

2023年9月26日 Go生態洞察:深入解析類型參數

🐾 摘要
大家好,我是貓頭虎,今天我們要探討的是Go語言中類型參數的構造和使用。通過深入分析slices.Clone函數,我們將理解類型參數在Go泛型中的作用和重要性。這不僅是一個技術深度話題,而且對于深入理解Go語言的泛型系統至關重要。

🐾 引言
在Go 1.18的引入泛型之后,類型參數成為了Go語言的一個新亮點。它們提供了編寫更加靈活和可復用代碼的能力。本文將通過Clone函數的例子,展示如何有效地使用類型參數來增強代碼的通用性和靈活性。


🐾 正文內容

🐈 slices包函數簽名

Clone函數非常簡單:它可以復制任何類型的切片。

func Clone[S ~[]E, E any](s S) S {return append(s[:0:0], s...)
}

這個函數之所以有效,是因為對零容量的切片進行追加操作會分配一個新的底層數組。函數體實際上比函數簽名更短,這部分是因為體本身簡短,但也因為簽名較長。接下來,我們將解釋為什么簽名是這樣寫的。

🐈 簡單的克隆實現

我們首先編寫一個簡單的通用Clone函數。這并不是slices包中的那一個。我們希望接受任何元素類型的切片,并返回一個新切片。

func Clone1[E any](s []E) []E {// body omitted
}

泛型函數Clone1有一個類型參數E。它接受一個類型為E的切片參數s,并返回同類型的切片。這個簽名對熟悉Go中泛型的人來說很直接。

然而,這里有一個問題。在Go中,命名的切片類型不常見,但人們確實會使用它們。

// MySlice 是一個具有特殊String方法的字符串切片。
type MySlice []string// String 返回MySlice值的可打印版本。
func (s MySlice) String() string {return strings.Join(s, "+")
}

假設我們想要復制一個MySlice,然后獲取其排序后的可打印版本。

func PrintSorted(ms MySlice) string {c := Clone1(ms)slices.Sort(c)return c.String() // 編譯失敗
}

不幸的是,這不起作用。編譯器報告錯誤:

c.String undefined (type []string has no field or method String)

🐈 靈活的克隆實現

為了解決這個問題,我們必須編寫一個版本的Clone,它返回與其參數相同的類型。如果我們做到了這一點,那么當我們用MySlice類型的值調用Clone時,它將返回MySlice類型的結果。

我們知道它應該是這樣的:

func Clone2[S ?](s S) S // 無效

這個Clone2函數返回與其參數相同類型的值。

🐈 底層類型約束

如錯誤消息所示,答案是添加一個~

func Clone5[S ~[]E, E any](s S) S

再次強調,用[S []E, E any]這樣的類型參數和約束表示,意味著S的類型參數可以是任何未命名的切片類型,但

不能是定義為切片字面量的命名類型。用[S ~[]E, E any],加上~,意味著S的類型參數可以是任何底層類型為切片類型的類型。

🐈 類型推斷

現在我們已經解釋了slices.Clone的簽名,讓我們看看如何通過類型推斷簡化對slices.Clone的使用。

func Clone[S ~[]E, E any](s S) S

調用slices.Clone時,將傳遞一個切片給參數s。類型推斷將允許編譯器推斷出類型參數S是傳遞給Clone的切片的類型。然后,類型推斷足夠強大,可以看出E的類型參數是傳遞給S的類型參數的元素類型。

🐈 類型參數的解構

我們在這里使用的一般技術,即使用另一個類型參數E定義一個類型參數S,是一種在泛型函數簽名中解構類型的方法。通過解構類型,我們可以命名并約束類型的所有方面。

例如,這是maps.Clone的簽名:

func Clone[M ~map[K]V, K comparable, V any](m M) M

就像slices.Clone一樣,我們使用一個類型參數來表示參數m的類型,然后使用另外兩個類型參數KV來解構該類型。

maps.Clone中,我們將K約束為可比較的,因為這是映射鍵類型所必需的。我們可以根據喜好約束組成類型。

func WithStrings[S ~[]E, E interface { String() string }](s S) (S, []string)

這表示WithStrings的參數必須是一個切片類型,其元素類型具有String方法。

由于所有Go類型都可以從組成類型構建,我們總是可以使用類型參數來解構這些類型,并根據我們的喜好對它們進行約束。


🐾 總結

總的來說,類型參數在Go泛型中扮演著至關重要的角色。通過精心設計的函數簽名和有效利用類型推斷,我們可以編寫更靈活、更通用的代碼。希望這篇文章能幫助你更好地理解Go中的泛型。這篇文章由貓頭虎的Go生態洞察專欄收錄,更多詳情請點擊這里。

關鍵點描述
類型參數使用使用類型參數構建靈活通用的函數
slices.Clone分析分析Clone函數的類型參數和其用法
底層類型約束理解底層類型的約束和它們的應用
類型推斷探索類型推斷在泛型編程中的作用

下一篇預告: 下一篇文章將深入探討Go語言中的類型推斷——《關于類型推斷的一切——還有更多》。我們將繼續深入泛型編程的精髓,探索類型推斷如何簡化我們的編碼過程。敬請期待!�

在這里插入圖片描述

原創聲明

======= ·

  • 原創作者: 貓頭虎

  • 作者wx: Libin9iOak
    在這里插入圖片描述

  • 作者公眾號: 貓頭虎技術團隊

在這里插入圖片描述

學習復習Go生態
???

本文為原創文章,版權歸作者所有。未經許可,禁止轉載、復制或引用。

作者保證信息真實可靠,但不對準確性和完整性承擔責任

未經許可,禁止商業用途。

如有疑問或建議,請聯系作者。

感謝您的支持與尊重。

點擊下方名片,加入IT技術核心學習團隊。一起探索科技的未來,洞察Go生態,共同成長。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/210488.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/210488.shtml
英文地址,請注明出處:http://en.pswp.cn/news/210488.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2023第十二屆“認證杯”D題:CMOS黃昏系數|數學中國數學建模國際賽(小美賽)| 建模秘籍文章代碼思路大全

鐺鐺!小秘籍來咯! 小秘籍希望大家都能輕松建模呀,數維杯也會持續給大家放送思路滴~ 抓緊小秘籍,我們出發吧~ 來看看認證杯(D題)! 完整內容可以在文章末尾領取! 問題重述&#x…

【小紅書運營指南1】賽道選擇 + 賬號運營全周期

小紅書運營指南1 寫在最前面11.23標簽一級標簽二級標簽 網絡資源整理1. 賽道選擇近2年小紅書女性人群畫像 2. 基礎認知階段3. 賬號啟動階段4. 選題規劃階段5. 爆款打造階段6. 漲粉變現階段漲粉變現階段粉絲發展階段 寫在最前面 最近做的一個項目調研,調研和實際有一…

每日移到算法題 1

借鑒文章:Java-敏感字段加密 - 嗶哩嗶哩 題目描述 給定一個由多個命令字組成的命令字符串; 1、字符串長度小于等于127字節,只包含大小寫字母,數字,下劃線和偶數個雙引號 2、命令字之間以一個或多個下劃線_進行分割…

設計模式-工廠模式(Factory)

Factory模式是一種創建型設計模式&#xff0c;用于封裝對象的實例化過程。它提供了一個統一的接口來創建不同類型的對象&#xff0c;而無需暴露具體的實例化邏輯給客戶端。 #include <iostream> #include <memory>// AbstractProduct&#xff08;抽象產品類&#…

mybatis-plus處理blob字段

轉載自&#xff1a;www.javaman.cn 在 Spring Boot 項目中使用 MyBatis-Plus 處理 longblob 字段時&#xff0c;我們可以按照以下步驟進行操作。假設 longblob 存儲的是字符串數據。以下是完整的示例代碼&#xff1a; 添加依賴&#xff1a;在你的項目的 pom.xml 文件中添加 My…

js判斷上傳的文件是GBK編碼還是UTF-8

1、獲取文件二進制數據&#xff0c;這里只做示例&#xff0c;例如element-ui中文件上傳的beforeUpload方法&#xff0c;返回的file對象&#xff0c;然后使用FileReader對其進行轉換&#xff0c;再進行后續判斷 function beforeUpload(file: File) { const reader new FileRea…

Linux基本指令(超詳版)

Linux基本指令&#xff08;超詳版&#xff09; 1. ls指令2.pwd指令3. cd 指令4.touch指令5mkdir指令6.rmdir指令&&rm指令7.man指令7.cp指令8.mv指令9.echo指令10.cat指令11.more指令12.less指令13.head指令14.tail指令15.date指令16.find指令17.grep指令zip(打包壓縮) …

JVM類加載器ClassLoader的源碼分析

1、ClassLoader與現有類加載器的關系 ClassLoader與現有類加載器的關系&#xff1a; ClassLoader是一個抽象類。如果我們給定了一個類的二進制名稱&#xff0c;類加載器應嘗試去定位或生成構成定義類的數據。一種典型的策略是將給定的二進制名稱轉換為文件名&#xff0c;然后去…

C語言--實現一個函數把一個整數轉為它對應的十六進制的字符串

一.題目描述 實現一個函數把一個整數轉為它對應的十六進制的字符串。 比如&#xff1a;輸入數字1234 輸出&#xff1a;4D2 二.思路分析 用一個sprintf函數可以解決問題&#xff0c;輸出相對應的字符串 要注意的問題就是&#xff1a;函數結束后要繼續使用的內存&#xff08;比如…

Carla自動駕駛仿真六:pygame多個車輛攝像頭畫面拼接

此文章主要介紹carla前后左右攝像頭畫面拼接到pygame上 文章目錄 前言一、要點分析二、完整代碼三、拼接效果四、總結 前言 1、使用carla做仿真測試或者開發時&#xff0c;如果能夠將車輛周邊的畫面拼接并渲染&#xff0c;可以直觀地查看周圍地環境&#xff0c;便于調試。本文…

Spring Boot 工廠模式 + 抽象類 + 泛型干掉重復代碼

業務場景&#xff1a;N個Excel導入&#xff0c;實現動態加載&#xff0c;只需要定義Excel實體&#xff0c;即可實現功能開發&#xff0c; 核心代碼 import cn.afterturn.easypoi.excel.annotation.ExcelTarget; import cn.hutool.core.annotation.AnnotationUtil; import cn.h…

刪除Windows系統中無用的隱藏設備

一些即插即用設備會占用一些隱藏的系統資源&#xff0c;比如USB轉串口的設備會占用COM號碼&#xff0c;網卡會占用靜態IP地址等等。 通常我們使用設備管理器的顯示隱藏設備功能&#xff0c;來刪除這些設備。但是設備管理器每次只允許刪除一個設備&#xff0c;如果設備太多了&a…

【算法集訓】基礎數據結構:四、棧

棧理解了兩天&#xff0c;所以遲了一天發。 一、棧的概念 棧是一個容器&#xff0c;是一個先進后出的線性表&#xff0c;類似與日常生活中的電梯、杯子等。 僅限在表尾部進行插入和刪除操作。 使用鏈表來模擬棧&#xff1a; typedef int DataType; 相當于給int起一個別名 st…

Go 協程基礎:輕松入門并發編程,解析 Goroutines 的奧秘

一、協程基本使用 1、啟動一個協程 主線程中每個100毫秒打印一次&#xff0c;總共打印2次另外開啟一個協程&#xff0c;打印10次情況一&#xff1a;打印是交替&#xff0c;證明是并行的情況二&#xff1a;開啟的協程打印2次&#xff0c;就退出了&#xff08;因為主線程退出了…

做題筆記:SQL Sever 方式做牛客SQL的題目--SQL157

----SQL157 平均播放進度大于60%的視頻類別 計算各類視頻的平均播放進度&#xff0c;將進度大于60%的類別輸出。 注&#xff1a; 播放進度播放時長視頻時長*100%&#xff0c;當播放時長大于視頻時長時&#xff0c;播放進度均記為100%。 結果保留兩位小數&#xff0c;并按播放進…

基于ssm的學生公寓管理中心系統的設計與實現論文

摘 要 現代經濟快節奏發展以及不斷完善升級的信息化技術&#xff0c;讓傳統數據信息的管理升級為軟件存儲&#xff0c;歸納&#xff0c;集中處理數據信息的管理方式。本學生公寓管理中心系統就是在這樣的大環境下誕生&#xff0c;其可以幫助管理者在短時間內處理完畢龐大的數據…

[報錯]記錄IDEA遠程開發報錯:java: Cannot run program.....

報錯內容 IDEA在進行遠程開發的時候報錯&#xff0c;內容如下&#xff1a; java: Cannot run program "/usr/lib/jvm/java-1.8.0-openjdk-amd64/bin/java" (in directory "/home/jim/.cache/JetBrains/RemoteDev-IU/_home_jim_DevCodes_Github_zfile/compile-…

redis主從復制【面試必看】

在分布式系統中&#xff0c;希望使用多個服務器來部署redis&#xff0c;存在以下幾種redis的部署方式 主從模式主從哨兵集群模式 主從模式 在若干個redis節點中&#xff0c;有的是主節點&#xff0c;有的是從節點 假設有三個物理服務器&#xff08;稱為是三個節點&#xff…

(JSP)EL——優化登錄界面,獲取對象,獲取數據

EL優化登錄界面 <% page language"java" import"java.util.*" pageEncoding"UTF-8"%> <% String path request.getContextPath(); String basePath request.getScheme()"://"request.getServerName()":"reques…

生產工序(oj題)

很有趣的一道題 關鍵在于固定工序的整合 看樣例是固定工序中間是不能插入其他工序的&#xff08;也不講清楚&#xff09;&#xff0c;如果可以的話&#xff0c;只能說可能會更麻煩 注意固定工序是按照固定工序中的第一個工序進行排序的 整合完之后&#xff0c;就是遞歸列出…