正文
go语言判断条件取反 golang判断字符串是否包含某字符串
小程序:扫一扫查出行
【扫一扫了解最新限行尾号】
复制小程序
【扫一扫了解最新限行尾号】
复制小程序
go语言里怎么把整数变成负数取相反数?
取一个数的相反数,可以用数学运算来实现:-1 * x的结果就是x的相反数。
golang 正则正则表达式反向查询
基本上所有的语言都有正则表达式,golang也不例外。golang原生使用regexp包进行正则表达式的匹配。正常情况下满足基础的查询功能。但是,golang为了正则表达式的效率一直坚持O(n)的搜索复杂度,所以有些高级特性将无法满足。
正则表达式可以通过\1的形式反向查询之前匹配的数据,但是原生自带的regxp是不支持该特性。所以只能使用第三方库来支持。
golang 正负数取反
想要知道取反计算过程,首先搞懂 “原码“,“反码”,“补码”,“取反”。
0变1,1变0
原码是计算机机器数中最简单的一种形式,数值位就是真值的绝对值。原码表示法在最高位为符号:正数该位为0,负数该位为1,原码又称带符号的绝对值。看整数9及-9的原码如下:
9的原码:0000 1001
-9的原码: 1000 1001
重点:对于源码,绝对值相等的正数和负数只有符号位不同。
反码通常是用来由原码求补码或者由补码求原码的过渡码。正数的反码就是其原码,负数的反码就是将原码除符号位以外每位取反(0变1,1变0)。例如:
9的反码:0000 1001
-9的反码:1111 0110
在计算机系统中,数值一律用补码来表示和存储。正数的原码就是其补码。负数的补码是其反码+1.例如:
9的补码:0000 1001
-9的补码:1111 0111
正整数的原码、反码、补码都是一样的。负数的反码是除符号位其他每一位取反,负数的补码是其反码+1
首先明确一个概念,由于在计算机中二进制都是以其补码形式存放在内存中的。所以要知道 ^9 就是对 9 的补码取反,也就是说无论是整数还是负数对其取反都是对其补码取反。
正数9:
原码为: 0000 1001
反码为: 0000 1001
补码为: 0000 1001
1. 取反结果=负数补码 :0000 1001 --- (取反) 1111 0110
注:由于 ^ 位取反操作符,对于符号位也会取反 所以这里得到一个负数的补码,想要计算其真实的值。还需要将其转换成原码。
2. 得反码:1111 0110 - 1 = 1111 0101
补码 = 反码 + 1 (反推) 反码 = 补码 - 1
3. 得原码 1111 0101 -- 1111 1010 = -10
原码 = 反码取反
负数-9:
原码为: 1111 1001
反码为: 1111 0110
补码为: 1111 0111
1. 取反结果=正数补码 1111 0111 ---- 0000 1000
2. 正数原码 = 反码 = 补码 = 0000 1000 = 8
go语言操作符 ^ 和 &^
很多语言都是采用 ~ 作为按位取反运算符,Go 里面采用的是 ^ 。
如果作为二元运算符,^ 表示按位异或,即:对应位相同为 0,相异为 1。
操作符 ^,按位置零,例如:z = x ^ y,表示如果 y 中的 bit 位为 1,则 z 对应 bit 位为 0,否则 z 对应 bit 位等于 x 中相应的 bit 位的值。
对于有符号的整数来说,是按照补码进行取反操作的(快速计算方法:对数 a 取反,结果为 -(a+1) ),对于无符号整数来说就是按位取反
计算过程
以3为例 3在内存中补码为 0*** 0011
取反 1*** 1100
-1操作 1*** 1011
除符号位取反 1*** 0100 结果为-4
-------------------------------------------
以9为例 9在内存中补码为 0*** 1001
取反 1*** 0110
-1操作 1*** 0101
除符号位取反 1*** 1010 结果为-10
-------------------------------------------
以-5为例 -5在内存中为的补码为 1*** 1011
为什么呢
-5源码 1*** 0101
除符号取反 1*** 1010
+1操作 1*** 1011
-------------------------------------------
那么-5取反怎么算
补码 1***1011取反为 0***0100
因为符号位为0,所以是正数了,正数的补码反码源码都是一个,所以是4
===================================
再看-1
-1源码 1*** 0001
除符号取反 1*** 1110
+1操作 1*** 1111
补码 1*** 1111 取反为 0*** 0000
因为符号位为0,所以是正数了,正数的补码反码源码都是一个,所以是0
go语言取反输出的例子看这里
go语言的reflect(反射)
1、反射可以在运行时 动态获取变量的各种信息 ,比如变量的类型、类别;
2、如果是结构体变量,还可以获取到结构体本身的信息(包括结构体的字段、方法);
3、通过反射,可以修改 变量的值 ,可以调用关联的方法;
4、使用反射,需要import " reflect ".
5、示意图:
1、不知道接口调用哪个函数,根据传入参数在运行时确定调用的具体接口,这种需要对函数或方法反射。
例如以下这种桥接模式:
示例第一个参数funcPtr以接口的形式传入函数指针,函数参数args以可变参数的形式传入,bridge函数中可以用反射来动态执行funcPtr函数。
1、reflect.TypeOf(变量名),获取变量的类型,返回reflect.Type类型。
2、reflect.ValueOf(变量名),获取变量的值,返回reflect.Value类型reflect.Value是一个结构体类型。
3、变量、interface{}和reflect.Value是可以互相转换的,这点在实际开发中,会经常使用到。
1、reflect.Value.Kind,获取变量的 类别(Kind) ,返回的是一个 常量 。在go语言文档中:
示例如下所示:
输出如下:
Kind的范畴要比Type大。比如有Student和Consumer两个结构体,他们的 Type 分别是 Student 和 Consumer ,但是它们的 Kind 都是 struct 。
2、Type是类型,Kind是类别,Type和Kind可能是相同的,也可能是不同的。
3、通过反射可以在让 变量 在 interface{} 和 Reflect.Value 之间相互转换,这点在前面画过示意图。
4、使用反射的方式来获取变量的值(并返回对应的类型),要求数据类型匹配,比如x是int,那么久应该使用reflect.Value(x).Int(),而不能使用其它的,否则报panic。
如果是x是float类型的话,也是要用reflect.Value(x).Float()。但是如果是struct类型的话,由于type并不确定,所以没有相应的方法,只能 断言。
5、通过反射的来修改变量,注意当使用SetXxx方法来设置需要通过对应的指针类型来完成,这样才能改变传入的变量的值,同时需要使用到reflect.Value.Elem()方法。
输出num=20,即成功使用反射来修改传进来变量的值。
6、reflect.Value.Elem()应该如何理解?
关于go语言判断条件取反和golang判断字符串是否包含某字符串的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。