Golang 語言的編程技巧之類型

1、介紹

? ? ? ? Golang 語言是一門靜態類型的編程語言,我們在編寫代碼時,為了提升代碼的靈活性,有時會使用空接口類型,對于空接口類型的變量,一般會通過類型斷言判斷變量的類型,而且可能還會遇到遇到類型轉換的場景,下面我們對類型的斷言、類型轉換和類型選擇。

2、編程技巧

? ? ? ? 類型斷言,類型端要提供了訪問接口類型值的底層具體值的方式,這是需要注意的是被類型斷言的值必須是接口類型的值,類型斷言返回兩個值,被斷言的接口類型值的底層具體值和一個表示是否斷言成功的布爾類型的值。

t,ok := i.(T)

? ? ? ? 未使用類型斷言:

func main() {id := getVal(1)fmt.Println(id)
}func getVal(val interface{}) interface{} {return val
}

? ? ? ? 使用類型斷言:

func main() {id := getVal(1)id, ok := id.(int);if !ok {err := errors.New("illegal paramter")fmt.Println(err)return}fmt.Println(id)
}func getVal(val interface{}) interface{} {return val
}

? ? ? ? 閱讀上面這兩段代碼,main 函數中都是通過調用getVal()函數,使用類型推斷的方式給變量id 賦值,不同的是main 函數,第一段代碼中未使用類型斷言,第二段代碼中使用了類型斷言,所以第一代碼的main 函數如果調用 getVa()函數時傳遞非整型參數,也可以正常輸出;第二段代碼的main 函數如果調用 getVal() 函數時傳遞非整型參數,將會被斷言代碼攔截。

? ? ? ?類型轉換:

? ? ? ? 類型轉換的表達式T(v),將v 轉換為類型T 。關于類型轉換,我們需要注意的“坑”如下所示:

? ? ? ? 整型之間的轉換:

func main() {var a inta = 128b := int8(a)fmt.Println(b)
}

? ? ? ?輸出結果:-128

? ? ? ? 閱讀上面這段代碼, int 類型的變量 a 賦值為128 ,將變量a 轉換為int8 類型的變量b , 輸出變量b 的結果是 -128 ,原因是int 類型和 int8 類型的取值范圍不同。

? ? ? ? 浮點型轉為整形:

import "fmt"func main() {var a float64a = 3.1415926b := int(a)fmt.Println(b)
}

? ? ? ? 輸出結果:3

? ? ? ? 浮點型float64的變量a, 轉換為int 類型的變量b ,輸出結果是3,變量a 值的小數部分被截掉了。

????????整型轉換為字符串類型:

import "fmt"func main() {var a inta = -1b := string(a)fmt.Println(b)
}

? ? ? ? 輸出結果:�

????????int 類型變量 a,轉換為 string 類型變量 b,變量 b 的輸出結果是?,表示未知字符,原因是 Unicode 碼點(code point)中沒有 -1。

? ? ? ? 字符串類型和切片(字節切片和字符切片)類型相互轉換:

import "fmt"func main() {var a stringa = "編程"b := []byte(a)fmt.Println(b)c := []rune(a)fmt.Println(c)
}

? ? ? ?輸出結果:

????????[231 188 150 231 168 139]
[32534 31243]

? ? ? ? 將字符串類型的變量a 分別轉換為字節切片類型變量b 和字符切片類型變量c,它們的輸出結果不同,原因是UTF-8 編碼一個中文漢字是3個字節,3個字節代表1個字符 。而字符切片類型的元素本身就是Unicode 字符。

????????類型選擇:

func main() {var a interface{}a = falseswitch val := a.(type) {case int:fmt.Printf("val:%d type:%T\n", val, val)case string:fmt.Printf("val:%d type:%T\n", val, val)default:fmt.Printf("unknowtype:%T\n", val)}
}

? ? ? ? 這段代碼使用的 type swtich 判斷空接口類型變量a 的實際數據類型是否為我們預定義的類型之一。

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

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

相關文章

計數組合學7.11(RSK算法)

7.11 RSK算法 在對稱函數理論中,有一個非凡的組合對應關系,稱為RSK算法。(關于縮寫RSK的含義以及其他名稱,請參閱本章末尾的注釋。)這里我們僅介紹RSK算法的最基本性質,從而能夠給出舒爾函數一些基本性質的…

國產嵌入式調試器之光? RT-Trace 初體驗!

做過嵌入式開發的工程師肯定都知道有這么個玩意兒 —— J-Trace,與我們日常使用的普通調試器不同點在于,它在基本的下載/調試代碼之上還具有非常強大的代碼運行跟蹤能力,從而實現代碼覆蓋率的分析、指令回溯、CPU 資源監控等一系列強大的功能…

SLAM中的非線性優化-2D圖優化之零空間實戰(十六)

終于有時間更新實戰篇了,本節實戰幾乎包含了SLAM后端的所有技巧,其中包括:舒爾補/先驗Factor/魯棒核函數/FEJ/BA優化等滑動窗口法的相關技巧,其中構建2D輪式里程計預積分以及絕對位姿觀測的10幀滑動窗口,并邊緣化最老幀…

知識隨記-----Qt 實戰教程:使用 QNetworkAccessManager 發送 HTTP POST

