golang中的類型轉換那些事

由于golang是一門強類型的語言, 所以我們在golang的開發中不可避免的會對一些數據類型進行手動轉換,以適應我們的業務需求。?

golang中類型轉換的途徑大致有4種,強制轉換,類型斷言,類型匹配 還有使用strconv包中提供的轉換函數, 下面我們分別舉例說明。

1. 強制轉換? ?類型(變量名)

強制類型轉換一般用于對已知類型(非any類型)進行高低精度之間的轉換,如從 int 轉換為 int64, 或者 int轉換為 uint ,? float32轉換為 float64 這類的轉換, 這類型的轉換較為簡單,

  • 轉換語法類型(變量名)? ?
  • 語法說明:這里的類型即是你要轉換到的類型,變量名是你要轉換的變量名稱
  • 強制轉換示例
var? x1 int = 10 // 聲明一個int類型變量 x1 并賦值為 10x2 := uint64(x1) // 將x1強制轉換為uint64類型并賦值給x2
  • 細節說明:
  1. ?從高精度到低精度轉換會有丟失精度的風險;
  2. 對于any類型(即空接口類型interface{})的數據不能使用強制轉換。

2. 類型斷言? ?i變量名.(類型)

類型斷言一個專門用于any類型(也就是 interface{}空接口類型,他們是一個東西)的數據類型轉換的。?

語法:??i變量名.(類型)?

說明: 這里的 i變量名 指的就是你自己定義的interface{} 類型的變量名,注意必須是空接口類型,其他類型的變量名不能應用類型斷言!!

這里的 類型? ?則可以是任意的類型,包括內置類型,和你自己定義的結構體或者接口都可以繼續斷言。 當然 any 也可以作為這里的類型進行斷言的

類型斷言示例:


