精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

十個令人驚嘆的Go語言技巧,讓你的代碼更加優雅

開發 前端
鏈式調用技術可以應用于函數(指針)接收器。為了說明這一點,讓我們考慮一個 Person? 結構,它有兩個函數 AddAge? 和 Rename,用于對其進行修改。

在開發生產項目的過程中,我注意到經常會發現自己在重復編寫代碼,使用某些技巧時沒有意識到,直到后來回顧工作時才意識到。

為了解決這個問題,我開發了一種解決方案,對我來說非常有幫助,我覺得對其他人也可能有用。

以下是一些從我的實用程序庫中隨機挑選的有用且多功能的代碼片段,沒有特定的分類或特定于系統的技巧。

1. 追蹤執行時間的技巧

如果你想追蹤 Go 中函數的執行時間,有一個簡單高效的技巧可以用一行代碼實現,使用 defer 關鍵字即可。你只需要一個 TrackTime 函數:

// Utility
func TrackTime(pre time.Time) time.Duration {
  elapsed := time.Since(pre)
  fmt.Println("elapsed:", elapsed)

  return elapsed
}

func TestTrackTime(t *testing.T) {
  defer TrackTime(time.Now()) // <--- THIS

  time.Sleep(500 * time.Millisecond)
}

// 輸出:
// elapsed: 501.11125ms

1.5. 兩階段延遲執行

Go 的 defer 不僅僅是用于清理任務,還可以用于準備任務,考慮以下示例:

func setupTeardown() func() {
    fmt.Println("Run initialization")
    return func() {
        fmt.Println("Run cleanup")
    }
}

func main() {
    defer setupTeardown()() // <--------
    fmt.Println("Main function called")
}

// 輸出:
// Run initialization
// Main function called
// Run cleanup

這種模式的美妙之處在于,只需一行代碼,你就可以完成諸如以下任務:

  • 打開數據庫連接,然后關閉它。
  • 設置模擬環境,然后拆除它。
  • 獲取分布式鎖,然后釋放它。
  • ...

"嗯,這似乎很聰明,但它在現實中有什么用處呢?"

還記得追蹤執行時間的技巧嗎?我們也可以這樣做:

func TrackTime() func() {
  pre := time.Now()
  return func() {
    elapsed := time.Since(pre)
    fmt.Println("elapsed:", elapsed)
  }
}

func main() {
  defer TrackTime()()

  time.Sleep(500 * time.Millisecond)
}

注意!如果我連接到數據庫時出現錯誤怎么辦?

確實,像 defer TrackTime() 或 defer ConnectDB() 這樣的模式不會妥善處理錯誤。這種技巧最適合用于測試或者當你愿意冒著致命錯誤的風險時使用,參考下面這種面向測試的方法:

func TestSomething(t *testing.T) {
  defer handleDBConnection(t)()
  // ...
}

func handleDBConnection(t *testing.T) func() {
  conn, err := connectDB()
  if err != nil {
    t.Fatal(err)
  }

  return func() {
    fmt.Println("Closing connection", conn)
  }
}

這樣,在測試期間可以處理數據庫連接的錯誤。

2. 預分配切片

根據文章《Go 性能提升技巧》中的見解,預分配切片或映射可以顯著提高 Go 程序的性能。

但是值得注意的是,如果我們不小心使用 append 而不是索引(如 a[i]),這種方法有時可能導致錯誤。你知道嗎,我們可以在不指定數組長度(為零)的情況下使用預分配的切片,就像在上述文章中解釋的那樣?這使我們可以像使用 append 一樣使用預分配的切片:

// 與其
a := make([]int, 10)
a[0] = 1

// 不如這樣使用
b := make([]int, 0, 10)
b = append(b, 1)

3. 鏈式調用

鏈式調用技術可以應用于函數(指針)接收器。為了說明這一點,讓我們考慮一個 Person 結構,它有兩個函數 AddAge 和 Rename,用于對其進行修改。

type Person struct {
  Name string
  Age  int
}

func (p *Person) AddAge() {
  p.Age++
}