文章目錄Qt 網絡編程:使用 QNetworkAccessManager 實現 HTTP POST 請求概要整體架構流程技術名詞解釋技術細節注意事項:Qt 網絡編程:使用 QNetworkAccessManager 實現 HTTP POST 請求 概要 本文介紹如何使用 Qt 框架的網絡模塊(…

wordpress批量新建產品分類

1、下載安裝插件:bulk-category-import-export2、激活插件后,左側點擊插件下的導入,選擇product categories,點擊下一步3、這里可以選擇導入的分類列表文件,可以選擇分隔符,CSV文件默認為‘,’要…

CentOS 鏡像源配置與 EOL 后的應對策略

引言 本文將詳細介紹如何使用 阿里云開源鏡像站 配置 CentOS 的各類軟件源,包括基礎源、歷史歸檔源(vault)、ARM 架構源、Stream 版本以及調試信息源(debuginfo),并重點講解在 CentOS 8 停止維護后&#x…

CTF實戰:用Sqlmap破解表單輸入型SQL注入題(輸入賬號密碼/usernamepassword)

目錄 引言 步驟1:用Burp Suite捕獲表單請求 步驟2:用Sqlmap獲取數據庫名稱 參數解釋: 輸出示例(根據題目環境調整): 步驟3:獲取目標數據庫中的表名 參數解釋: 輸出示例&#…

質數時間(二分查找)

題目描述如果把一年之中的某個時間寫作 a 月 b 日 c 時 d 分 e 秒的形式,當這五個數都為質數時,我們把這樣的時間叫做質數時間,現已知起始時刻是 2022 年的 a 月 b 日 c 時 d 分 e 秒,終止時刻是 2022 年的 u 月 v 日 w 時 x 分 y…

Python訓練Day29

浙大疏錦行 類的裝飾器裝飾器思想的進一步理解:外部修改、動態類方法的定義:內部定義和外部定義

新手DBA實戰指南:如何使用gh-ost實現MySQL無鎖表結構變更

新手DBA實戰指南:如何使用gh-ost實現MySQL無鎖表結構變更 作為DBA,大表結構變更(DDL)一直是令人頭疼的問題。傳統的ALTER TABLE操作會鎖表,嚴重影響業務連續性;而常見的pt-online-schema-change工具雖然能實現在線變更,但依賴觸發器機制,在高并發場景下性能表現不佳。本…

OSPF綜合

一、實驗拓撲二、實驗需求1、R4為ISP,其上只配置IP地址;R4與其他所直連設備間均使用公有IP; 2、R3-R5、R6、R7為MGRE環境,R3為中心站點; 3、整個OSPF環境IP基于172.16.0.0/16劃分;除了R12有兩個環回&#x…

技術面試知識點詳解 - 從電路到編程的全棧面經

技術面試知識點詳解 - 從電路到編程的全棧面經 目錄 模擬電路基礎數字電路原理電源設計相關編程語言基礎數據庫與并發網絡協議基礎算法與數據結構 模擬電路基礎 1. 放大電路類型判斷 這是模擬電路面試的經典題目,通過電壓放大倍數判斷放大電路類型: …

LangGraph認知篇-Command函數

Command簡述 在 LangGraph 中,Command 是一個極具實用性的功能,它能夠將控制流(邊)和狀態更新(節點)巧妙地結合起來。這意味著開發者可以在同一個節點中,既執行狀態更新操作,又決定下…

【目標檢測】小樣本度量學習

小樣本度量學習(Few-Shot Metric Learning)通常用于分類任務?(如圖像分類),但它也可以與目標檢測(Object Detection)結合,解決小樣本目標檢測(Few-Shot Object Detectio…

cmd怎么取消關機命令

在 Windows 的命令提示符(CMD)中取消已計劃的關機操作,可以通過 shutdown 命令的 ?**-a**? 參數實現。以下是具體步驟:?操作方法??打開 CMD?按下 Win R 組合鍵,輸入 cmd 并回車,打開命令提示符窗口。…

網易云音樂硬剛騰訊系!起訴SM娛樂濫用市場支配地位

企查查APP顯示,近日,法院公開杭州樂讀科技有限公司、杭州網易云音樂科技有限公司起訴SM ENTERTAINMENT CO. 、卡斯夢(上海)文化傳播有限公司等開庭信息,案由涉及濫用市場支配地位糾紛。公告顯示,該案件計劃…

[css]切角

使用css實現一個切角的功能&#xff0c;有以下幾種方案&#xff1a; <div class"box"></div>方案一&#xff1a;linear-gradient linear-gradient配合backgroud-image可以實現背景漸變的效果。linear-gradient的漸變過渡區的占比是總的空間&#xff08;高…

分享一個可以測試離線服務器性能的腳本

在日常運維工作中&#xff0c;經常會遇到系統性能莫名跟不上業務需求的情況&#xff1a;服務器響應變慢、應用加載卡頓、資源占用異常飆升等問題頻繁出現&#xff0c;卻難以快速問題根源究竟在CPU過載、內存泄漏、磁盤I/O阻塞還是網絡帶寬瓶頸。這種時候&#xff0c;特別需要一…

Python Pandas.unique函數解析與實戰教程

Python Pandas.unique 函數解析與實戰教程 摘要 本文章旨在全面地解析 pandas 庫中的 unique 函數。pandas.unique 是一個用于從一維數組型(array-like)對象中提取唯一值的高效工具。我們將從其核心功能、函數簽名、參數詳解、返回值類型,到關鍵行為特性(如順序保留、缺失…

排序算法入門:直接插入排序詳解

這里寫目錄標題介紹原理代碼實現分析介紹 直接插入排序是一種簡單直觀的排序算法&#xff0c;適用于小規模數據或基本有序的數據集。其核心思想是構建有序序列&#xff0c;對于未排序數據&#xff0c;在已排序序列中從后向前掃描&#xff0c;找到相應位置并插入。 原理 我們…