golang 通用Contains方法分享

今天在群里看见有人写了一个InAarry方法,主要作用是判断一个元素是否在slice中,看完后,我感觉方法应该还有扩展的空间

于是自己重新写了一个Contains方法

可以支持 slice,array,map等类型

package main
import (
    "errors"
    "fmt"
    "reflect"
)

// 判断obj是否在target中,target支持的类型arrary,slice,map
func Contain(obj interface{}, target interface{}) (bool, error) {
    targetValue := reflect.ValueOf(target)
    switch reflect.TypeOf(target).Kind() {
    case reflect.Slice, reflect.Array:
        for i := 0; i < targetValue.Len(); i++ {
            if targetValue.Index(i).Interface() == obj {
                return true, nil
            }
        }
    case reflect.Map:
        if targetValue.MapIndex(reflect.ValueOf(obj)).IsValid() {
            return true, nil
        }
    }

    return false, errors.New("not in array")
}

func main() {
    testMap()
    testArray()
    testSlice()
}

func testArray() {
    a := 1
    b := [3]int{1, 2, 3}

    fmt.Println(Contain(a, b))

    c := "a"
    d := [4]string{"b", "c", "d", "a"}
    fmt.Println(Contain(c, d))

    e := 1.1
    f := [4]float64{1.2, 1.3, 1.1, 1.4}
    fmt.Println(Contain(e, f))

    g := 1
    h := [4]interface{}{2, 4, 6, 1}
    fmt.Println(Contain(g, h))

    i := [4]int64{}
    fmt.Println(Contain(a, i))
}

func testSlice() {
    a := 1
    b := []int{1, 2, 3}

    fmt.Println(Contain(a, b))

    c := "a"
    d := []string{"b", "c", "d", "a"}
    fmt.Println(Contain(c, d))

    e := 1.1
    f := []float64{1.2, 1.3, 1.1, 1.4}
    fmt.Println(Contain(e, f))

    g := 1
    h := []interface{}{2, 4, 6, 1}
    fmt.Println(Contain(g, h))

    i := []int64{}
    fmt.Println(Contain(a, i))
}

func testMap() {
    var a = map[int]string{1: "1", 2: "2"}
    fmt.Println(Contain(3, a))

    var b = map[string]int{"1": 1, "2": 2}
    fmt.Println(Contain("1", b))

    var c = map[string][]int{"1": {1, 2}, "2": {2, 3}}
    fmt.Println(Contain("6", c))
}

补充:golang中的strings.ContainsAny

golang中的字符串操作strings.ContainsAny

package main
import (
        "fmt"
        "strings"
)

