成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Go1.21 速覽:新內置函數 Clear、Min、Max 和新標準庫包 Cmp!

開發 前端
本次新版本新增的內置函數分別是:clear、min、max,面向不同的場景,函數名和函數作用一致,不得不說論命名的藝術。

大家好,我是煎魚。

前面給大家分享了 Go1.21 正式不支持 macOS 10.13 和 10.14 的支持。嚇得我趕緊把我的 2017 款的老爺機從 10.14 升成 13.4。感覺 mbp 已經變成了暖寶寶。??

今天給大家分享的是 Go 1.21 中的兩個雙新增項,分別是新的 3 個內置方法和新的標準庫包。

新內置函數

本次新版本新增的內置函數分別是:clear、min、max,面向不同的場景,函數名和函數作用一致,不得不說論命名的藝術。

我們一個個來展開介紹。

clear 函數

引入背景

這個 clear 內置函數的加入,真的是等的夠久了。在 2022 年的《Go 大佬良心發現,愿意給 map 加清除了?》的文章中,我們有介紹過。

簡單來講,有如下兩個問題:

  1. Go 一直以來大家就在吵要清空 map 等類型的內容物。需要 for-range + delete 來清空,略繁瑣。
  2. 有一類神奇的值,叫做:NaN(Not a Number,非數)。它是數值數據類型的一類值,表示未定義或不可表示的值。有開發者發現無法清空 NaN 的值。有 BUG。

扯到今年吵來吵去,擴大了原有的范圍。

函數作用

最終 Go1.21 新加入的內置函數 clear 接受 map、slice、指向數組的指針或類型參數類型的參數。

函數簽名如下:

func clear[T ~[]Type | ~map[Type]Type1](t T)

分別有如下的作用:

  • 對于 map,會刪除所有條目(包含前面提到的 NaN),將會變成一個空 map。len 屬性的值會改變,值為 0 。
  • 對于 slice,會將 slice 或 array 長度內的所有元素設置為相應元素類型的零值。len 屬性的值不會改變。
  • 對于泛型的類型參數(type parameter):類型參數的類型集必須只包含 map、slices 或指向數組的指針的類型,clear 函數將會執行實際類型參數所對應的 clear 操作。

演示代碼

map 演示代碼如下:

func main() {
 m := map[string]string{"腦子進": "煎魚了", "煎魚": "進腦子了"}
 fmt.Printf("m1: %v, len: %d\n", m, len(m))
 clear(m)
 fmt.Printf("m2: %v, len: %d\n", m, len(m))
}

輸出結果:

m1: map[煎魚:進腦子了 腦子進:煎魚了], len: 2
m2: map[], len: 0

slice 演示代碼如下:

func main() {
 s := make([]string, 3)
 s[0] = "吃"
 s[1] = "煎"
 s[2] = "魚"

 fmt.Printf("s1: %v, len: %d, cap:%d\n", s, len(s), cap(s))
 clear(s)
 fmt.Printf("s2: %v, len: %d, cap:%d\n", s, len(s), cap(s))
}

輸出結果:

s1: [吃 煎 魚], len: 3, cap:3
s2: [  ], len: 3, cap:3

min、max 函數

這兩個函數的誕生主要是 @Ian Lance Taylor 發現 min、max 函數。作用是求最小值和最大值。雖然在功能上很微小。但是在代碼中卻被廣泛使用了,認為值得引入標準庫中。

隨后被 @Robert Griesemer 往內置函數引導,基于 append 和 copy 內置函數的先例,就獲得許多人的點贊認可該觀點,就正式加入內置函數了。

圖片

官方給出的演示代碼如下:

var x, y int
m := min(x)                 // m == x
m := min(x, y)              // m 是 x 和 y 中較小的那個

m := max(x, y, 10)          // m 是 x 和 y 中較大的一個,但至少是10
c := max(1, 2.0, 10)        // c == 10.0(浮點類型)
f := max(0, float32(x))     // f 的類型是 float32

var s []string
_ = min(s...)               // 無效:不允許使用 slice 參數
t := max("", "foo", "bar")  // t == "foo" (string 類型)

對于一些特殊值和清空,例如:浮點參數、負零、NaN和無窮大。min、max 函數結果適用以下規則:

