diff --git a/readme.md b/readme.md index 2046922..cba9bb1 100644 --- a/readme.md +++ b/readme.md @@ -62,6 +62,8 @@ 2020/11/25:完善linq包使用示例 +2020/12/7 :更新bit位操作工作 BitTool + # mod vendor模式加载包 通过go mod的方式加载的github上面的包会有报红的问题,但是包本身是可以运行的,这样就是会有一个问题,如果你想要点击去看方法的内容,没办法做到 diff --git a/util/bitOperation/BitTool.go b/util/bitOperation/BitTool.go new file mode 100644 index 0000000..e195859 --- /dev/null +++ b/util/bitOperation/BitTool.go @@ -0,0 +1,58 @@ +/* + * @Author : huangzj + * @Time : 2020/12/3 11:56 + * @Description:比特位操作的工作类,主要参考:https://learnku.com/go/t/23460/bit-operation-of-go 实现的工具 + */ + +package bitOperation + +import ( + "fmt" +) + +//判断num的二进制表示某个位置是否为1 +func JudgeOneWithPosition(num int, position int) bool { + if position < 1 { + panic(fmt.Sprintf("输入有误:Position不能小于1,当前出入的Position为%d", position)) + } + return num&(1<= 0 +} + +//设置某一个数num的二进制Position位为0 +func SetZeroBuPosition(num int, position int) int { + if position < 1 { + panic(fmt.Sprintf("输入有误:Position不能小于1,当前出入的Position为%d", position)) + } + return num &^ (1 << uint(position-1)) +} diff --git a/util/bitOperation/BitTool_test.go b/util/bitOperation/BitTool_test.go new file mode 100644 index 0000000..f76d0fb --- /dev/null +++ b/util/bitOperation/BitTool_test.go @@ -0,0 +1,131 @@ +/* + * @Author : huangzj + * @Time : 2020/12/3 14:11 + * @Description: + */ + +package bitOperation + +import ( + "fmt" + "testing" +) + +func TestBitTool(t *testing.T) { + JudgeIfEvenTest() + JudgeIfOddTest() + JudgeOneWithPositionTest() + JudgeOnlyOneBitWithOneTest() + JudgeWithEqualSymbolTest() + SetOneByPositionTest() + SetZeroBuPositionTest() + +} + +func SetZeroBuPositionTest() { + fmt.Println("设置某个位置上的元素为0") + fmt.Println(fmt.Sprintf("原始: %16b", 1)) + fmt.Println(fmt.Sprintf("结果:%16b", SetZeroBuPosition(1, 1))) + fmt.Println(fmt.Sprintf("原始: %16b", 10)) + fmt.Println(fmt.Sprintf("结果:%16b", SetZeroBuPosition(10, 2))) + fmt.Println(fmt.Sprintf("原始: %16b", 20)) + fmt.Println(fmt.Sprintf("结果:%16b", SetZeroBuPosition(20, 5))) + fmt.Println(fmt.Sprintf("原始: %16b", 101)) + fmt.Println(fmt.Sprintf("结果:%16b", SetZeroBuPosition(101, 6))) + fmt.Println(fmt.Sprintf("原始: %16b", 20121)) + fmt.Println(fmt.Sprintf("结果:%16b", SetZeroBuPosition(20121, 8))) + fmt.Println(fmt.Sprintf("原始: %16b", 821331)) + fmt.Println(fmt.Sprintf("结果:%16b", SetZeroBuPosition(821331, 12))) + fmt.Println(fmt.Sprintf("原始: %16b", 821331)) + fmt.Println(fmt.Sprintf("结果:%16b", SetZeroBuPosition(821331, 3))) + fmt.Println() + fmt.Println() +} + +func SetOneByPositionTest() { + fmt.Println("设置某个位置上的元素为1") + fmt.Println(fmt.Sprintf("原始: %16b", 2)) + fmt.Println(fmt.Sprintf("结果:%16b", SetOneByPosition(2, 1))) + fmt.Println(fmt.Sprintf("原始: %16b", 10)) + fmt.Println(fmt.Sprintf("结果:%16b", SetOneByPosition(10, 1))) + fmt.Println(fmt.Sprintf("原始: %16b", 20)) + fmt.Println(fmt.Sprintf("结果:%16b", SetOneByPosition(20, 1))) + fmt.Println(fmt.Sprintf("原始: %16b", 101)) + fmt.Println(fmt.Sprintf("结果:%16b", SetOneByPosition(101, 4))) + fmt.Println(fmt.Sprintf("原始: %16b", 20121)) + fmt.Println(fmt.Sprintf("结果:%16b", SetOneByPosition(20121, 6))) + fmt.Println(fmt.Sprintf("原始: %16b", 821331)) + fmt.Println(fmt.Sprintf("结果:%16b", SetOneByPosition(821331, 11))) + fmt.Println(fmt.Sprintf("原始: %16b", 821331)) + fmt.Println(fmt.Sprintf("结果:%16b", SetOneByPosition(821331, 2))) + + fmt.Println() + fmt.Println() +} + +func JudgeWithEqualSymbolTest() { + fmt.Println("判断两个数正负符号是否一致") + fmt.Println(JudgeWithEqualSymbol(10, 20)) + fmt.Println(JudgeWithEqualSymbol(10, -20)) + fmt.Println(JudgeWithEqualSymbol(-10, -20)) + fmt.Println() + fmt.Println() +} + +func JudgeOneWithPositionTest() { + fmt.Println("判断二进制表示的某个位上是否为1") + fmt.Println(fmt.Sprintf("%16b", 1)) + fmt.Println(JudgeOneWithPosition(1, 1)) + fmt.Println(JudgeOneWithPosition(1, 2)) + fmt.Println(fmt.Sprintf("%16b", 10)) + fmt.Println(JudgeOneWithPosition(10, 2)) + fmt.Println(JudgeOneWithPosition(10, 3)) + fmt.Println(fmt.Sprintf("%16b", 501)) + fmt.Println(JudgeOneWithPosition(501, 7)) + fmt.Println(JudgeOneWithPosition(501, 2)) + fmt.Println() + fmt.Println() +} + +func JudgeIfOddTest() { + fmt.Println("奇数的判断") + fmt.Println(JudgeIfOdd(1)) + fmt.Println(JudgeIfOdd(2)) + fmt.Println(JudgeIfOdd(101)) + fmt.Println(JudgeIfOdd(200)) + fmt.Println(JudgeIfOdd(91231)) + fmt.Println(JudgeIfOdd(8321312)) + fmt.Println() + fmt.Println() +} + +func JudgeIfEvenTest() { + fmt.Println("偶数的判断") + fmt.Println(JudgeIfEven(1)) + fmt.Println(JudgeIfEven(2)) + fmt.Println(JudgeIfEven(101)) + fmt.Println(JudgeIfEven(200)) + fmt.Println(JudgeIfEven(91231)) + fmt.Println(JudgeIfEven(8321312)) + fmt.Println() + fmt.Println() +} + +func JudgeOnlyOneBitWithOneTest() { + fmt.Println("判断二进制表示是不是只有一个位为1") + fmt.Println(JudgeOnlyOneBitWithOne(1)) + fmt.Println(JudgeOnlyOneBitWithOne(2)) + fmt.Println(JudgeOnlyOneBitWithOne(3)) + fmt.Println(JudgeOnlyOneBitWithOne(4)) + fmt.Println(JudgeOnlyOneBitWithOne(56)) + fmt.Println(JudgeOnlyOneBitWithOne(64)) + fmt.Println() + fmt.Println(JudgeOnlyOneBitWithOne(-1)) + fmt.Println(JudgeOnlyOneBitWithOne(-2)) + fmt.Println(JudgeOnlyOneBitWithOne(-3)) + fmt.Println(JudgeOnlyOneBitWithOne(-4)) + fmt.Println(JudgeOnlyOneBitWithOne(-56)) + fmt.Println(JudgeOnlyOneBitWithOne(-64)) + fmt.Println() + fmt.Println() +} diff --git a/util/linqUse/LinqUse_test.go b/util/linqUse/LinqUse_test.go index b4884b6..c8e0adf 100644 --- a/util/linqUse/LinqUse_test.go +++ b/util/linqUse/LinqUse_test.go @@ -20,39 +20,58 @@ import ( func Test(t *testing.T) { - //Aggregate() //自定义聚合操作 + Aggregate() //自定义聚合操作 - //All() //判断数组的所有元素是否都满足条件 + All() //判断数组的所有元素是否都满足条件 - //AnyWith() //判断数组是否有任意个元素满足条件 + Where() //根据条件查询对应的元素 - //Calculate() //这个方法只能计算数值类型 + AnyWith() //判断数组是否有任意个元素满足条件 - //Combine() //组合两个数组的两种方式 + Calculate() //这个方法只能计算数值类型 - //Distinct() //返回数组中唯一的元素 + Combine() //组合两个数组的两种方式 - //Except() //返回第一个序列没有出现在第二个序列中的成员 + Contains() //包含 - //GroupBy() //按照对应规则进行分组 + FirstAndLast() //第一个和最后一个 - //Intersect() //产生两个数组的交集 + Distinct() //返回数组中唯一的元素 - //Join() //对两个有关联的数据进行处理 + Except() //返回第一个序列没有出现在第二个序列中的成员 - //OrderBy() //排序 + GroupBy() //按照对应规则进行分组 - //Select() //筛选结构体中对应的元素 + Intersect() //产生两个数组的交集 - //SelectMany() //对多维数组进行合并或者其他处理 对结构体中的数组进行处理(与结构体结合操作) + OrderBy() //排序 - //Skip() //略过指定条件的元素 + Skip() //略过指定条件的元素 - //Count() //计算数组总长度 + Count() //计算数组总长度 - //Result() //对结果集进行操作 + Result() //对结果集进行操作 Take() //获取对应数量的元素,一般多用在排序后前几个的元素 + + Select() //筛选结构体中对应的元素 + + SelectMany() //对多维数组进行合并或者其他处理 对结构体中的数组进行处理(与结构体结合操作) + + Join() //对两个有关联的数据进行处理 + +} + +func Where() { + bookList := MakeBook() + query := linq.From(bookList) + fmt.Println() + fmt.Println() + query.WhereT(func(book Book) bool { + return book.Money > float64(70) + }).ForEachT(func(book Book) { + fmt.Println(fmt.Sprintf("作者%v,写了一本书叫做%v", book.Author, book.Name)) + }) } func Take() { @@ -82,6 +101,16 @@ func Take() { }).Take(-2).ForEachT(func(book Book) { fmt.Println(fmt.Sprintf("作者%v,写了一本书叫做%v", book.Author, book.Name)) }) + + //TakeWhile系列的方法,虽然能够根据条件进行查询,但是有一个弊端就是一旦查询到的结果和条件不符合则直接返回,也就是说后面满足条件的元素不会再被做筛选 + //那么比如这边的这个大于的操作,就需要对整个数组进行排序之后然后进行筛选,如果不希望排序,则用原生的for循环可能会更好 + fmt.Println() + fmt.Println() + query.TakeWhileT(func(book Book) bool { + return book.Money > float64(70) + }).ForEachT(func(book Book) { + fmt.Println(fmt.Sprintf("作者%v,写了一本书叫做%v", book.Author, book.Name)) + }) } func Result() { @@ -136,6 +165,16 @@ func Result() { for key, value := range bookMap2 { fmt.Println(fmt.Sprintf("作者%v,写了一本书叫做%v", key, value.Name)) } + + fmt.Println() + fmt.Println() + bookListResult := make([]Book, 0) + linq.From(MakeBook()).OrderByDescendingT(func(book Book) string { + return book.Author + }).ToSlice(&bookListResult) + for _, value := range bookListResult { + fmt.Println(fmt.Sprintf("作者%v,写了一本书叫做%v", value.Author, value.Name)) + } } func Count() { @@ -430,15 +469,19 @@ func Combine() { fmt.Println(fmt.Sprintf("第一个元素是%v", query2.First())) } -func FirstAndLast(query linq.Query) { +func FirstAndLast() { + bookList := MakeBook() + query := linq.From(bookList) fmt.Println(fmt.Sprintf("数组第一本书书名叫:%s", query.First().(Book).Name)) - fmt.Println(fmt.Sprintf("数组第一本书发布时间在2020年1月1号之前的书书名叫:%s", query.FirstWith(PublishTimeBeforeFunc).(Book).Name)) + fmt.Println(fmt.Sprintf("数组第一本书发布时间在2018年1月1号之后的书书名叫:%s", query.FirstWith(PublishTimeAfterFunc).(Book).Name)) fmt.Println(fmt.Sprintf("数组最后一本书书名叫:%s", query.Last().(Book).Name)) - fmt.Println(fmt.Sprintf("数组最后一本书发布时间在2020年1月1号之前的书书名叫:%s", query.LastWith(PublishTimeBeforeFunc).(Book).Name)) + fmt.Println(fmt.Sprintf("数组最后一本书发布时间在2018年1月1号之后的书书名叫:%s", query.LastWith(PublishTimeAfterFunc).(Book).Name)) } -func Contains(query linq.Query) { +func Contains() { + bookList := MakeBook() + query := linq.From(bookList) //这边需要注意是的是如果要判断两个元素是否相等,在go里面不能使用元素的地址 // 所以这边加到query里面的必须不能是元素的地址,否则没办法比较结构体本身,而是比较结构体的地址 fmt.Println(fmt.Sprintf("判断当前数组是否包含相同的元素,判断的是所有的值,而不是地址,结果是%v", query.Contains(Book{