欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Golang 類型轉換的實現(xiàn)(斷言、強制、顯式類型)

 更新時間:2023年09月03日 09:27:32   作者:動態(tài)一時爽,重構火葬場  
將一個值從一種類型轉換到另一種類型,便發(fā)生了類型轉換,在go可以分為斷言、強制、顯式類型轉換,本文就詳細的介紹一下這就幾種轉換方式,具有一定的參考價值,感興趣的可以了解一下

將一個值從一種類型轉換到另一種類型,便發(fā)生了類型轉換。靜態(tài)語言如c/c++,Java提供了隱性的類型轉換,但對于golang這種強類型系統(tǒng)則不一樣,golang并不支持自動類型轉換或者隱性類型轉換。

在go可以分為斷言、強制、顯式類型轉換。

通常說的類型轉換是指斷言,強制一般不會用到,顯式是基本的類型轉換

斷言

斷言通過判斷接口x是否不是nil且為T類型

var s = x.(T)

具體而言,在T不為接口時,要求x的動態(tài)類型就是T,并且T必須實現(xiàn)了x接口;否則類型斷言無效,因為x不可能儲存類型T的值

動態(tài)類型:接口類型可以包含對實現(xiàn)接口的任何類型的實例的引用(接口具有所謂的動態(tài)類型)

type I interface{ F() }
type S struct{}
func (S) F() { }
type T struct{}
func (T) F() { }
// 此時靜態(tài)類型為接口I
var x I
// 此時動態(tài)類型為結構體S
x = S{}
// 重賦予x動態(tài)類型為結構體T
x = T{}

在T為接口時,x必須實現(xiàn)接口T

斷言失敗會觸發(fā)panic,當然也可以s,ok:=x.(T),使用ok表示是否成功。

// 接口x轉換為非接口類型	
	var x interface{} = 1
	y:=x.(int)
// 接口x轉換為接口類型
type TypeAssertA interface {
	typeAssertA()
}
type TypeAssertB interface {
	typeAssertB()
}
type ta struct {}
func (t ta) typeAssertA() {}
func (t ta) typeAssertB() {}
// ta結構既實現(xiàn)了TypeAssertA又實現(xiàn)TypeAssertB,因此可以在兩種接口類型之間相互轉換
	var x TypeAssertA = ta{}
	y:=x.(TypeAssertB)

switch斷言

switch判斷具體值類型,而在case中匹配具體類型。也可以i:=x.(type)直接得到匹配類型的值

強制

通過unsafe等進行強制類型轉換

比如將floag64類型轉換為uint64類型,可能值表現(xiàn)不同,但內存二進制儲存卻是一樣的

var f float64
u:= *(*uint64)(unsafe.Pointer(&f))

還可以用來進行接口類型檢測

// 檢查contextImpl是否實現(xiàn)了context接口
var c Context=(*ContextImpl)(nil)

顯式

將一個類型表達式轉換為另一個

var s =T(x)

在碰到*<-或者func開頭的,最好使用括號以防止誤用

*Point(p)        // same as *(Point(p))
(*Point)(p)      // p is converted to *Point
<-chan int(c)    // same as <-(chan int(c))
(<-chan int)(c)  // c is converted to <-chan int
func()(x)        // function signature func() x
(func())(x)      // x is converted to func()
(func() int)(x)  // x is converted to func() int
func() int(x)    // x is converted to func() int (unambiguous)

一個非常量x可以在以下情況下轉換為類型T

  • x可以賦值為T
  • 忽略struct標簽,x類型與T具有相同的基礎類型
  • 忽略 struct 標記 x 的類型和 T 是未定義類型的指針類型,并且它們的指針基類型具有相同的基礎類型。
  • x 的類型和 T 都是整數(shù)或浮點類型。
  • x 的類型和 T 都是復數(shù)類型。
  • x 的類型是整數(shù)或 [] byte 或 [] rune,并且 T 是字符串類型。
    或者x 的類型是字符串,T 類型是 [] byte 或 [] rune。

