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

Golang interface{}的具體使用

 更新時間:2025年05月23日 11:15:18   作者:gopher.guo  
interface{}是Go中可以表示任意類型的空接口,本文主要介紹了Golang interface{}的具體使用,具有一定的參考價值,感興趣的可以了解一下

一、什么是 interface{}?

在 Go 語言中,interface{} 是一種空接口(empty interface),它表示任意類型。因為它沒有定義任何方法,所以 所有類型都實現了它

定義形式:

interface{}

等價于:

type interface{} interface {}

二、interface{} 有什么特別的?

? 特點:

  • 所有類型都實現了 interface{}。

  • 可以用來存儲任意類型的值。

  • 是 Go 的萬能類型容器,類似于其他語言里的 Object 或 any

三、使用示例

1. 存儲任意類型的值:

func printAnything(v interface{}) {
    fmt.Println("值是:", v)
}
?
func main() {
    printAnything(123)
    printAnything("hello")
    printAnything([]int{1, 2, 3})
}

輸出:

值是:123
值是:hello
值是:[1 2 3]

四、底層原理:interface{} 是怎么存值的?

Go 編譯器將 interface{} 實際存儲為兩部分:

type eface struct {
    _type *_type      // 真實類型信息
    data  unsafe.Pointer  // 指向實際數據的指針
}

比如:

var a interface{} = 123

這時候:

  • _type:指向 int 的類型描述符;

  • data:指向 123 這個 int 的值。

五、怎么取出 interface{} 中的值?

1. 類型斷言(Type Assertion):

var a interface{} = "hello"
?
str, ok := a.(string)
if ok {
    fmt.Println("轉換成功:", str)
} else {
    fmt.Println("轉換失敗")
}

2. 使用類型分支(Type Switch):

var a interface{} = 3.14
?
switch v := a.(type) {
case int:
    fmt.Println("是 int:", v)
case float64:
    fmt.Println("是 float64:", v)
case string:
    fmt.Println("是 string:", v)
default:
    fmt.Println("未知類型")
}

六、常見使用場景

場景描述
JSON 解析map[string]interface{} 可以存儲任意結構
fmt.Println接收的是 ...interface{} 參數
任意類型傳參寫通用工具函數,允許接收任意類型
空值或未知類型變量當不知道變量類型時,先存為 interface{}

七、注意事項 

  • interface{} 存進去什么類型,取出來的時候必須斷言正確,否則運行時報錯。

  • interface{} 本身不能直接做加減乘除等運算,必須先類型斷言。

  • 不等于 JavaScript 的 any,Go 仍然是強類型語言,類型斷言很重要。

  • interface{} 不能直接比較,除非內部類型支持 ==

八、面試??紗柎?nbsp;

Q:interface{} 是不是萬能的?

A:它可以存儲任何類型的值,但你不能隨便操作這些值,除非你知道它的真實類型,并且使用類型斷言來還原它。

Q:interface{} 和 interface 的區(qū)別?

A:interface{} 是一種接口類型,沒有定義任何方法;而普通的接口比如 Writer interface { Write(p []byte) (n int, err error) } 定義了方法,只有實現這些方法的類型才能賦值給該接口。

九、總結一句話:

interface{} 是 Go 中可以表示任意類型的“空接口”,是實現泛型編程的基礎工具之一。

到此這篇關于Golang interface{}的具體使用的文章就介紹到這了,更多相關Golang interface{}內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • golang批量執(zhí)行任務的通用模板分享

    golang批量執(zhí)行任務的通用模板分享

    這篇文章主要為大家詳細介紹了golang實現批量執(zhí)行任務的通用模板,文中的示例代碼講解詳細,具有一定的學習價值,感興趣的小伙伴可以了解一下
    2023-11-11
  • 關于Go語言中特有的設計模式與實現方式講解

    關于Go語言中特有的設計模式與實現方式講解

    雖然Go語言沒有像其他語言那樣明確的設計模式,但在實踐中,開發(fā)者們仍然發(fā)現了一些在Go語言中特別適用的設計模式和實現方式,本文就來和大家一一進行講解
    2023-05-05
  • 以go為例探究beyla從環(huán)境變量BEYLA_OPEN_PORT發(fā)現進程原理

    以go為例探究beyla從環(huán)境變量BEYLA_OPEN_PORT發(fā)現進程原理

    這篇文章主要為大家介紹了以golang進程為例,研究beyla從環(huán)境變量BEYLA_OPEN_PORT(即通過端口)發(fā)現進程的原理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • GO語言入門學習之基本數據類型字符串

    GO語言入門學習之基本數據類型字符串

    字符串在Go語言中以原生數據類型出現,使用字符串就像使用其他原生數據類型(int、bool、float32、float64 等)一樣,下面這篇文章主要給大家介紹了關于GO語言入門學習之基本數據類型字符串的相關資料,需要的朋友可以參考下
    2022-04-04
  • go語言通過反射獲取和設置結構體字段值的方法

    go語言通過反射獲取和設置結構體字段值的方法

    這篇文章主要介紹了go語言通過反射獲取和設置結構體字段值的方法,實例分析了Go語言反射的使用技巧,需要的朋友可以參考下
    2015-03-03
  • Go語言基于Goroutine的超時控制方案設計與實踐

    Go語言基于Goroutine的超時控制方案設計與實踐

    Go語言因其并發(fā)特性而備受青睞,尤其是goroutine和channel的組合,像一對默契的搭檔,為開發(fā)者提供了輕量、高效的并發(fā)工具,下面我們來看看基于goroutine的超時控制方案吧
    2025-05-05
  • Go重寫http請求重定向的方法

    Go重寫http請求重定向的方法

    當使用Go語言進行 HTTP 請求時,默認情況下,http.Client 會自動處理服務器返回的重定向響應(3xx 狀態(tài)碼),本文將詳細介紹如何在 Go 中實現禁止 HTTP 請求的重定向、限制重定向次數以及添加自定義重定向策略,需要的朋友可以參考下
    2024-08-08
  • 手把手帶你走進Go語言之條件表達式

    手把手帶你走進Go語言之條件表達式

    條件表達式由條件運算符構成,并常用條件表達式構成一個賦值語句,本文給大家介紹了在Go語言中條件表達式的具體用法,講述的非常詳細,對大家的學習或工作具有一定的參考借鑒價值
    2021-09-09
  • 我放棄Python轉Go語言的9大理由(附優(yōu)秀書籍推薦)

    我放棄Python轉Go語言的9大理由(附優(yōu)秀書籍推薦)

    這篇文章主要給大家介紹了關于我放棄Python轉Go語言的9大理由,以及給大家推薦了6本優(yōu)秀的go語言書籍,對同樣想學習golang的朋友們具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2017-10-10
  • golang中sync.Mutex的實現方法

    golang中sync.Mutex的實現方法

    本文主要介紹了golang中sync.Mutex的實現方法,mutex?主要有兩個?method:?Lock()?和?Unlock(),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-04-04

最新評論