【收藏】开发常用的 10 个通用函数

点击上方蓝色“Golang来啦”关注我哟

加个“星标”,天天 15 分钟,掌握 Go 语言

你好,我是四哥。

以下是一些平时开发常用的通用函数,赶紧收藏起来,一定可以用得上。

1.检查 slice 中某元素是否存在。

Go 语言没有预定义的函数用来检测 slice 中某元素是否存在,下面的代码可以帮你实现。

import "fmt"

func main() {
  // create an array of strings
  slice := []string{"apple", "grapes", "mango"}
  // You can check by changing element to "orange"
  if Contains(slice, "mango") {
    fmt.Println("Slice contains element")
  } else {
    fmt.Println("Slice doesn't contain element")
  }
}

func Contains(slice []string, element string) bool {
   for _, i := range slice {
     if i == element {
       return true
     }
   }
   return false
}


output:
Slice contains element

循环遍历 slice 每个元素,如果能匹配上说明存在,返回 true;否则不存在,返回 false。

2.检查给定的时间是否处于某一时间区间内。

func main() {
  currentTime := time.Now()
  // Time after 18 hours of currentTime
  futureTime := time.Now().Add(time.Hour * 18)
  // Time after 10 hours of currentTime
  intermediateTime := time.Now().Add(time.Hour * 10)
  if intermediateTime.After(currentTime) &&    intermediateTime.Before(futureTime) {
    fmt.Println("intermediateTime is between currentTime and  futureTime")
  } else {
    fmt.Println("intermediateTime is not inbetween currentTime and futureTime")
  }
}

output:
intermediateTime is between currentTime and futureTime

给定两个时间戳,用于检查当前时间是否位于两者之间。Go 标准库的 time 包提供了相应的内置函数 After() 和 Before(),如果两者都返回 true,那么就可以认为当前时间在给定时间之间。

3.计算特定时区的当前时间戳。

import (
 "time"
 "fmt"
)

func main() {
  timeZone := "Asia/Kolkata" // timezone value
  loc, _ := time.LoadLocation(timeZone)
  currentTime = time.Now().In(loc)
  fmt.Println("currentTime : ", currentTime)
}


output:
// for timezone = "Asia/Kolkata"
currentTime :  2022-02-09 10:42:39.164079505 +0530 IST
// for timezone = "Asia/Shanghai"
currentTime :  2022-02-09 13:14:33.986953939 +0800 CST

首先使用 time.LoadLocation() 加载给定时区,然后将其与 time.Now.In() 一起使用,以获取给定时区的当前时间。可以将变量 timeZone 的值修改成我们想要的时区。

4.将较小的数除以较大的数

如果将较小的整数除以较大的整数,则结果为 0,可以使用下面的方案保留小数。

import "fmt"

func main() {
  smallerNo := 5
  largerNo := 25
  result := float32(smallerNo) / float32(largerNo)
  fmt.Println("result : ", result)
}


output:
result : 0.2

将两个数字都转换为浮点数,然后将它们相除,结果将保留小数部分。

5.去重

通过下面的方案可以删除切片中重复项。

import "fmt"

func main() {
  // define array of strings
  fruits := []string{"Mango", "Grapes", "Kiwi", "Apple", "Grapes"}
  fmt.Println("Array before removing duplicates : ", fruits)
  // Array after duplicates removal
  dulicatesRemovedArray := RemoveDuplicatesFromSlice(fruits)
  fmt.Println("Array after removing duplicates : ",  dulicatesRemovedArray)
}

func RemoveDuplicatesFromSlice(intSlice []string) []string {
  keys := make(map[string]bool)
  list := []string{}
  for _, entry := range intSlice {
    if _, value := keys[entry]; !value {
      keys[entry] = true
      list = append(list, entry)
    }
  }
 return list
}


output:
Array before removing duplicates :  [Mango Grapes Kiwi Apple Grapes]
Array after removing duplicates :  [Mango Grapes Kiwi Apple]