func (p *Person) Rename(name string) {
  p.Name = name
}

如果你想給一個人增加年齡然后給他們改名字,常規的方法是:

func main() {
  p := Person{Name: "Aiden", Age: 30}

  p.AddAge()
  p.Rename("Aiden 2")
}

或者,我們可以修改 AddAge 和 Rename 函數接收器,使其返回修改后的對象本身,即使它們通常不返回任何內容。

func (p *Person) AddAge() *Person {
  p.Age++
  return p
}

func (p *Person) Rename(name string) *Person {
  p.Name = name
  return p
}

通過返回修改后的對象本身,我們可以輕松地將多個函數接收器鏈在一起,而無需添加不必要的代碼行:

p = p.AddAge().Rename("Aiden 2")

4. Go 1.20 允許將切片解析為數組或數組指針

當我們需要將切片轉換為固定大小的數組時,不能直接賦值,例如:

a := []int{0, 1, 2, 3, 4, 5}
var b [3]int = a[0:3]

// 在變量聲明中不能將 a[0:3](類型為 []int 的值)賦值給 [3]int 類型的變量
// (不兼容的賦值)

為了將切片轉換為數組,Go 團隊在 Go 1.17 中更新了這個特性。隨著 Go 1.20 的發布,借助更方便的字面量,轉換過程變得更加簡單:

// Go 1.20
func Test(t *testing.T) {
   a := []int{0, 1, 2, 3, 4, 5}
   b := [3]int(a[0:3])

  fmt.Println(b) // [0 1 2]
}

// Go 1.17
func TestM2e(t *testing.T) {
  a := []int{0, 1, 2, 3, 4, 5}
  b := *(*[3]int)(a[0:3])

  fmt.Println(b) // [0 1 2]
}

只是一個快速提醒:你可以使用 a[:3] 替代 a[0:3]。我提到這一點是為了更清晰地說明。

5. 使用 "import _" 進行包初始化

有時,在庫中,你可能會遇到結合下劃線 (_) 的導入語句,如下所示:

import (
  _ "google.golang.org/genproto/googleapis/api/annotations"
)

這將執行包的初始化代碼(init 函數),而無需為其創建名稱引用。這允許你在運行代碼之前初始化包、注冊連接和執行其他任務。

讓我們通過一個示例來更好地理解它的工作原理:

// 下劃線
package underscore

func init() {
  fmt.Println("init called from underscore package")
}
// main
package main

import (
  _ "lab/underscore"
)

func main() {}
// 輸出:init called from underscore package

6. 使用 "import ." 進行導入

在了解了如何使用下劃線進行導入后,讓我們看看如何更常見地使用點 (.) 運算符。

作為開發者,點 (.) 運算符可用于在不必指定包名的情況下使用導入包的導出標識符,這對于懶惰的開發者來說是一個有用的快捷方式。

很酷,對吧?這在處理項目中的長包名時特別有用,比如 externalmodel 或 doingsomethinglonglib。

為了演示,這里有一個簡單的例子:

package main

import (
  "fmt"
  . "math"
)

func main() {
  fmt.Println(Pi) // 3.141592653589793
  fmt.Println(Sin(Pi / 2)) // 1
}

7. Go 1.20 允許將多個錯誤合并為單個錯誤

Go 1.20 引入了對錯誤包的新功能,包括對多個錯誤的支持以及對 errors.Is 和 errors.As 的更改。

在 errors 中添加的一個新函數是 Join,我們將在下面詳細討論它:

var (
  err1 = errors.New("Error 1st")
  err2 = errors.New("Error 2nd")
)

func main() {
  err := err1
  err = errors.Join(err, err2)

  fmt.Println(errors.Is(err, err1)) // true
  fmt.Println(errors.Is(err, err2)) // true
}

如果有多個任務導致錯誤,你可以使用 Join 函數而不是手動管理數組。這簡化了錯誤處理過程。

8. 檢查接口是否為真正的 nil

即使接口持有的值為 nil,也不意味著接口本身為 nil。這可能導致 Go 程序中的意外錯誤。因此,重要的是要知道如何檢查接口是否為真正的 nil。