func ExampleTypeAsserts() {var ival1 interface{} = 1// 對變量 ival1 進行 int數據類型斷言, 斷言后可返回2個值, 第二個值表示是否斷言成功, 第一個是斷言成功后的斷言類型的值if int1, ok := ival1.(int); ok {fmt.Printf("%v 的類型是: %T \n", int1, int1) // output: 1 的類型是: int}// 如果你確定這個類型就是某個類型,斷言也可以只用一個變量接收, 這種情況下,如果斷言失敗,則會拋panic異常,所以這種方式要慎用!// int2 := ival1.(int64) // 這個就會拋異常 panic: interface conversion: interface {} is int, not int64int2 := ival1.(int) // okfmt.Printf("%v 的類型是: %T \n", int2, int2) // output: 1 的類型是: int// any 類型是interface{} 的一個別名 他們是一個東西var tsx anytsx = time.Now()// 對象斷言if ts,ok:=tsx.(time.Time);ok {// 這里ts就是斷言成功后的time類型的對象, 我們就可以調用他的方法 ts.Format(time.RFC3339)// 但是tsx 里面是不能直接調用time方法的, 雖然你知道你賦值了一個時間對象給他,這點一定要注意!!fmt.Printf("ts的類型為 %T , 值為: %v", ts, ts.Format(time.RFC3339)) // output: a}}

3. 類型匹配? i變量名.(type)

這個也是專門用于處理any類型的數據的, 需要注意的是?i變量名.(type) 只能用在 switch語句上面。 他用于對any類型的數據進行類型匹配和處理。 如我們需要對不同類型的變量進行不同的處理時就用它。

語法:? switch??i變量名.(type) {? case xxx:? ?}

說明: i變量名 這個和上面的一樣;?.(type) ?這時固定的用法,用于獲取i變量名對應的類型; 后面的case語句就是 定義不同類型時的處理邏輯的,case 后面的 xxx 這個是你要判斷的 類型,這里可以是任意的類型,包括內置類型或者你自己定義的類型或者接口

示例:


func ExampleTypeType() {var inter1 interface{}inter1 = 88.8 // 我們給這個變量 賦值一個float64類型的數, go里面對于否點數默認為 float64類型switch inter1.(type) {case int:fmt.Printf("inter1: %v 是int類型的數據", inter1) // 這個不會被執行case float64:fmt.Printf("inter1: %v 是float64類型的數據", inter1) // output: inter1: 88.8 是float64類型的數據case time.Time:fmt.Printf("inter1: %v 是time.Time類型的數據", inter1) // 這個也不會被執行}}

4.strconv提供的轉換函數

這個官方提供的包里面包含了非常多的轉換函數,其中較為常用的是ParseXXX, FormatXXX 和 Atoi, 和 Itoa, 他們的使用相對比較簡單,看看函數定義就可以使用。

strconv.Atoi("123") // 將字符串轉換為int

strconv.Itoa(456) //將int轉換為字符串

下面是strconv中所定義的函數一覽表

func AppendBool(dst []byte, b bool) []byte
func AppendFloat(dst []byte, f float64, fmt byte, prec, bitSize int) []byte
func AppendInt(dst []byte, i int64, base int) []byte
func AppendQuote(dst []byte, s string) []byte
func AppendQuoteRune(dst []byte, r rune) []byte
func AppendQuoteRuneToASCII(dst []byte, r rune) []byte
func AppendQuoteRuneToGraphic(dst []byte, r rune) []byte
func AppendQuoteToASCII(dst []byte, s string) []byte
func AppendQuoteToGraphic(dst []byte, s string) []byte
func AppendUint(dst []byte, i uint64, base int) []byte
func Atoi(s string) (int, error)
func CanBackquote(s string) bool
func FormatBool(b bool) string
func FormatComplex(c complex128, fmt byte, prec, bitSize int) string
func FormatFloat(f float64, fmt byte, prec, bitSize int) string
func FormatInt(i int64, base int) string
func FormatUint(i uint64, base int) string
func IsGraphic(r rune) bool
func IsPrint(r rune) bool
func Itoa(i int) string
func ParseBool(str string) (bool, error)
func ParseComplex(s string, bitSize int) (complex128, error)
func ParseFloat(s string, bitSize int) (float64, error)
func ParseInt(s string, base int, bitSize int) (i int64, err error)
func ParseUint(s string, base int, bitSize int) (uint64, error)
func Quote(s string) string
func QuoteRune(r rune) string
func QuoteRuneToASCII(r rune) string
func QuoteRuneToGraphic(r rune) string
func QuoteToASCII(s string) string
func QuoteToGraphic(s string) string
func QuotedPrefix(s string) (string, error)
func Unquote(s string) (string, error)
func UnquoteChar(s string, quote byte) (value rune, multibyte bool, tail string, err error)
type NumError
func (e *NumError) Error() string
func (e *NumError) Unwrap() error

總結:go語言中的類型轉換和我們常用的java, rust, c, php等語言的類型轉換可謂是完全不一樣,他使用了自己獨有的語法模式。對于新手而言前面3種模式很容易搞混淆,需要特別注意。 另外在進行類型斷言時 對于斷言后的結果他是可以有2個接收參數,也可以只有一個接收參數!搞清楚他們的區別很重要,這點需要特別注意。至于strconv包里面提供的函數的使用就太簡單了,大家自己看看函數原型就能用。

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

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

相關文章

[TensorFlow-Lite][深度學習]【快速簡介-1】

前言: 很多場景下面我們需要需要把我們的深度學習模型部署到Android,IOS 手機上面. Google 通過TensorFlow Lite 提供了對應的解決方案. 目錄: 端側部署優點 硬件支持 性能 應用案例 一 端側部署優點 1; 很多場景下面: 無網絡,數據無法…

Hadoop 遠程 debug

Hadoop 命令行 在執行 hadoop fs 命令行之前,先執行以下命令: export HADOOP_CLIENT_OPTS"-Xdebug -Xrunjdwp:transportdt_socket,servery,suspendy,address8000"

昇思25天學習打卡營第10天|基于MindSpore實現BERT對話情緒識別

基于MindSpore實現BERT對話情緒識別 模型簡介數據集模型構建模型驗證模型推理自定義推理數據集 模型簡介 BERT全稱是來自變換器的雙向編碼器表征量(Bidirectional Encoder Representations from Transformers),它是Google于2018年末開發并發…

HTML超鏈接和錨鏈接

HTML超鏈接和錨鏈接 一、定義 HTML的超鏈接&#xff08;Hyperlink&#xff09;用于在網頁之間創建鏈接&#xff0c;使用戶可以點擊這些鏈接來導航到其他頁面或資源。 二、基本語法 1、語法 HTML中的超鏈接使用a標簽來定義 <a href"URL">鏈接文本</a&g…

yolov8實戰——yolov8TensorRT部署(python推理)(保姆教學)

yolov8實戰——yolov8TensorRT部署&#xff08;python推理&#xff09;&#xff08;保姆教學&#xff09; 一 、準備好代碼和環境安裝TensorRt下載代碼和安裝環境 部署和推理構建ONNX構建engine無torch推理torch推理 最近用到yolov8&#xff0c;但是尋找了一圈才找到了yolov8最…

[SAP ABAP] 版本管理

版本管理是指軟件開發過程中各種程序代碼、配置文件以及說明文檔等文件變更的管理 生成版本 版本管理 對比版本 點擊上述版本管理即可進行版本對比操作 補充擴展 我們可以使用事務碼SE10對傳輸請求進行創建、修改、刪除、合并以及更改所有者等操作 使用事務碼SCC1進行不同cl…

3D生成模型TripoSR完美搭建流程,包含所有問題解決方案!

最近需要使用3D生成模型,無意中看到了TripoSR,覺得效果還行,于是打算在Linux系統上部署一下,結果遇到很多坑,在這里寫一下詳細的部署流程和部署過程中遇到的問題。 下面是TripoSR的源碼地址。 GitHub - VAST-AI-Research/TripoSRContribute to VAST-AI-Research/TripoSR…

java-Linkedlist源碼分析

## 深入分析 Java 中的 LinkedList 源碼 LinkedList 是 Java 集合框架中的一個重要類&#xff0c;它基于雙向鏈表實現&#xff0c;提供了高效的插入和刪除操作。與 ArrayList 不同&#xff0c;LinkedList 的結構使其在特定操作上有更優的性能表現。本文將詳細分析 LinkedList …

android 進程,線程調度的區別

一 分析&#xff1a; 進程和線程在調度上有什么不同呢&#xff1f;當有一個task去占用指定的資源時候叫進程&#xff0c;當有多個task去共享使用這些資源時候&#xff0c;這個task和之后的task都叫線程&#xff08;最初這個task叫主線程&#xff09;而linux調度主要調的就是cp…

【Portswigger 學院】文件上傳

教程和靶場來源于 Burpsuite 的官網 Portswigger&#xff1a;File upload vulnerabilities - PortSwigger 原理與危害 很多網站都有文件上傳的功能&#xff0c;比如在個人信息頁面允許用戶上傳圖片作為頭像。如果網站應用程序對用戶上傳的文件沒有針對文件名、文件類型、文件內…

前端基礎:JavaScript(篇一)

目錄 JavaScript概述 JavaScript歷史&#xff1a; 須知&#xff1a; 基本語法 變量 代碼 運行 數據類型 1、數值型(number)&#xff1a; 代碼 運行 2、布爾型(boolean)&#xff1a; 代碼 運行 3、字符串型&#xff1a; 代碼 運行 4、 undefined類型 代碼…

TCP的pop網絡模式

TCP的pop網絡模式 1、tcp連接的狀態有以下11種 CLOSED&#xff1a;關閉狀態LISTEN&#xff1a;服務端狀態&#xff0c;等待客戶端發起連接請求SYN_SENT&#xff1a;客戶端已發送同步連接請求&#xff0c;等待服務端相應SYN_RECEIVED&#xff1a;服務器收到客戶端的SYN請請求&…

MySQL 基本語法講解及示例(下)

第六節&#xff1a;如何檢索資料 在本節中&#xff0c;我們將介紹如何使用SQL語句檢索數據庫中的資料&#xff0c;具體包括選擇特定列、排序、條件過濾以及組合排序等操作。我們以一個名為student的表格為例&#xff0c;演示不同的檢索方法。 初始表格 student student_idname…

修復harbor的/account/sign-in\?globalSearch=b不登錄可以查詢鏡像的問題

Nginx的location指令不能直接匹配查詢參數&#xff0c;所以需要通過其他方式來處理。這里是一個使用if指令結合查詢參數來實現的方法。該方法會在請求路徑中帶有特定查詢參數時返回404。 使用if指令匹配查詢參數 打開Nginx配置文件&#xff1a; sudo vim /etc/nginx/sites-ava…

Python中frozenset,秒變不可變集合,再也不用擔心多線程了!

目錄 1、Frozenset基礎介紹 ?? 1.1 Frozenset定義與創建 1.2 不可變集合特性 1.3 與Set的區別對比 2、Frozenset操作實踐 ?? 2.1 初始化與添加元素嘗試 2.2 成員測試: in & not in 2.3 集合運算: 并集、交集、差集 2.4 使用場景示例: 字典鍵、函數參數默認值 …

登錄設計(實戰項目)-1個手機號多用戶身份登錄

一. 背景&#xff1a; 該需求是一個互聯網醫院的預約單場景&#xff0c;護士在小程序上申請患者查房預約單&#xff0c;醫生在小程序上對預約單進行接單&#xff0c;護士開始查房后填寫查房小結&#xff0c;客戶需要對用戶信息進行授權&#xff0c;醫生查房后進行簽字&#xff…

勁爆!華為享界兩款新車曝光,等等黨有福了

文 | AUTO芯球 作者 | 雷慢 勁爆啊&#xff0c;北汽的一份環境影響分析報告&#xff0c; 不僅曝光了享界S9的生產進展&#xff0c; 還泄露了自家的另兩款產品&#xff0c; 第一款是和享界S9同尺寸的旅行車&#xff0c; 我一看&#xff0c;這不是我最喜歡的“瓦罐”嗎&…

v-html 空格/換行不生效

接口返回的內容如下&#xff1a;有空格有換行&#xff0c;但 使用v-html無效 需加css樣式 white-space: pre-wrap; <div class"pretty-html" v-html"Value"></div>.pretty-html {white-space: pre-wrap; /* 保留空格和換行&#xff0c;并允許…

掌握麥肯錫精英的6個技巧,你也能成為1%的精英!

不知道大家有沒有想過&#xff0c;我們和那些全球頂尖精英的差距可能只有1%&#xff0c;只是99%的人還不知道這件事。 今天給大家推薦一本好書&#xff0c;《你和麥肯錫精英的差別只有1%》。優思學院發現&#xff0c;在我們的六西格瑪、精益管理的學生中很多人對自己沒有自信。…

軟通動力子公司鴻湖萬聯最新成果SwanLink AI亮相世界人工智能大會

7月4日&#xff0c;2024世界人工智能大會暨人工智能全球治理高級別會議&#xff08;WAIC 2024&#xff09;在上海拉開帷幕&#xff0c;軟通動力董事長兼首席執行官劉天文受邀出席開幕式。其間&#xff0c;軟通動力攜子公司鴻湖萬聯深度參與到大會各項活動中&#xff0c;并全面展…