我们定义了另一个切片,循环遍历原切片,如果元素在新切片中已经存在就忽略不处理,并返回元素不会重复的切片。

6.随机打乱

Go 语言没有相关的内置函数,可以通过下面代码实现。

import "fmt"

func main() {
  // shuffle array
  array := []string{"India", "US", "Canada", "UK"}
  Shuffle(array)
}

func Shuffle(array []string) {
  // seed random for changing order of elements
  random := rand.New(rand.NewSource(time.Now().UnixNano()))
  for i := len(array) - 1; i > 0; i-- {
     j := random.Intn(i + 1)
     array[i], array[j] = array[j], array[i]
  }
  fmt.Println("Shuffled array : ", array)
}


output:
Shuffled array :  [UK India Canada US]

想要打乱元素,我们必须引入随机数,然后再交换元素。

7.反转

可以通过下面函数来反转切片。

import "fmt"


func main() {
  a := []int{1, 2, 3, 4, 5, 6} // input int array
  reverseArray := ReverseSlice(a)
  fmt.Println("Reverted array : ", reverseArray) // print output
}

func ReverseSlice(a []int) []int {
  for i := len(a)/2 - 1; i >= 0; i-- {
   pos := len(a) - 1 - i
   a[i], a[pos] = a[pos], a[i]
}
 return a
}


output:
Reverted array :  [6 5 4 3 2 1]

8.元素求和

import "fmt"


func main() {
  s := []int{10, 20, 30}
  sum := sumSlice(s)
  fmt.Println("Sum of slice elements : ", sum)
}


func sumSlice(array []int) int {
  sum := 0
  for _, item := range array {
      sum += item
  }
  return sum
}


output:
Sum of slice elements :  60

通过循环遍历 slice 实现求和。

9.将 slice 转换为逗号分隔的字符串

import (
   "fmt"
   "strings"
   "strconv"
)


func main() {
   result := ConvertSliceToString([]int{10, 20, 30, 40})
   fmt.Println("Slice converted string : ", result)
}


func ConvertSliceToString(input []int) string {
   var output []string
   for _, i := range input {
      output = append(output, strconv.Itoa(i))
   }
   return strings.Join(output, ",")
}


output:
Slice converted string :  10,20,30,40

10.将字符串以下划线分割

下面的代码会将给定的字符串以下划线分割。

import (
  "fmt"
  "strings"
  "regexp"
)


func main() {
   snakeCase := ConvertToSnakeCase("ILikeProgrammingINGo123")
   fmt.Println("String in snake case : ", snakeCase)
}

func ConvertToSnakeCase(input string) string {
  var matchChars = regexp.MustCompile("(.)([A-Z][a-z]+)")
  var matchAlpha = regexp.MustCompile("([a-z0-9])([A-Z])")

  snake := matchChars.ReplaceAllString(input, "${1}_${2}")
  snake = matchAlpha.ReplaceAllString(snake, "${1}_${2}")
  return strings.ToLower(snake)
}


output:
String in snake case :  i_like_programming_in_go123

via: https://blog.canopas.com/golang-utility-functions-you-always-missed-ebeabae6b276 >

作者:Nidhi D

推荐阅读:

如何制定目标才能让自己的学习效果更好?

资料下载

点击下方卡片关注公众号,发送特定关键字获取对应精品资料!

  • 回复「电子书」,获取入门、进阶 Go 语言必看书籍。

  • 回复「视频」,获取价值 5000 大洋的视频资料,内含实战项目(不外传)!

  • 回复「路线」,获取最新版 Go 知识图谱及学习、成长路线图。

  • 回复「面试题」,获取四哥精编的 Go 语言面试题,含解析。

  • 回复「后台」,获取后台开发必看 10 本书籍。

对了,看完文章,记得点击下方的卡片。关注我哦~ 👇👇👇

如果您的朋友也在学习 Go 语言,相信这篇文章对 TA 有帮助,欢迎转发分享给 TA,非常感谢!1cc5cd01d6e8ecef02a6115eb421cd75.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Seekload

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值