」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > Go 中型別轉換與轉換的綜合指南

Go 中型別轉換與轉換的綜合指南

發佈於2024-08-30
瀏覽:912

A Comprehensive Guide to Type Casting and Conversions in Go

Go,也稱為 Golang,是一種靜態型別語言。這意味著每個變數的類型在編譯時都是已知的,從而為程式碼提供安全性和可預測性。但是,這也要求從一種類型到另一種類型的任何轉換都是明確且經過深思熟慮的。在本文中,我們將探討 Go 中可用的各種類型轉換和轉換機制,從基本的數值轉換到更複雜的介面和指標轉換。

1. 基本型別轉換

Go 允許在整數、浮點數和字串等基本類型之間進行轉換,但這些轉換必須明確完成。

數字類型

不同數字類型之間的轉換很簡單,但必須明確:

var i int = 42
var f float64 = float64(i)  // int to float64
var u uint = uint(i)        // int to uint

在此範例中,我們將 int 轉換為 float64 和 uint。這些轉換是明確的,因為 Go 不執行自動(隱式)類型轉換。

字串和位元組切片

Go 字串是不可變的,但它們可以與位元組切片 ([]byte) 相互轉換,而位元組切片 ([]byte) 是可變的:

var s string = "hello"
var b []byte = []byte(s)   // string to []byte
var s2 string = string(b)  // []byte to string

同樣,可以在字串和符文切片([]rune)之間進行轉換,其中符文是 int32 的類型別名:

var r []rune = []rune(s)   // string to []rune
var s3 string = string(r)  // []rune to string

2. 自訂類型轉換

在Go中,您可以基於現有類型定義自己的類型。自訂類型與其基礎類型之間的轉換是明確的:

type MyInt int
var i int = 10
var mi MyInt = MyInt(i)   // int to MyInt
var i2 int = int(mi)      // MyInt to int

此明確轉換對於確保編譯器可以驗證程式碼的安全性是必要的。

3. 指針轉換

Go中的指標引用變數的記憶體位址。您可以在值與其指標之間進行轉換:

var x int = 42
var p *int = &x     // int to *int (pointer to int)
var y int = *p      // *int to int (dereferencing)

4. 介面類型轉換

Go中的介面用來定義一組方法。您可以在具體類型和介面之間進行轉換:

var a interface{} = 42    // int to interface{}
var b int = a.(int)       // interface{} to int (type assertion)

型態斷言

型別斷言提供對介面具體值的存取:

if v, ok := a.(int); ok {
    fmt.Println("a is an int:", v)
}

類型開關

類型開關可讓您根據介面的動態類型執行不同的操作:

switch v := a.(type) {
case int:
    fmt.Println("a is an int:", v)
case string:
    fmt.Println("a is a string:", v)
default:
    fmt.Println("a is of unknown type")
}

5. 不安全的轉換

unsafe 套件讓你繞過 Go 的型別安全,從而實現非法的轉換:

import "unsafe"

var i int = 42
var p *int = &i
var fp *float64 = (*float64)(unsafe.Pointer(p))  // *int to *float64

警告:應謹慎使用不安全的轉換,並且僅在絕對必要時使用,因為它們可能導致未定義的行為。

6. 通道類型轉換

通道是 Go 中的一個強大功能,允許 goroutine 之間進行通訊。您可以在雙向和單向通道之間進行轉換:

ch := make(chan int)
var sendOnlyChan chan



7. 結構體和陣列轉換

具有相同佈局的結構體或陣列之間的轉換需要明確轉換:

type Point struct {
    X, Y int
}

type Coord struct {
    X, Y int
}

var p Point = Point{1, 2}
var c Coord = Coord(p)  // Convert Point to Coord (same field types)

8. 切片轉換

切片是對數組的引用,雖然您可以在相同類型的切片之間進行轉換,但不同類型的切片之間的轉換需要明確轉換:

var a []int = []int{1, 2, 3}
var b []int = a[1:]  // Convert a slice to another slice of the same type

9. 零介面轉換

Go 中的 nil 值可以指派給任何介面類型:

var x interface{} = nil
var y error = nil

10. 函數型別轉換

Go 函數可以轉換為不同類型,只要簽章相容:

type FuncType func(int) int

func square(x int) int {
    return x * x
}

var f FuncType = FuncType(square)  // Convert function to FuncType

11. 數組到切片的轉換

可以從數組建立切片,它本質上是對數組的引用:

var arr [5]int = [5]int{1, 2, 3, 4, 5}
var sl []int = arr[:]  // Convert array to slice

結論

Go 中的型別轉換和轉換在設計上是明確的,使程式碼更安全、更容易理解。透過要求明確轉換,Go 有助於防止隱式類型強制可能產生的微妙錯誤,這在其他一些程式語言中很常見。理解這些轉換並正確使用它們對於編寫健全且高效的 Go 程式至關重要。