func main() {
  var x interface{}
  var y *int = nil
  x = y

  if x != nil {
    fmt.Println("x != nil") // <-- 實際輸出
  } else {
    fmt.Println("x == nil")
  }

  fmt.Println(x)
}

// 輸出:
// x != nil
// <nil>

我們如何確定 interface{} 值是否為 nil 呢?幸運的是,有一個簡單的工具可以幫助我們實現這一點:

func IsNil(x interface{}) bool {
  if x == nil {
    return true
  }

  return reflect.ValueOf(x).IsNil()
}

9. 在 JSON 中解析 time.Duration

當解析 JSON 時,使用 time.Duration 可能是一個繁瑣的過程,因為它需要在一秒的后面添加 9 個零(即 1000000000)。為了簡化這個過程,我創建了一個名為 Duration 的新類型:

type Duration time.Duration

為了將字符串(如 "1s" 或 "20h5m")解析為 int64 類型的持續時間,我還為這個新類型實現了自定義的解析邏輯:

func (d *Duration) UnmarshalJSON(b []byte) error {
  var s string
  if err := json.Unmarshal(b, &s); err != nil {
    return err
  }
  dur, err := time.ParseDuration(s)
  if err != nil {
    return err
  }
  *d = Duration(dur)
  return nil
}

但是,需要注意的是,變量 'd' 不應為 nil,否則可能會導致編組錯誤。或者,你還可以在函數開頭對 'd' 進行檢查。

10. 避免裸參數

當處理具有多個參數的函數時,僅通過閱讀其用法來理解每個參數的含義可能會令人困惑。考慮以下示例:

printInfo("foo", true, true)

如果不檢查 printInfo 函數,那么第一個 'true' 和第二個 'true' 的含義是什么呢?當你有一個具有多個參數的函數時,僅通過閱讀其用法來理解參數的含義可能會令人困惑。

但是,我們可以使用注釋使代碼更易讀。例如:

// func printInfo(name string, isLocal, done bool)

printInfo("foo", true /* isLocal */, true /* done */)

有些 IDE 也支持這個功能,可以在函數調用建議中顯示注釋,但可能需要在設置中啟用。

以上是我分享的一些實用技巧,但我不想讓文章過長,難以跟進,因為這些技巧與特定主題無關,涵蓋了各種類別。

如果你覺得這些技巧有用,或有自己的見解要分享,請隨時留言。我重視你的反饋,并樂于在回應此文章時點贊或推薦你的想法。

責任編輯:武曉燕 來源: 愛發白日夢的后端
相關推薦

2024-05-16 11:09:40

Python字符串代碼

2023-03-06 00:18:07

2023-12-10 14:19:31

JupyterPython編碼

2011-03-18 09:56:19

JavaScript

2022-09-19 15:02:24

C語言

2020-11-10 07:11:23

Linux內核補丁

2020-12-22 15:47:02

Python開發工具

2012-03-01 11:32:18

硅谷女性

2025-05-29 08:35:39

Python代碼開發

2025-06-25 10:02:55

2011-04-07 11:33:00

HTML 5JavaScript

2021-11-29 07:02:24

Python函數操作

2025-02-17 11:10:49

2024-02-04 18:20:53

AI模型代碼

2024-06-13 12:24:06

C++開發代碼

2021-08-17 10:08:44

HTML網站網絡

2025-03-10 08:00:00

開源VS Code開發

2023-05-24 10:24:56

代碼Python

2024-07-31 08:38:36

2012-11-15 09:59:35

HTML5WebHTML5特效
點贊
收藏

51CTO技術棧公眾號

