golang逗號(hào)ok模式整合demo
更新時(shí)間:2023年11月01日 11:08:48 作者:Peanut
這篇文章主要為大家介紹了golang逗號(hào)ok模式整合demo,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
golang的逗號(hào)ok模式的使用整理
/*
@Time : 2019-02-23 11:49
@Author : Tenlu
@File : ok
@Software: GoLand
*/
package main
import "fmt"
// 逗號(hào)ok模式
func main() {
useMap()
useChan()
userType()
useType2()
}
//1.檢測(cè)map中是否含有指定key
func useMap() {
company := map[string]string{"polly": "tencent", "robin": "baidu", "jack": "alibaba", "tenlu": "itech8"}
if _, ok := company["toms"]; !ok {
fmt.Println("key toms is not exists")
}
for ck, cv := range company {
fmt.Println(ck + "->" + cv)
}
}
// 2. 檢測(cè)chan是否關(guān)閉
func useChan() {
ch := make(chan int, 10)
for i := 1; i <= 5; i++ {
ch <- i
}
close(ch) // chan賦值結(jié)束,必須關(guān)閉通道
elem := <-ch
fmt.Println(elem) // 1 // FIFO隊(duì)列,先發(fā)送的chan一定最先被接收
for cc := range ch {
fmt.Println(cc)
}
// ch <-8 // 此時(shí)再往ch這個(gè)chan里發(fā)送數(shù)據(jù),就會(huì)報(bào)錯(cuò),因?yàn)橥ǖ酪呀?jīng)關(guān)閉,panic:send on closed channel
elem2 := <-ch
elem3 := <-ch
fmt.Printf("elem2:%d\n", elem2) // 0,因?yàn)橥ǖ酪呀?jīng)關(guān)閉
fmt.Printf("elem3:%d\n", elem3) // 0
if _, isClosed := <-ch; !isClosed {
fmt.Println("channel closed")
}
// go是沒有while循環(huán)的,此處類似其他語(yǔ)言的while(true)
for {
i, ok := <-ch
if !ok {
fmt.Println("channel closed!")
break
}
fmt.Println(i)
}
}
// 3.檢測(cè)是否實(shí)現(xiàn)了接口類型
type I interface {
// 有一個(gè)方法的接口 I
Get() Int
}
type Int int
// Int 類型實(shí)現(xiàn)了 I 接口
func (i Int) Get() Int {
return i
}
func userType() {
var myint Int = 5
var inter I = myint // 變量賦值給接口
val, ok := inter.(Int)
fmt.Printf("%v, %v\n", val, ok) // 輸出為:5,true
}
func useType2() {
// chan 類型的空值是 nil,聲明后需要配合 make 后才能使用。
var ch=make(chan interface{},10)
ch<-10
ch<-"jack"
ch<-map[string]interface{}{"name":"jack","age":11}
close(ch) // 此處不close通道,遍歷時(shí)則報(bào)錯(cuò)
fmt.Printf("%v\n",<- ch)
for c:=range ch {
fmt.Printf("for:%v\n",c)
fmt.Sprintf("type:%T\n", c)
if newValue,ok:=c.(map[string]interface{});ok{
fmt.Printf("type:%s\n",reflect.TypeOf(c)) // 獲取變量類型
// map[string]interface {}
if _,ok:=newValue["name"];ok{
for k,v:=range newValue {
fmt.Printf("%v->%v,\n",k,v)
}
}
}
}
fmt.Printf("%v\n",<- ch) // nil
}
func useType2() {
// chan 類型的空值是 nil,聲明后需要配合 make 后才能使用。
var ch=make(chan interface{},10)
ch<-10
ch<-"jack"
ch<-map[string]interface{}{"name":"jack","age":11}
close(ch) // 此處不close通道,遍歷時(shí)則報(bào)錯(cuò)
fmt.Printf("%v\n",<- ch)
for c:=range ch {
fmt.Printf("for:%v\n",c)
fmt.Sprintf("type:%T\n", c)
if newValue,ok:=c.(map[string]interface{});ok{
fmt.Printf("type:%s\n",reflect.TypeOf(c)) // 獲取變量類型
// map[string]interface {}
if _,ok:=newValue["name"];ok{
for k,v:=range newValue {
fmt.Printf("%v->%v,\n",k,v)
}
}
}
}
fmt.Printf("%v\n",<- ch) // nil
}代碼里的注釋很詳細(xì),有需要童鞋可以自行研究實(shí)踐下
以上就是golang逗號(hào)ok模式整合demo的詳細(xì)內(nèi)容,更多關(guān)于golang逗號(hào)ok模式的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Go語(yǔ)言reflect包的反射機(jī)制基本用法示例
反射在處理接口和類型斷言、開發(fā)通用功能或者設(shè)計(jì)框架時(shí)尤為重要,本文將深入探索 Go 語(yǔ)言中的反射機(jī)制,通過具體的示例展示如何使用?reflect?包,讓你能夠在 Go 項(xiàng)目中有效地利用這一強(qiáng)大的工具2023-11-11
Golang語(yǔ)言的跨平臺(tái)UI工具包fyne使用詳解
這篇文章主要為大家介紹了Golang語(yǔ)言的跨平臺(tái)UI工具包fyne使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
GO中的slice使用簡(jiǎn)介(源碼分析slice)
slice(切片)是go中常見和強(qiáng)大的類型,這篇文章不是slice使用簡(jiǎn)介,從源碼角度來分析slice的實(shí)現(xiàn),slice的一些迷惑的使用方式,感興趣的朋友跟隨小編一起看看吧2023-06-06
Go語(yǔ)言基礎(chǔ)函數(shù)包的使用學(xué)習(xí)
本文通過一個(gè)實(shí)現(xiàn)加減乘除運(yùn)算的小程序來介紹go函數(shù)的使用,以及使用函數(shù)的注意事項(xiàng),并引出了對(duì)包的了解和使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
Go設(shè)置http請(qǐng)求超時(shí)的方法實(shí)現(xiàn)
這篇文章主要介紹了Go設(shè)置http請(qǐng)求超時(shí)的方法實(shí)現(xiàn),最近接手了一個(gè)老項(xiàng)目進(jìn)行維護(hù),發(fā)現(xiàn)其中有個(gè)關(guān)于 http 請(qǐng)求的方法設(shè)置的 timeout 沒有生效,很奇怪,一開始查看代碼并沒有發(fā)現(xiàn)什么可疑點(diǎn),后查看了源碼,打斷點(diǎn)調(diào)試才發(fā)現(xiàn)問題所在,這里簡(jiǎn)單記錄復(fù)盤一下2024-08-08