版本聲明 本文轉載於:https://dev.to/zakariachahboun/a-comprehensive-guide-to-type-casting-and-conversions-in-go-26di?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • FastAPI自定義404頁面創建指南
    FastAPI自定義404頁面創建指南
    response = await call_next(request) if response.status_code == 404: return RedirectResponse("https://fastapi.tiangolo.com") else: ...
    程式設計 發佈於2025-07-09
  • Python讀取CSV文件UnicodeDecodeError終極解決方法
    Python讀取CSV文件UnicodeDecodeError終極解決方法
    在試圖使用已內置的CSV模塊讀取Python中時,CSV文件中的Unicode Decode Decode Decode Decode decode Error讀取,您可能會遇到錯誤的錯誤:無法解碼字節 在位置2-3中:截斷\ uxxxxxxxx逃脫當CSV文件包含特殊字符或Unicode的路徑逃...
    程式設計 發佈於2025-07-09
  • 如何實時捕獲和流媒體以進行聊天機器人命令執行?
    如何實時捕獲和流媒體以進行聊天機器人命令執行?
    在開發能夠執行命令的chatbots的領域中,實時從命令執行實時捕獲Stdout,一個常見的需求是能夠檢索和顯示標準輸出(stdout)在cath cath cant cant cant cant cant cant cant cant interfaces in Chate cant inter...
    程式設計 發佈於2025-07-09
  • 您如何在Laravel Blade模板中定義變量?
    您如何在Laravel Blade模板中定義變量?
    在Laravel Blade模板中使用Elegance 在blade模板中如何分配變量對於存儲以後使用的數據至關重要。在使用“ {{}}”分配變量的同時,它可能並不總是最優雅的解決方案。 幸運的是,Blade通過@php Directive提供了更優雅的方法: $ old_section =...
    程式設計 發佈於2025-07-09
  • 您可以使用CSS在Chrome和Firefox中染色控制台輸出嗎?
    您可以使用CSS在Chrome和Firefox中染色控制台輸出嗎?
    在javascript console 中顯示顏色是可以使用chrome的控制台顯示彩色文本,例如紅色的redors,for for for for錯誤消息? 回答是的,可以使用CSS將顏色添加到Chrome和Firefox中的控制台顯示的消息(版本31或更高版本)中。要實現這一目標,請使用以下...
    程式設計 發佈於2025-07-09
  • 如何在Chrome中居中選擇框文本?
    如何在Chrome中居中選擇框文本?
    選擇框的文本對齊:局部chrome-inly-ly-ly-lyly solument 您可能希望將文本中心集中在選擇框中,以獲取優化的原因或提高可訪問性。但是,在CSS中的選擇元素中手動添加一個文本 - 對屬性可能無法正常工作。 初始嘗試 state)</option> < o...
    程式設計 發佈於2025-07-09
  • 如何干淨地刪除匿名JavaScript事件處理程序?
    如何干淨地刪除匿名JavaScript事件處理程序?
    刪除匿名事件偵聽器將匿名事件偵聽器添加到元素中會提供靈活性和簡單性,但是當要刪除它們時,可以構成挑戰,而無需替換元素本身就可以替換一個問題。 element? element.addeventlistener(event,function(){/在這里工作/},false); 要解決此問題,請考...
    程式設計 發佈於2025-07-09
  • 如何在JavaScript對像中動態設置鍵?
    如何在JavaScript對像中動態設置鍵?
    在嘗試為JavaScript對象創建動態鍵時,如何使用此Syntax jsObj['key' i] = 'example' 1;不工作。正確的方法採用方括號: jsobj ['key''i] ='example'1; 在JavaScript中,數組是一...
    程式設計 發佈於2025-07-09
  • 在程序退出之前,我需要在C ++中明確刪除堆的堆分配嗎?
    在程序退出之前,我需要在C ++中明確刪除堆的堆分配嗎?
    在C中的顯式刪除 在C中的動態內存分配時,開發人員通常會想知道是否需要手動調用“ delete”操作員在heap-exprogal exit exit上。本文深入研究了這個主題。 在C主函數中,使用了動態分配變量(HEAP內存)的指針。當應用程序退出時,此內存是否會自動發布?通常,是。但是,即使在...
    程式設計 發佈於2025-07-09
  • 為什麼使用Firefox後退按鈕時JavaScript執行停止?
    為什麼使用Firefox後退按鈕時JavaScript執行停止?
    導航歷史記錄問題:JavaScript使用Firefox Back Back 此行為是由瀏覽器緩存JavaScript資源引起的。要解決此問題並確保在後續頁面訪問中執行腳本,Firefox用戶應設置一個空功能。 警報'); }; alert('inline Alert')...
    程式設計 發佈於2025-07-09
  • 切換到MySQLi後CodeIgniter連接MySQL數據庫失敗原因
    切換到MySQLi後CodeIgniter連接MySQL數據庫失敗原因
    Unable to Connect to MySQL Database: Troubleshooting Error MessageWhen attempting to switch from the MySQL driver to the MySQLi driver in CodeIgniter,...
    程式設計 發佈於2025-07-09
  • 如何有效地轉換PHP中的時區?
    如何有效地轉換PHP中的時區?
    在PHP 利用dateTime對象和functions DateTime對象及其相應的功能別名為時區轉換提供方便的方法。例如: //定義用戶的時區 date_default_timezone_set('歐洲/倫敦'); //創建DateTime對象 $ dateTime = ne...
    程式設計 發佈於2025-07-09
  • Python環境變量的訪問與管理方法
    Python環境變量的訪問與管理方法
    Accessing Environment Variables in PythonTo access environment variables in Python, utilize the os.environ object, which represents a mapping of envir...
    程式設計 發佈於2025-07-09
  • 同實例無需轉儲複製MySQL數據庫方法
    同實例無需轉儲複製MySQL數據庫方法
    在同一實例上複製一個MySQL數據庫而無需轉儲在同一mySQL實例上複製數據庫,而無需創建InterMediate sqql script。以下方法為傳統的轉儲和IMPORT過程提供了更簡單的替代方法。 直接管道數據 MySQL手動概述了一種允許將mysqldump直接輸出到MySQL cli...
    程式設計 發佈於2025-07-09
  • 如何使用FormData()處理多個文件上傳?
    如何使用FormData()處理多個文件上傳?
    )處理多個文件輸入時,通常需要處理多個文件上傳時,通常是必要的。 The fd.append("fileToUpload[]", files[x]); method can be used for this purpose, allowing you to send multi...
    程式設計 發佈於2025-07-09

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3