x        y    min(x, y)    max(x, y)

  -0.0    0.0         -0.0          0.0  
  -Inf      y         -Inf            y    
  +Inf      y            y         +Inf    
   NaN      y          NaN          NaN
  • 第一行:負零比(非負)零小。
  • 第二行:負無窮大比任何其他數字都小。
  • 第三行:正無窮大于任何其他數字。
  • 第四行:如果有任何一個參數是 NaN,結果就是 NaN。

新標準庫包

本次在標準庫中新增的包是 cmp(全稱應該是 compare),主要是提供比較、對比等功能。

這塊比較簡單,直接上源碼就懂了:

package cmp

type Ordered interface {
 ~int | ~int8 | ~int16 | ~int32 | ~int64 |
  ~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~uintptr |
  ~float32 | ~float64 |
  ~string
}

func Less[T Ordered](x, y T) bool {
 return (isNaN(x) && !isNaN(y)) || x < y
}

func Compare[T Ordered](x, y T) int {
 xNaN := isNaN(x)
 yNaN := isNaN(y)
 if xNaN && yNaN {
  return 0
 }
 if xNaN || x < y {
  return -1
 }
 if yNaN || x > y {
  return +1
 }
 return 0
}

func isNaN[T Ordered](x T) bool {
 return x != x
}
  • Less:判斷 x 是否小于 y。對于浮點類型,NaN 被認為小于任何非 NaN、 而 -0.0 不小于(等于)0.0。
  • Compare:比較 x 和 y,返回對應預定義的枚舉值:

如果 x 小于 y,則返回 -1

如果 x 等于 y,則返回 0

如果 x 大于 y,則返回 +1

  • isNaN:判斷 x 是否為 NaN。

前面提到的 min、max 內置函數,本來也是要放在 cmp 包里的,不過非常榮幸的被 “提拔” 了。僅留下這幾個方法。

總結

今天給大家分享了 Go1.21 的一些新內置函數 clear、min、max 和新標準庫包 cmp。雖然看起來都是輔助類工具,但他們的加入也是挺費勁的,花了不少時間和討論。

以后寫業務代碼和八股文時,可以適當使用這些函數。又能夠簡化部分代碼和邏輯了。

責任編輯:武曉燕 來源: 腦子進煎魚了
相關推薦

2023-05-05 08:51:18

Go語言泛型

2023-06-19 08:49:55

go文件管理

2023-06-29 08:47:59

GoContext設置

2010-09-10 13:56:25

SQLMAX()函數

2023-08-09 08:53:50

GoWASI語義

2023-07-05 08:47:24

Go版本團隊

2018-04-09 14:26:06

Go語法實踐

2011-09-29 10:34:35

以太網標準

2019-04-10 15:16:17

USB 3.2USB 4接口

2025-03-06 08:54:24

泛型類型MapGo1

2025-01-14 11:01:38

2018-08-03 14:55:23

DDoS網絡勒索網絡攻擊

2022-12-09 08:52:51

Go匿名接口

2022-04-28 07:00:09

min()max()clamp()

2023-12-26 07:37:27

2023-08-02 08:46:02

Go版本號規則

2023-04-09 23:09:59

Go語言函數

2015-10-22 17:18:20

Coding云端軟件

2023-09-27 08:26:48

Go標準庫函數

2022-09-22 07:03:15

Java 18LTSOracle
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久av一区二区三区 | 亚洲福利一区二区 | 国产精品久久久久不卡 | 成人欧美日韩一区二区三区 | 欧美二区在线 | 成人精品一区二区三区四区 | 成人欧美一区二区三区黑人孕妇 | 国产精品免费看 | 国产高清视频在线播放 | 久久99精品久久久久久 | 国产高清视频在线观看 | 国产午夜精品一区二区三区四区 | 国产成人精品免费 | 成人妇女免费播放久久久 | 日韩一区不卡 | 亚洲精品一二三区 | 久久国产精99精产国高潮 | 一级免费视频 | 国产在线激情视频 | 国产激情免费视频 | 精品福利av导航 | 久久精品国产清自在天天线 | 久久久久久国产精品免费 | 国产成人精品一区二区三区 | 亚洲欧美在线视频 | 久久福利网站 | 日韩精品1区2区3区 爱爱综合网 | 日韩一区二区福利 | 亚洲综合视频 | 国产日韩免费视频 | 日韩精品一区二区三区 | 天堂视频免费 | 久久精品一区二区三区四区 | 美女视频. | 99re在线| 欧美极品在线观看 | 国产高清视频一区二区 | 欧美www在线 | 日韩福利在线 | 99re热精品视频国产免费 | 亚洲欧美日韩一区 |