//golang字符串操作
func main(){
        s := "hello world hello world"
        str := "wo"

        //判断字符串s中是否包含个子串str中的任何一个字符。包含则返回true,
        //如果str为空则返回false
        index := strings.ContainsAny(s,str)
        fmt.Println(index) //true
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • golang goroutine顺序输出方式

    range字符串,使用goroutine打印 因为goroutine随机执行 for _, v := range str { go func() { fmt.Println(string(v)) }() } 输出: 5 5 5 5 5 可以使用chan顺序输出 for _, c := range str{ ch := make(chan rune) go func(ch <-chan rune) { key := <-ch fmt.Println(string(key)) }(ch) ch &

  • Golang 如何实现函数的任意类型传参

    大家还是直接看代码吧~ package main import ( "fmt" ) func init() { fmt.Print("init") } func main() { test1("123") test1(1) test2("123",1, "324", 12) } // 实现传单个任何类型的参数 func test1(v interface{}) { fmt.Println(v) // 打印

  • Golang 使用Map实现去重与set的功能操作

    假设现在有一个需求 将以下 url 保存起来,要求不重复 www.baidu.com www.sina.com.cn www.hao123.com www.baidu.com www.hao123.com 可以利用 map 的 key 唯一性的问题处理 package main var set = map[string]bool { } func main() { ... url := xxx if set[url] { // 表示集合中已经存在 return } set[url] = true

  • 使用Golang的channel交叉打印两个数组的操作

    Go的channel提供了强大的同步功能,那么如何使用channel交叉打印两个数组呢? 灰常简单,只需设置两个channel变量 数组1打印完一个值就用channel通知数组2,同理数组2打印完一个值用另一个channel通知数组1,即可实现同步 package main import "fmt" func main(){ ch1 :=make(chan int) ch2 :=make(chan string) str :=[5]string{"a","

  • 解决golang在import自己的包报错的问题

    原因: 使用git clone项目后,项目根路径是小写英文名称,比如cmdbapi,但是项目里面的import导入自己的相关包时,红色报错 解决: 把项目名称改写成import导入包的名称,即cmdbApi.当然也可以将import导入包改写成小写. 补充:golang之import导入包的一些特殊用法 我们学习了golang之后,晓得关键字import是go的包导入语法,而且我们的第一个程序通常都需要输出hello world. 示例如下: import( "fmt" ) fmt.P

  • Golang中Bit数组的实现方式

    Go语言里的集合一般会用map[T]bool这种形式来表示,T代表元素类型.集合用map类型来表示虽然非常灵活,但我们可以以一种更好的形式来表示它. 例如在数据流分析领域,集合元素通常是一个非负整数,集合会包含很多元素,并且集合会经常进行并集.交集操作,这种情况下,bit数组会比map表现更加理想. 一个bit数组通常会用一个无符号数或者称之为"字"的slice来表示,每一个元素的每一位都表示集合里的一个值.当集合的第i位被设置时,我们才说这个集合包含元素i. 下面的这个程序展示了一个

  • 解决Golang time.Parse和time.Format的时区问题

    一.问题描述 在windows下,time.Parse()的时区和time.Format()的时区是一致的. 但是在linux环境下,time.Parse()的默认时区是UTC,time.Format()的时区默认是本地,两者如果不处理好就会导致错误. package main import "time" import "fmt" func main(){ t, err := time.Parse("2006-01-02 15:04:05", &

  • golang 在windows中设置环境变量的操作

    安装完成后需要在系统环境变量中设置 GOPATH为项目目录 GOROOT为安装目录 path中设置好安装目录到bin目录 打开cmd,输入go env,出现如下配置生效 补充:Golang 环境变量须知 1.前言 无论你是使用 Windows.Linux 还是 Mac 操作系统来开发 Go 应用程序,在安装好 Go 安装语言开发工具之后,都必须配置好 Go 语言开发所要求的 环境变量,才算初步完成 Go 开发环境的搭建. 但对于一些初学者来说,可能不太明白 Go 语言中常用的环境变量的作用以及如

  • golang 通用Contains方法分享

    今天在群里看见有人写了一个InAarry方法,主要作用是判断一个元素是否在slice中,看完后,我感觉方法应该还有扩展的空间 于是自己重新写了一个Contains方法 可以支持 slice,array,map等类型 package main import ( "errors" "fmt" "reflect" ) // 判断obj是否在target中,target支持的类型arrary,slice,map func Contain(obj inte

  • Asp.Net类型转换类(通用类)代码分享

    废话不多说了,直接给大家贴代码了,具体代码如下所述: /// <summary> /// 类型转换类 /// 处理数据库获取字段为空的情况 /// </summary> public static class DBConvert { #region------------------ToInt32类型转换------------------ /// <summary> /// 读取数据库中字符串并转换成Int32 /// 为空时返回0 /// </summary&

  • JSP过滤器防止Xss漏洞的实现方法(分享)

    在用java进行web业务开发的时候,对于页面上接收到的参数,除了极少数是步可预知的内容外,大量的参数名和参数值都是不会出现触发Xss漏洞的字符.而通常为了避免Xss漏洞,都是开发人员各自在页面输出和数据入库等地方加上各种各样的encode方法来避免Xss问题.而由于开发人员的水平不一,加上在编写代码的过程中安全意识的差异,可能会粗心漏掉对用户输入内容进行encode处理.针对这种大量参数是不可能出现引起Xss和SQL注入漏洞的业务场景下,因此可以使用一个适用大多数业务场景的通用处理方法,牺牲少

  • 在django中,关于session的通用设置方法

    最近发现session的知识有点脱节了,默认设置愣是搞半天,看来忘了不少.今天把一些通用设置贴上来,以备随时回顾. 配置文件中设置默认操作(通用配置): SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认) SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径(默认) SESSION_COOKIE_DOMAIN

  • 一个吸顶Item的简单实现方法分享

    一般的对于上图样式的Sticker我们使用CoordinatorLayout & AppBarLayout就可以说实现. 但是对于下面这种呢? 我的实现思路 首先整个页面的UI结构是通过RecyclerView实现的. 对于上面这个Sticker的实现是在布局的最上方添加了一个和RecyclerView中要吸顶的Item一模一样的布局.然后监听RecyclerView的滚动: mPostDetailRv.addOnScrollListener(object : RecyclerView.OnSc

  • Redis优雅地实现延迟队列的方法分享

    目录 前言 使用 依赖配置 配置文件 demo代码 执行效果 原理分析 队列创建 生产者 消费者 整个流程 总结思考 前言 工作中常常会遇到这样的场景,如订单到期未支付取消,到期自动续费等,我们发现延迟队列非常适合在这样的场景中使用.常见的延迟队列的优秀实现有rabbitMQ的死信队列,RocketMQ的延迟队列等,但是了有时候项目没有特别的大,没有引入类似的消息中间件,但是了又遇到了特别适合使用延迟队列的场景,我们一般会利用已有的redis实现一个简陋的延迟队列.常见的实现方式有监听过期key

  • navicat不能创建函数解决方法分享

    第一次写MySQL FUNCTION,一直报错, Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '`company_id` int) RETURNS varchar(20) CHARSET utf8 BEGIN 本来的函数: CREATE DEFINER

  • node.js express安装及示例网站搭建方法(分享)

    1.首先肯定是要安装Node.JS windows cmd依次输入如下命令: cd C:\Program Files\nodejs\ npm install -g express npm install -g express-generator 2.创建一个示例工程 windows cmd依次输入如下命令: cd C:\Program Files\nodejs\node_global express -e microblog //即ejs,-j(即jade) cd microblog npm i

  • python中常用的九种预处理方法分享

    本文总结的是我们大家在python中常见的数据预处理方法,以下通过sklearn的preprocessing模块来介绍; 1. 标准化(Standardization or Mean Removal and Variance Scaling) 变换后各维特征有0均值,单位方差.也叫z-score规范化(零均值规范化).计算方式是将特征值减去均值,除以标准差. sklearn.preprocessing.scale(X) 一般会把train和test集放在一起做标准化,或者在train集上做标准化

  • PHP5.5.15+Apache2.4.10+MySQL5.6.20配置方法分享

    对于学习php的新手,由于网上的配置方法都是很久之前的,及时性不高,环境配置往往令人很头疼,我初学php配置环境时配置了3个晚上,每次总是会出现这样或那样的问题,如今把最新版的PHP5.5.15+Apache2.4.10+MySQL5.6.20,win7x86的配置方法分享给大家,64位的同理,不过下载的软件需要也是64位的. 环境:win7 32.(64位的同理,下载相关软件必须是对应的64位版本) PHP5.5.15(php-5.5.15-Win32-VC11-x86.zip) Apache

随机推荐