综合激情成人伊人| 美女一区二区三区| 日韩精品在线视频观看| 日韩欧美一区二| 男女污视频在线观看| 美国一区二区三区在线播放| 欧美成人免费在线视频| 日本五十肥熟交尾| 成人国产激情在线| 亚洲一线二线三线久久久| 免费一区二区三区在在线视频| 又污又黄的网站| 午夜精彩国产免费不卡不顿大片| 国产视频一区在线| 午夜一级免费视频| 瑟瑟视频在线看| 日韩一区在线播放| 欧美久久久久久久| 精品国产亚洲av麻豆| 老牛影视一区二区三区| 色综合久久88色综合天天看泰| 亚洲午夜福利在线观看| 国产一区一区| 在线视频欧美精品| 丁香花在线影院观看在线播放| 91在线不卡| 99久久综合色| 亚洲一区二区三区777| 依依成人综合网| 亚洲成人精品| 精品美女一区二区| 色婷婷综合网站| av中文在线资源| 国产精品传媒入口麻豆| 国产精品区一区| 中文字幕乱码人妻无码久久 | 1024成人| 在线电影欧美日韩一区二区私密| wwwxxxx在线观看| 性感美女一区二区在线观看| 一区二区视频在线| 亚洲啪啪av| 天堂在线视频观看| 国产精品一级在线| 国产精品视频永久免费播放| 国产稀缺真实呦乱在线| 日本久久精品| 亚洲精品一二区| 日韩欧美中文视频| av一区在线播放| 精品女同一区二区三区在线播放| 国产精品h视频| 精品久久久久一区二区三区 | 国产综合在线看| 91制片厂在线| 国产成人1区| 精品久久久久香蕉网| 一区二区三区四区毛片| 成人mm视频在线观看| 欧美日韩激情小视频| 欧美高清中文字幕| 成人日日夜夜| 国产精品久久久久影院老司| 日韩av在线一区二区三区| 亚洲日本中文字幕在线| 波多野结衣视频一区| 国产传媒一区二区三区| 精品人妻一区二区三区麻豆91 | 99久在线精品99re8热| 综合激情在线| 欧美成人精品在线观看| 国产又色又爽又高潮免费| 波多野结衣在线观看一区二区三区 | 色琪琪综合男人的天堂aⅴ视频| 污视频网站观看| 日韩经典一区| 欧美日韩综合在线免费观看| 亚洲36d大奶网| 国产精品原创视频| 欧美欧美午夜aⅴ在线观看| 久热免费在线观看| 色豆豆成人网| 在线观看一区日韩| 日韩毛片在线免费看| 极品美女一区| 色婷婷国产精品| 毛片一区二区三区四区| 成人影院网站| 欧美理论电影在线| 中文字幕第10页| 超碰在线成人| 日韩激情av在线播放| 伊人网伊人影院| 不卡在线一区二区| 久久久99久久精品女同性| 午夜69成人做爰视频| 亚洲婷婷免费| 91精品国产高清自在线看超| 亚洲黄网在线观看| 久久精品国产网站| 成人免费91在线看| 日本中文字幕一区二区有码在线| 国产欧美一区二区三区网站 | 蜜桃a∨噜噜一区二区三区| 亚洲人成自拍网站| 中日韩一级黄色片| 日韩天天综合| 国产精品第8页| 99在线观看精品视频| www.日本不卡| 亚洲色图自拍| 久久99亚洲网美利坚合众国| 精品成人av一区| 欧美日韩亚洲自拍| 99欧美精品| 亚洲国产精品人久久电影| 91视频在线网站| 一精品久久久| 欧美亚洲另类在线| 国产丰满美女做爰| 久久久午夜精品| 看全色黄大色大片| 日韩免费va| 欧美成人免费网站| 夜夜春很很躁夜夜躁| 欧美色一级片| 国产精品直播网红| 黑人精品一区二区三区| 国产精品久久久一本精品| 亚洲一区二区三区av无码| 久久久人成影片一区二区三区在哪下载 | 巨茎人妖videos另类| 制服丝袜成人动漫| 少妇真人直播免费视频| 欧美日韩1区2区3区| 国产精品人成电影| 天天操天天干天天插| 国产女人18水真多18精品一级做| 日韩精品综合在线| 成人精品在线| 一区二区三区视频观看| 久久精品无码人妻| 老司机精品视频一区二区三区| 精品国产免费人成电影在线观...| 嫩草香蕉在线91一二三区| 色综合天天综合网国产成人综合天 | 色一情一乱一乱一区91av| 国产亚洲欧洲997久久综合| 男女日批视频在线观看| 99久热在线精品视频观看| 国产亚洲视频在线观看| 国产精品男女视频| 成人三级伦理片| 毛片在线视频观看| 亚洲人体在线| 色哟哟网站入口亚洲精品| 亚洲 欧美 日韩 在线| 99国产精品视频免费观看| 国产无限制自拍| 日韩精品一区国产| 欧美成人免费一级人片100| 国产精品久久婷婷| 国产精品第五页| 午夜在线观看av| 精品国产a一区二区三区v免费| 欧美最顶级丰满的aⅴ艳星| 日韩一区免费视频| 午夜精品福利一区二区蜜股av| 国产精品日日摸夜夜爽| 国产在线成人| 国产女主播一区二区三区| 欧美xxxx免费虐| 亚洲电影免费观看高清完整版在线观看 | 欧美三级在线播放| 欧洲av一区二区三区| 久久久久久久波多野高潮日日| 精品999在线观看| 涩涩视频在线| 国产午夜精品全部视频在线播放 | 不卡一区二区三区四区| 异国色恋浪漫潭| 涩涩涩久久久成人精品| 日韩中文字幕在线观看| 亚洲怡红院av| **欧美大码日韩| 亚洲黄色小说在线观看| 国产精品成人a在线观看| 国产精品三级久久久久久电影| av影片免费在线观看| 7777精品伊人久久久大香线蕉经典版下载| 国产老头老太做爰视频| 丁香婷婷综合网| 男女超爽视频免费播放| 久操精品在线| 国产狼人综合免费视频| 日韩av官网| 亚洲精品视频免费在线观看| 中文字幕人妻一区二区三区视频| 中文字幕一区二区三区四区不卡| 久草福利在线观看| 99热这里只有成人精品国产| 日韩视频在线播放| 成人国产精品久久| 2019av中文字幕| 亚乱亚乱亚洲乱妇| 精品国产乱码久久久久久1区2区| 人妻 日韩精品 中文字幕| 国产精品日日摸夜夜摸av| 色欲无码人妻久久精品| 国产精品久久久久久模特 | 欧美国产成人在线| 手机在线播放av| 视频一区免费在线观看| 中国黄色录像片| 天天久久夜夜| 亚洲最大成人在线| 欧洲一级精品| 欧美激情精品久久久久久久变态| 青青视频在线观| 欧美一级日韩一级| 亚洲无码精品一区二区三区| 一区二区三区四区精品在线视频| 日韩中文字幕电影| 国产1区2区3区精品美女| 男人透女人免费视频| 欧美久色视频| 亚洲乱码国产乱码精品天美传媒| 狠狠一区二区三区| 成人午夜在线影院| 精品3atv在线视频| 亚州欧美日韩中文视频| 黄网页在线观看| 一个人看的www久久| 男人天堂网在线视频| 欧美日韩不卡一区二区| 亚洲s码欧洲m码国产av| 亚洲午夜激情网页| 中文字幕无码日韩专区免费 | 国产精品视频999| 性国裸体高清亚洲| 欧美激情免费视频| bestiality新另类大全| 中文字幕亚洲一区| 国产在线播放av| 亚洲老司机av| 婷婷开心激情网| 精品免费视频一区二区| 国产美女明星三级做爰| 精品视频一区 二区 三区| 黄色片中文字幕| 懂色av影视一区二区三区| 国产亚洲精品久久777777| 伊人开心综合网| 极品久久久久久| 国产精品久久久久影院老司| 黄大色黄女片18免费| 国产欧美精品在线观看| 玖玖爱在线观看| 2020国产精品久久精品美国| 丝袜熟女一区二区三区| 成人精品鲁一区一区二区| zjzjzjzjzj亚洲女人| 国产成人在线看| 18深夜在线观看免费视频| 国产一区二区福利| 免费高清视频在线观看| 国产精品一级在线| 国产乱淫av片| 成人午夜免费视频| 97人妻天天摸天天爽天天| 国产欧美一区二区三区网站| 一区二区三区在线播放视频| 成人欧美一区二区三区白人| 任你操精品视频| 日韩毛片视频在线看| 美女的奶胸大爽爽大片| 亚洲欧美乱综合| 国产亚洲欧美精品久久久www| 亚洲成精国产精品女| 亚洲精品电影院| 国产精品福利一区二区三区| fc2ppv在线播放| 亚洲精品国产一区二区精华液 | 欧美一级特黄a| 黄色精品一二区| 被黑人猛躁10次高潮视频| 福利一区二区在线| 亚洲天堂成人av| 国产亚洲短视频| 久草福利资源在线| 亚洲成人自拍一区| 国产午夜麻豆影院在线观看| 欧美三级三级三级| av综合在线观看| 亚洲加勒比久久88色综合| 黄色片视频在线观看| 日韩在线资源网| 黄页网站大全在线免费观看| 国产综合在线看| av高清不卡| 国产精品永久免费视频| 久本草在线中文字幕亚洲| 日韩成人av网站| 青青草91久久久久久久久| 熟女视频一区二区三区| 中文亚洲欧美| 天天色综合社区| 成人午夜激情片| 久久久久久成人网| 亚洲一区二区在线免费看| 久久久久久久久黄色| 欧美一区二区三区免费| 水中色av综合| 久久久精品国产亚洲| 绿色成人影院| 成人亚洲激情网| 任你弄精品视频免费观看| 亚洲午夜精品久久久中文影院av| 精品999日本| 午夜免费看毛片| 92国产精品观看| 卡通动漫亚洲综合| 色婷婷国产精品| 丰满岳乱妇国产精品一区| 中文字幕亚洲欧美在线| 悠悠资源网亚洲青| av一区二区在线看| 国产欧美日韩一区二区三区四区| 无码毛片aaa在线| 麻豆视频一区二区| 丰满少妇一区二区三区专区 | 在线观看亚洲免费视频| 国产三级久久久| 国产无遮挡裸体免费视频| 欧美高清你懂得| 成人在线免费公开观看视频| 91国产美女视频| 日韩精品一区国产| 制服诱惑一区| 免费欧美在线视频| 免费观看av网站| 亚洲1区2区3区4区| www.午夜激情| 久久亚洲精品小早川怜子66| 日韩在线短视频| 精品国产一区二区三区麻豆小说 | 日本免费高清一区二区| 亚洲精华国产欧美| 日批免费观看视频| 亚洲综合一区在线| 精品国产黄色片| 久久视频免费在线播放| 国外成人福利视频| 日本一区二区精品| 模特精品在线| 加勒比精品视频| 亚洲一区二区三区四区在线| 亚洲图片中文字幕| 亚洲天堂av高清| 台湾佬成人网| 日韩精品一线二线三线| 久久久久久黄| 色欲狠狠躁天天躁无码中文字幕| 日韩欧美成人精品| 男人久久精品| 国产99久久精品一区二区| 久久99免费视频| 国语对白做受xxxxx在线中国| 久久蜜桃av一区二区天堂| 国产免费av一区| 国产亚洲免费的视频看| 伊人久久视频| 欧洲一区二区日韩在线视频观看免费 | 久久精品国产亚洲精品2020| 成人黄色免费短视频| 欧美男人的天堂| 久久久久久黄| 亚洲精品中文字幕在线播放| 午夜精品免费在线观看| 日韩有码第一页| 1769国内精品视频在线播放| 青青视频一区二区| 欧美精品成人网| 久久网这里都是精品| 欧美黄色一级大片| xvideos亚洲人网站| 久久gogo国模啪啪裸体| 大胆欧美熟妇xx| 99re热这里只有精品免费视频| 国产黄色免费观看| 中文字幕亚洲欧美日韩在线不卡| 国产日韩一区二区三免费高清| 国产成人一区二区三区别| 91性感美女视频| 探花国产精品一区二区| 久久视频国产精品免费视频在线| 一区二区三区四区高清视频| www.99热这里只有精品| 国产精品污网站| 亚洲国产视频一区二区三区|