注意可以賦值為指的是(V為x類型):

  • V等于T
  • V和T是具有相同元素類型的通道類型,V是雙向channel,且V或T中至少有一個不是以type命名的類型。
  • T是接口類型,但不是類型參數(shù),x實現(xiàn)了T。
  • x是預先聲明的標識符nil, T是指針、函數(shù)、切片、映射、通道或接口類型,但不是類型參數(shù)。
  • x是一個沒有類型的常量,可以用類型T的值表示。

此外,如果x的類型V或T是類型參數(shù),則在下列條件之一適用時,x可賦值給類型T的變量:

  • x是預先聲明的標識符nil, T是一個類型參數(shù),x可以賦值給T的類型集中的每個類型。
  • V不是一個命名類型,T是一個類型參數(shù),x可以賦值給T的類型集中的每個類型。
  • V是一個類型參數(shù),T不是一個命名類型,V的類型集中的每個類型的值都可以賦值給T。

Ref

 到此這篇關于Golang 類型轉換的實現(xiàn)(斷言、強制、顯式類型)的文章就介紹到這了,更多相關Golang 類型轉換內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Go語言之重要數(shù)組類型切片(slice)make,append函數(shù)解讀

    Go語言之重要數(shù)組類型切片(slice)make,append函數(shù)解讀

    這篇文章主要介紹了Go語言之重要數(shù)組類型切片(slice)make,append函數(shù)用法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • golang接口的正確用法分享

    golang接口的正確用法分享

    這篇文章主要介紹了golang接口的正確用法分享的相關資料,需要的朋友可以參考下
    2023-09-09
  • Go語言中內存管理逃逸分析詳解

    Go語言中內存管理逃逸分析詳解

    所謂的逃逸分析(Escape?analysis)是指由編譯器決定內存分配的位置嗎不需要程序員指定。本文就來和大家簡單分析一下Go語言中內存管理逃逸吧
    2023-03-03
  • golang判斷兩個事件是否存在沖突的方法示例

    golang判斷兩個事件是否存在沖突的方法示例

    這篇文章主要為大家詳細介紹了golang判斷兩個事件是否存在沖突的方法示例,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-10-10
  • Go中匿名結構體的使用技巧

    Go中匿名結構體的使用技巧

    這篇文章主要給大家分享一個使用匿名結構體,提升Go編程效率的小技巧,沒什么技術深度,屬于在日常寫代碼過程中積累下來的一個提升自己編程效率的小經(jīng)驗
    2023-08-08
  • golang如何用http.NewRequest創(chuàng)建get和post請求

    golang如何用http.NewRequest創(chuàng)建get和post請求

    這篇文章主要介紹了golang如何用http.NewRequest創(chuàng)建get和post請求問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • Golang?Mutex?原理詳細解析

    Golang?Mutex?原理詳細解析

    這篇文章主要介紹了Golang?Mutex原理詳細解析,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • Golang中如何實現(xiàn)枚舉詳析

    Golang中如何實現(xiàn)枚舉詳析

    舉就是將數(shù)據(jù)值一一列出來,枚舉可以用來表示一些固定的值,枚舉是常量組成的,下面這篇文章主要給大家介紹了關于Golang中如何實現(xiàn)枚舉的相關資料,需要的朋友可以參考下
    2022-07-07
  • Go語言中init函數(shù)和defer延遲調用關鍵詞詳解

    Go語言中init函數(shù)和defer延遲調用關鍵詞詳解

    這篇文章主要介紹了Go語言中init函數(shù)和defer延遲調用關鍵詞,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03
  • Golang中使用JSON的一些小技巧分享

    Golang中使用JSON的一些小技巧分享

    這篇文章主要分享了Golang中使用JSON的一些小技巧,文中通過示例代碼介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面來一起看看吧。
    2017-06-06

最新評論