关于数据类型:GO语言学习基本数据类型整型浮点型复数布尔值fmt占位符

根本数据类型 整型 整型分为以下两个大类: 按长度分为:int8、int16、int32、int64 对应的无符号整型:uint8、uint16、uint32、uint64 其中,uint8就是咱们熟知的byte型,int16对应C语言中的short型,int64对应C语言中的long型。 类型 形容 uint8 无符号 8位整型 (0 到 255)uint16 无符号 16位整型 (0 到 65535)uint32 无符号 32位整型 (0 到 4294967295)uint64 无符号 64位整型 (0 到 18446744073709551615)int8 有符号 8位整型 (-128 到 127)int16 有符号 16位整型 (-32768 到 32767)int32 有符号 32位整型 (-2147483648 到 2147483647)int64 有符号 64位整型 (-9223372036854775808 到 9223372036854775807) 非凡整型 类型 形容 uint 32位操作系统上就是uint32,64位操作系统上就是uint64int 32位操作系统上就是int32,64位操作系统上就是int64uintptr 无符号整型,用于寄存一个指针 留神: 在应用int和 uint类型时,不能假设它是32位或64位的整型,而是思考int和uint可能在不同平台上的差别。 注意事项 获取对象的长度的内建len()函数返回的长度能够依据不同平台的字节长度进行变动。理论应用中,切片或 map 的元素数量等都能够用int来示意。在波及到二进制传输、读写文件的构造形容时,为了放弃文件的构造不会受到不同编译指标平台字节长度的影响,不要应用int和 uint。 package main import "fmt" // 整型 ...

April 18, 2022 · 2 min · jiezi

Mongodb的实践二初识

Mongodb 系列教程Mongodb的实践一:安装Mongodb的实践二:初识Mongodb的实践三:Mongodb的实践四:Mongodb的实践五:Mongodb的实践六:Mongodb的实践七:Mongodb的实践八:术语db->数据库collection->集合document->文档index->索引cluster->集群shard->分片 数据类型MongoDB文档存储是使用BSON类型类型的官方文档:https://docs.mongodb.com/manu...BSON官网:http://bsonspec.org/ TypeNumberAliasNotesDouble1“double” String2“string” Object3“object” Array4“array” Binary data5“binData”Undefined6“undefined”Deprecated.ObjectId7“objectId” Boolean8“bool” Date9“date” Null10“null” Regular Expression11“regex” DBPointer12“dbPointer”Deprecated.JavaScript13“javascript” Symbol14“symbol”Deprecated.JavaScript (with scope)15“javascriptWithScope” 32-bit integer16“int” Timestamp17“timestamp” 64-bit integer18“long” Decimal12819“decimal”New in version 3.4.Min key-1“minKey” Max key127“maxKey” 常用数据类型后续实例说明 内建的角色组https://docs.mongodb.com/manu... Database User Roles 这个是针对非系统数据库和部分系统表的角色组Database Administration Roles 可以操作所有数据库Cluster Administration Roles 管理员族 针对整个系统进行管理Backup and Restoration Roles 备份还原角色组All-Database Roles 角色里面有一些跟超管差不多了级别了,针对所有数据库的Superuser Roles 超级管理员 不用多说了Internal Role 内部系统角色MongoDB 通过角色基本权限控制授予(用户)数据和命令的使用权,并且提供给内置角色数据系统一般需要的不同层次的权限。另外,你也可以创建用户定义角色。 角色授予对定义的资源执行一组操作的权限。给定的角色应用于定义它的数据库,并且可以授予对粒度集合级别的访问权限 MongoDB的每个内置角色在数据库级别为角色数据库中的所有非系统集合定义访问权限,在收集级别为所有系统集合定义访问权限MongoDB在每个数据库上提供内置的数据库用户和数据库管理角色。MongoDB仅在管理数据库上提供所有其他内置角色。 本节描述每个内置角色的权限。您还可以随时查看内置角色的权限,方法是发出rolesinfo命令,并将showprivileges和showbuiltinroles字段都设置为true。 Database User Roles (数据库用户角色)每个数据库都包含以下客户角色: read(只读)提供读取所有非系统集合和以下系统集合上的数据的能力:system.indexes, system.js, and system.namespaces集合 ...

July 8, 2019 · 4 min · jiezi

从入门到放弃Java并发编程NIOBuffer

前言上篇【从入门到放弃-Java】并发编程-NIO-Channel中我们学习到channel是双向通道,数据通过channel在实体(文件、socket)和缓冲区(buffer)中可以双向传输。 本文我们就来学习下buffer 简介buffer即缓冲区,实际上是一块内存,可以用来写入、读取数据。是一个线性的、大小有限的、顺序承载基础数据类型的内存块。 buffer有三个重要的属性: capacity:缓冲池大小,是不可变的。当buffer写满时,需要先清空才能继续写入。limit:是buffer中不可以被读或者写的第一个元素的位置,limit的大小永远不会超过capacity(在写模式下,limit等于capacity)position:是buffer中可以被读或者写的第一个元素的位置,position的大小永远不会超过limit除了boolean外,每一个基础数据类型都有对应的buffer。如:ByteBuffer、CharBuffer、LongBuffer等 buffer不是线程安全的,如果要在多线程中使用 需要加锁控制 接下来以ByteBuffer为例开始学习。 ByteBufferallocateDirectpublic static ByteBuffer allocateDirect(int capacity) { //会创建一个容量大小为capacity的DirectByteBuffer(ByteBuffer的子类) return new DirectByteBuffer(capacity);}allocatepublic static ByteBuffer allocate(int capacity) { if (capacity < 0) throw createCapacityException(capacity); //会创建一个容量大小为capacity的HeapByteBuffer(ByteBuffer的子类) return new HeapByteBuffer(capacity, capacity);}HeapByteBuffer和DirectByteBuffer的区别: DirectByteBuffer是直接调用native方法在本机os::malloc()创建堆外内存;HeapByteBuffer是直接在jvm的堆中分配内存。当buffer中的数据和磁盘、网络等的交互都在操作系统的内核中发生时,使用DirectByteBuffer能避免从内核态->用户态->内核态的切换开销,所有的处理都在内核中进行,性能会比较好当频繁创建操作数据量比较小的buffer时,使用HeapByteBuffer在jvm堆中分配内存能抵消掉使用DirectByteBuffer带来的好处。wrappublic static ByteBuffer wrap(byte[] array, int offset, int length){ try { return new HeapByteBuffer(array, offset, length); } catch (IllegalArgumentException x) { throw new IndexOutOfBoundsException(); }}public static ByteBuffer wrap(byte[] array) { return wrap(array, 0, array.length); }将byte数组包装成一个ByteBuffer ...

July 8, 2019 · 2 min · jiezi

乐字节Java变量与数据类型之三数据类型与转义字符

大家好,小乐又来了,上一篇:乐字节Java变量与数据类型之二:Java常量与变量, 今天接着讲Java变量与数据类型之三:数据类型与转义字符。 一、数据类型1、定义Java是一种强类型语言,针对每种数据都提供了对应的数据类型。 Java数据类型 2、分类A:基本数据类型:4类8种 B:引用数据类型:类,接口,数组。 3、基本数据类型①整型 占用字节数 比特/位 取值范围 byte(字节型) 1 8位 [-128 , 127] short(短整型) 2 16位 [-32768,32767] int (整型 ) 4 32位 [-21亿, 21亿] long(长整型) 8 64位 很大很大 注意:整数数值默认为int类型,如果需要定义一个long类型的变量,当超出int的范围时,需要在该值后加 l或者L ②浮点型 float(单精度) 4 double(双精度) 8 float有效位是7位,double有效位是14位 注意:浮点数默认为double类型,如果需要定义一个float类型的变量,则数值后需要加 f或者F ③字符型(0~65535) char(字符型) 2 一个字符能存储一个中文汉字 要求:用 ' '将字符括起来 ④逻辑型(布尔型) boolean(布尔类型) 1位 4、注意:整数默认是int类型,浮点数默认是double。 长整数要加L或者l,单精度的浮点数要加F或者f。 二、数据类型转换1、定义boolean类型不参与转换 2、默认转换A:从小到大 B:byte,short,char --> int long float double C:byte,short,char之间是平级的,不相互转换,直接转成int类型参与运算。 3、强制转换A:从大到小 B:可能会有精度的损失,一般不建议这样使用。 C:格式: 目标数据类型 变量名 = (目标数据类型) (被转换的数据); ...

July 5, 2019 · 1 min · jiezi

Teradata应用迁移到AnalyticDB-for-PostgreSQL指导

AnalyticDB for PostgreSQL(简称:ADB for PG)对Teradata语法有着很好的兼容,将Teradata应用迁移到ADB for PG,只需进行有限的修改。本文介绍将Teradata应用迁移到ADB for PG应该注意的事项。 1 建表语句我们通过一个例子比较ADB for PG和Teradata的建表语句。对于如下的Teradata建表SQL语句, CREATE MULTISET TABLE test_table,NO FALLBACK , NO BEFORE JOURNAL, NO AFTER JOURNAL, CHECKSUM = DEFAULT, DEFAULT MERGEBLOCKRATIO ( first_column DATE FORMAT 'YYYYMMDD' TITLE '第一列' NOT NULL, second_column INTEGER TITLE '第二列' NOT NULL , third_column CHAR(6) CHARACTER SET LATIN CASESPECIFIC TITLE '第三列' NOT NULL , fourth_column CHAR(20) CHARACTER SET LATIN CASESPECIFIC TITLE '第四列' NOT NULL, fifth_column CHAR(1) CHARACTER SET LATIN CASESPECIFIC TITLE '第五列' NOT NULL, sixth_column CHAR(24) CHARACTER SET LATIN CASESPECIFIC TITLE '第六列' NOT NULL, seventh_column VARCHAR(18) CHARACTER SET LATIN CASESPECIFIC TITLE '第七列' NOT NULL, eighth_column DECIMAL(18,0) TITLE '第八列' NOT NULL , nineth_column DECIMAL(18,6) TITLE '第九列' NOT NULL )PRIMARY INDEX ( first_column ,fourth_column )PARTITION BY RANGE_N(first_column BETWEEN DATE '1999-01-01' AND DATE '2050-12-31' EACH INTERVAL '1' DAY );CREATE INDEX test_index (first_column, fourth_column) ON test_table;可以修改成ADB for PG的建表语句: ...

July 2, 2019 · 2 min · jiezi

Oracle应用迁移到AnalyticDB-for-PostgreSQL指导

AnalyticDB for PostgreSQL(简称:ADB for PG)对Oracle语法有着较好的兼容,本文介绍如何将Oracle应用迁移到AnalyticDB for PostgreSQL。 1 PL/SQLPL/SQL(Procedural Language/SQL)是一种过程化的SQL语言,是Oracle对SQL语句的拓展,使得SQL的使用可以具有一般编程语言的特点,因此,可以用来实现复杂的业务逻辑。PL/SQL对应了ADB for PG中的PL/PGSQL 1.1PackageADB for PG的plpgsql不支持package,需要把package 转换成 schema,并package里面的所有procedure和 function转换成ADB for PG的function。例如: create or replace package pkg is …end;可以转换成: create schema pkg;Package定义的变量 procedure/function的局部变量保持不变,全局变量在ADB for PG中可以使用临时表进行保存。详见1.4.5节。Package初始化块 如果可以删掉,就删掉,删不掉的话,可以使用function封装,在需要的时候主动调用该function。Package 内定义的procedure/function Package 内定义的procedure和function 转成adb for pg的function,并把function 定义到package对应的schema内。例如,有一个Package名为pkg中有如下函数:FUNCTION test_func (args int) RETURN int is var number := 10;BEGIN… … END;转换成如下ADB for PG的function:CREATE OR REPLACE FUNCTION pkg. test_func(args int) RETURNS int AS $$ … … $$ LANGUAGE plpgsql;1.2 Procedure/function对于oracle的procedure和function,不论是package的还是全局的,都转换成adb for pg 的function。例如: ...

June 17, 2019 · 6 min · jiezi

全栈之路JAVA基础课程二20190611v10

欢迎进入JAVA基础课程二 本系列文章将主要针对JAVA一些基础知识点进行讲解,为平时归纳所总结,不管是刚接触JAVA开发菜鸟还是业界资深人士,都希望对广大同行带来一些帮助。若有问题请及时留言或加QQ:243042162。 谨记:经历过国考、省考,参加过各种证书考试,无疑对于上了年纪的人来说时刻有着莫大的危机感,时刻想着如何摆脱目前的困境。经常跟身边的同事去讨论20年后你在这个行业处于什么位置,当想想如果20年后还处于现在的位置是多么可怕的一件事情。悟性可以差点,时间可晚点,但学习跟积累必须跟上,与时俱进,搬砖人才可能脱胎换骨,收割事业的成就感与满足感。数据类型1. 基础数据类型: 数值型 整型数据(byte |short |int |long)浮点类型(float |double)字符型(char)布尔型(boolean)2. 引用数据类型: 类(class)接口(interface)数组注意事项&:左右都判断,可作位运算和逻辑与运算符&&:左假则结束,左真判断右,可作逻辑与运算符垃圾回收机制之前网络上见过两个很搞笑的图比喻C语言和JAVA之间的垃圾回收机制,如下图所示 C语言 JAVA语言 (1)C的垃圾回收是人工的,工作量大,但是可控性高。(2)JAVA是自动化的,但是可控性很差,甚至有时会出现内存溢出的情况。(3)System.gc(),用于调用垃圾收集器,在调用时,垃圾收集器将运行以回收未使用的内存空间。它将尝试释放被丢弃对象占用的内存。然而System.gc()调用附带一个免责声明,无法保证对垃圾收集器的调用。所以System.gc()并不能说是完美主动进行了垃圾回收。1、确定哪些对象要进行回收经典算法:引用计数法、可达性分析算法 2、什么时候进行回收会在cpu空闲的时候自动进行回收在堆内存存储满了之后主动调用System.gc()后尝试进行回收3、如何回收相关算法:标记-清除算法、复制算法、标记-整理算法、分代收集算法 标记-清除算法 (效率和内存碎片问题):这是最基础的一种算法,分为两个步骤,第一个步骤就是标记,也就是标记处所有需要回收的对象,标记完成后就进行统一的回收掉哪些带有标记的对象。这种算法优点是简单,缺点是效率问题,还有一个最大的缺点是空间问题,标记清除之后会产生大量不连续的内存碎片,当程序在以后的运行过程中需要分配较大对象时无法找到足够的连续内存而造成内存空间浪费。 复制算法(适用于对象存活率低的场景) :复制将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。这样使得每次都是对其中的一块进行内存回收,内存分配时也就不用考虑内存碎片等复杂情况。只是这种算法的代价是将内存缩小为原来的一半。 标记整理算法(适用于对象存活率高的场景) :标记整理算法与标记清除算法很相似,但最显著的区别是:标记清除算法仅对不存活的对象进行处理,剩余存活对象不做任何处理,造成内存碎片;而标记整理算法不仅对不存活对象进行处理清除,还对剩余的存活对象进行整理,重新整理,因此其不会产生内存碎片。 分代收集算法 (根据存活周期分为不同的几块):分代收集算法是一种比较智能的算法,也是现在jvm使用最多的一种算法,他本身其实不是一个新的算法,而是他会在具体的场景自动选择以上三种算法进行垃圾对象回收。

June 11, 2019 · 1 min · jiezi

JS进阶你真的掌握变量和类型了吗

导读变量和类型是学习JavaScript最先接触到的东西,但是往往看起来最简单的东西往往还隐藏着很多你不了解、或者容易犯错的知识,比如下面几个问题: JavaScript中的变量在内存中的具体存储形式是什么?0.1+0.2为什么不等于0.3?发生小数计算错误的具体原因是什么?Symbol的特点,以及实际应用场景是什么?[] == ![]、[undefined] == false为什么等于true?代码中何时会发生隐式类型转换?转换的规则是什么?如何精确的判断变量的类型?如果你还不能很好的解答上面的问题,那说明你还没有完全掌握这部分的知识,那么请好好阅读下面的文章吧。 本文从底层原理到实际应用详细介绍了JavaScript中的变量和类型相关知识。 一、JavaScript数据类型ECMAScript标准规定了7中数据类型,其把这7种数据类型又分为两种:原始类型和对象类型。 原始类型 Null:只包含一个值:nullUndefined:只包含一个值:undefinedBoolean:包含两个值:true和falseNumber:整数或浮点数,还有一些特殊值(-Infinity、+Infinity、NaN)String:一串表示文本值的字符序列Symbol:一种实例是唯一且不可改变的数据类型(在es10中加入了第七种原始类型BigInt,现已被最新Chrome支持) 对象类型 Object:自己分一类丝毫不过分,除了常用的Object,Array、Function等都属于特殊的对象二、为什么区分原始类型和对象类型2.1 不可变性上面所提到的原始类型,在ECMAScript标准中,它们被定义为primitive values,即原始值,代表值本身是不可被改变的。 以字符串为例,我们在调用操作字符串的方法时,没有任何方法是可以直接改变字符串的: var str = 'ConardLi';str.slice(1);str.substr(1);str.trim(1);str.toLowerCase(1);str[0] = 1;console.log(str); // ConardLi在上面的代码中我们对str调用了几个方法,无一例外,这些方法都在原字符串的基础上产生了一个新字符串,而非直接去改变str,这就印证了字符串的不可变性。 那么,当我们继续调用下面的代码: str += '6'console.log(str); // ConardLi6你会发现,str的值被改变了,这不就打脸了字符串的不可变性么?其实不然,我们从内存上来理解: 在JavaScript中,每一个变量在内存中都需要一个空间来存储。 内存空间又被分为两种,栈内存与堆内存。 栈内存: 存储的值大小固定空间较小可以直接操作其保存的变量,运行效率高由系统自动分配存储空间JavaScript中的原始类型的值被直接存储在栈中,在变量定义时,栈就为其分配好了内存空间。 由于栈中的内存空间的大小是固定的,那么注定了存储在栈中的变量就是不可变的。 在上面的代码中,我们执行了str += '6'的操作,实际上是在栈中又开辟了一块内存空间用于存储'ConardLi6',然后将变量str指向这块空间,所以这并不违背不可变性的特点。 2.2 引用类型堆内存: 存储的值大小不定,可动态调整空间较大,运行效率低无法直接操作其内部存储,使用引用地址读取通过代码进行分配空间相对于上面具有不可变性的原始类型,我习惯把对象称为引用类型,引用类型的值实际存储在堆内存中,它在栈中只存储了一个固定长度的地址,这个地址指向堆内存中的值。 var obj1 = {name:"ConardLi"}var obj2 = {age:18}var obj3 = function(){...}var obj4 = [1,2,3,4,5,6,7,8,9] 由于内存是有限的,这些变量不可能一直在内存中占用资源,这里推荐下这篇文章JavaScript中的垃圾回收和内存泄漏,这里告诉你JavaScript是如何进行垃圾回收以及可能会发生内存泄漏的一些场景。当然,引用类型就不再具有不可变性了,我们可以轻易的改变它们: obj1.name = "ConardLi6";obj2.age = 19;obj4.length = 0;console.log(obj1); //{name:"ConardLi6"}console.log(obj2); // {age:19}console.log(obj4); // []以数组为例,它的很多方法都可以改变它自身。 ...

May 28, 2019 · 5 min · jiezi

数据类型js的数据类型

一、js的数据类型有基本数据类型和引用类型基本数据类型包括:undefined, null,boolean,number,string 引用类型是object:包括function,array,Date... 【es6新增类型】1. set 集合,区别于数组的就是 set中不可以有重复的数据,常可以用来做去重操作 含有size属性,集合里元素的个数add 方法,返回的是原对象改变后的值delete方法,返回值是true/falsehas('data1') 返回值是true/falsemyset.keys(); myset.value() 2. Map类型,与对象的区别是:对象的键值只能是字符串,不可以是对象类型,使用Map类型可以避免键值必须是字符串的限制,可以是对象,数组等 创建的时候一个大的数组,每一项元素是小数组,小数组有两个元素,分别是一组对应的key,value。方法:set(key,value); get(key);delete(key); has(key); //返回值均是true/falsemymap.forEach(function (value,key) { console.log(key+":"+value);}) // 遍历,参数是value,key 【注意顺序】mymap.set({},"obj1");mymap.set({},"obj2"); 这是两个不同的键值,不会被覆盖 3.Symbol类型 用相同的字符串做属性名命名的时候会发生命名冲突,使用Symbol产生的名字是不同的 Symbol 即便传入相同的参数,两者的值也是不一样的 例:Symbol('foo') !== Symbol('foo');如果想让两者相等,可以使用Symbol.for() 例 Symbol.for('bar') === Symbol.for('bar')但是 Symbol('bar') !== Symbol.for('bar');如果Symbol作为属性名,不会被Object.keys() Object.getOwnPropertyNames()、JSON.stringify()返回;该属性也不会出现在for...in、for...of循环中。但是,它也不是私有属性,有一个Object.getOwnPropertySymbols方法,可以获取指定对象的所有 Symbol 属性名。typeof null返回值是 “object”,null会被认为是一个空对象的引用null == undefined //true当定义一个变量用来保存对象,就可以将这个变量初始化为null 实现继承function Person(){}function Student(){}Student.prototype = new Person()Student.prototype.constructor= Studentvar bosn= new Student()bosn instanceof Student //truebosn instanceof Person // true 二、判断类型的方式typeof | instanceof | Object.prototype.toString.apply() ...

May 28, 2019 · 1 min · jiezi

Python数据结构

概述    数据结构是组织数据的方式,以便能够更好的存储和获取数据。数据结构定义数据之间的关系和对这些数据的操作方式。数据结构屏蔽了数据存储和操作的细节,让程序员能更好的处理业务逻辑,同时拥有快速的数据存储和获取方式。     在这篇文章中,你将了解到多种数据结构以及这些数据结构在Python中实现的方式。 抽象数据类型和数据结构    数据结构是抽象数据类型(ADT)的实现,通常,是通过编程语言提供的基本数据类型为基础,结合相应的代码来实现。     通常来说,数据结构分为两类:原始数据结构和非原始数据结构,原始数据结构是用来表示简单的数据关系,非原始数据结构包含原始数据结构,同时,数据关系更加复杂,数据操作也更加复杂。 原始数据结构    原始数据结构 - 顾名思义 - 是最原始的或基本的数据结构。 它们是数据操作的构建块,包含纯粹,简单的数据值。 Python有四种原始变量类型: IntegersFloatStringsBooleanIntegers    您可以使用Integers表示数字数据,具体地说,可以使用从负无穷大到无穷大的整数 Float    “Float”代表“浮点数”。 您可以将它用于有理数,通常以十进制数字结尾,例如1.11或3.14。     请注意,在Python中,您不必显式声明变量或数据的类型。 那是因为Python是一种动态类型语言。 动态类型语言是对象可以存储的数据类型是可变的语言。 String    String是字母,单词或其他字符的集合。 在Python中,您可以通过在一对单引号或双引号中包含一系列字符来创建字符串。 例如:'cake',“cookie”等。您还可以对两个或多个字符串应用+操作来连接它们,就像下面的示例中一样: x = 'Cake'y = 'Cookie'x + ' & ' + y #结果:'Cake & Cookie'以下是您可以使用字符串执行的一些其他基本操作; 例如,您可以使用*重复字符串一定次数: # Repeatx * 2 #结果:'CakeCake'您还可以切割字符串 z1 = x[2:] print(z1)z2 = y[0] + y[1] print(z2)# 结果keCo请注意,字符串也可以是字母数字字符,但+操作仍然用于连接字符串。 x = '4'y = '2'x + y'42'Python有许多内置方法或辅助函数来操作字符串。 替换子字符串,大写段落中的某些单词,在另一个字符串中查找字符串的位置是一些常见的字符串操作。 例如: 大写首字母str.capitalize('cookie')'Cookie'以字符为单位检索字符串的长度。 请注意,空格也计入最终结果:str1 = "Cake 4 U"str2 = "404"len(str1)8检查字符串是否数字str1 = "Cake 4 U"str2 = "404"str1.isdigit()Falsestr2.isdigit()True替换str1 = "Cake 4 U"str2 = "404"str1.replace('4 U', str2)'Cake 404'查找子字符串str1 = 'cookie'str2 = 'cook'str1.find(str2)0str1 = 'I got you a cookie'str2 = 'cook'str1.find(str2)12Boolean    这种内置数据类型值为:True和False,这通常使它们可以与整数1和0互换。布尔值在条件和比较表达式中很有用,就像在下面的例子中一样: ...

May 18, 2019 · 4 min · jiezi

为什么强烈禁止开发人员使用isSuccess作为变量名

在日常开发中,我们会经常要在类中定义布尔类型的变量,比如在给外部系统提供一个RPC接口的时候,我们一般会定义一个字段表示本次请求是否成功的。 关于这个"本次请求是否成功"的字段的定义,其实是有很多种讲究和坑的,稍有不慎就会掉入坑里,作者在很久之前就遇到过类似的问题,本文就来围绕这个简单分析一下。到底该如何定一个布尔类型的成员变量。 一般情况下,我们可以有以下四种方式来定义一个布尔类型的成员变量: boolean successboolean isSuccessBoolean successBoolean isSuccess以上四种定义形式,你日常开发中最常用的是哪种呢?到底哪一种才是正确的使用姿势呢? 通过观察我们可以发现,前两种和后两种的主要区别是变量的类型不同,前者使用的是boolean,后者使用的是Boolean。 另外,第一种和第三种在定义变量的时候,变量命名是success,而另外两种使用isSuccess来命名的。 首先,我们来分析一下,到底应该是用success来命名,还是使用isSuccess更好一点。 success 还是 isSuccess到底应该是用success还是isSuccess来给变量命名呢?从语义上面来讲,两种命名方式都可以讲的通,并且也都没有歧义。那么还有什么原则可以参考来让我们做选择呢。 在阿里巴巴Java开发手册中关于这一点,有过一个『强制性』规定:  那么,为什么会有这样的规定呢?我们看一下POJO中布尔类型变量不同的命名有什么区别吧。 class Model1 { private Boolean isSuccess; public void setSuccess(Boolean success) { isSuccess = success; } public Boolean getSuccess() { return isSuccess; } }class Model2 { private Boolean success; public Boolean getSuccess() { return success; } public void setSuccess(Boolean success) { this.success = success; }}class Model3 { private boolean isSuccess; public boolean isSuccess() { return isSuccess; } public void setSuccess(boolean success) { isSuccess = success; }}class Model4 { private boolean success; public boolean isSuccess() { return success; } public void setSuccess(boolean success) { this.success = success; }}以上代码的setter/getter是使用Intellij IDEA自动生成的,仔细观察以上代码,你会发现以下规律: ...

May 8, 2019 · 3 min · jiezi

Python数据类型

数据类型的概述什么是数据类型 数据类型是对数据的分类,例如:整数类型、浮点类型、字符串类型,等等。 任何数据都有明确的数据类型,例如:18属于整数类型,5.6属于浮点类型,'Hello'属于字符串类型。 获取数据的数据类型 调用内置函数type可以获取数据的数据类型。 print(type(18)) #<class‘int'>print(type(5.6)) #<class'float'>print(type('Hello'))#<class'str'>整数类型整数的不同进制表示方式 整数有4种进制表示方式: 10进制:默认的进制 2进制:以0b开头 8进制:以00开头 16进制:以0x开头 print(118) #118print(0b1110110) #118print(00166) #118print(0×76) #118整数转换为不同进制的字符串 可以调用内置函数将十进制整数转换为不同进制的字符串: bin()将十进制整数转换为2进制binary字符串 oct()将十进制整数转换为8进制octal字符串 hex()将十进制整数转换为16进制hexadecimal字符串 print(bin(118)) #0bl110110print(oct(118)) #00166print(hex(118)) #0x76整数的创建 除了直接创建一个整数,还可以调用内置函数int创建整数 不传递任何参数时,返回整数0只传递一个参数时,将传递的参数转换为整数传递两个参数时,第一个参数必须是字符串,第二个参数指定进制 print(int()) #0 print(int(118)) #118 print(int(118.2)) #118 print(int('118')) #118 print(int('1110110',2)) #118 print(int('00166',8)) #118 print(int('0x76',16)) #118浮点类型什么是浮点数类型 浮点数类型用于表示浮点数,也就是小数。 print(0.123456789) #0.123456789浮点数的创建 除了使用小数创建浮点数外,还可以调用内置函数float创建浮点数。 不传递任何参数时,返回浮点数`0.0`只传递一个参数时,将传递的参数转换为浮点数print(float()) #0.0print(float(118)) #118.0print(float(118.2)) #118.2print(float('118')) #118.0用科学计数法表示浮点数 很大或很小的浮点数可以用科学计数法来表示:men表示:m乘以10的n次方。 print(2.3e8) #230000000.0print(2.3e-4) #0.0002311u浮点数存储的不精确性 计算机采用二进制存储浮点数时是不精确的,可能会存在误差,因此,对于浮点数的运算需要格外小心 print(1.1+2.2-3.3) #4.440892098500626e-16print(1.1+2.2) #3.3000000000000003111111解决方案 :导入模块decimal或fractions其中, 模块decimal用于处理十进制的浮点数 模块fractions用于处理分数 from decimal import Decimal print(Decimal('1.1')+Decimal('2.2')-Decimal('3.3')) #0.0from fractions import Fraction print(Fraction(11,10)+Fraction(22,10)-Fraction((33,10)) #0布尔类型什么是布尔类型 ...

May 4, 2019 · 1 min · jiezi

一个函数让你看懂 'Why 0.1+0.2!=0.3'

话不多说,先上代码 function judgeFloat(n, m) { const binaryN = n.toString(2); const binaryM = m.toString(2); console.log(${n}的二进制是 ${binaryN}); console.log(${m}的二进制是 ${binaryM}); const MN = m + n; const accuracyMN = (m * 100 + n * 100) / 100; const binaryMN = MN.toString(2); const accuracyBinaryMN = accuracyMN.toString(2); console.log(${n}+${m}的二进制是${binaryMN}); console.log(${accuracyMN}的二进制是 ${accuracyBinaryMN}); console.log(${n}+${m}的二进制再转成十进制是${to10(binaryMN)}); console.log(${accuracyMN}的二进制是再转成十进制是${to10(accuracyBinaryMN)}); console.log(${n}+${m}在js中计算是${(to10(binaryMN) === to10(accuracyBinaryMN)) ? '' : '不'}准确的); } function to10(n) { const pre = (n.split(’.’)[0] - 0).toString(2); const arr = n.split(’.’)[1].split(’’); let i = 0; let result = 0; while (i < arr.length) { result += arr[i] * Math.pow(2, -(i + 1)); i++; } return result; } judgeFloat(0.1, 0.2); judgeFloat(0.6, 0.7);由于JavaScript中没有将小数的二进制转换成十进制的方法,于是手动实现了一个。先来一个简单的结论计算机中所有的数据都是以二进制存储的,所以在计算时计算机要把数据先转换成二进制进行计算,然后在把计算结果转换成十进制。由上面的代码不难看出,在计算0.1+0.2时,二进制计算发生了精度丢失,导致再转换成十进制后和预计的结果不符。其实有些标题党了,一个函数并不能让你深入理解,还得继续看下面…对结果的分析—更多的问题0.1和0.2的二进制都是以1100无限循环的小数,下面逐个来看JS帮我们计算所得的结果:0.1的二进制:0.00011001100110011001100110011001100110011001100110011010.2的二进制:0.001100110011001100110011001100110011001100110011001101理论上讲,由上面的结果相加应该::0.0100110011001100110011001100110011001100110011001100111实际JS计算得到的0.1+0.2的二进制0.0100110011001100110011001100110011001100110011001101作为一个代码强迫症的我又产生的新的问题:Why js计算出的 0.1的二进制 是这么多位而不是更多位???Why js计算的(0.1+0.2)的二进制和我们自己计算的(0.1+0.2)的二进制结果不一样呢???Why 0.1的二进制 + 0.2的二进制 != 0.3的二进制???js对二进制小数的存储方式小数的二进制大多数都是无限循环的,JavaScript是怎么来存储他们的呢?在ECMAScript®语言规范中可以看到,ECMAScript中的Number类型遵循IEEE 754标准。使用64位固定长度来表示。事实上有很多语言的数字类型都遵循这个标准,例如JAVA,所以很多语言同样有着上面同样的问题。所以下次遇到这种问题不要上来就喷JavaScript…有兴趣可以看看下这个网站http://0.30000000000000004.com/,是的,你没看错,就是http://0.30000000000000004.com/!!!IEEE 754IEEE754标准包含一组实数的二进制表示法。它有三部分组成:符号位指数位尾数位三种精度的浮点数各个部分位数如下:JavaScript使用的是64位双精度浮点数编码,所以它的符号位占1位,指数位占11位,尾数位占52位。下面我们在理解下什么是符号位、指数位、尾数位,以0.1为例:它的二进制为:0.0001100110011001100…为了节省存储空间,在计算机中它是以科学计数法表示的,也就是1.100110011001100… X 2-4如果这里不好理解可以想一下十进制的数:1100的科学计数法为11 X 102所以:符号位就是标识正负的,1表示负,0表示正;指数位存储科学计数法的指数;尾数位存储科学计数法后的有效数字;所以我们通常看到的二进制,其实是计算机实际存储的尾数位。js中的toString(2)由于尾数位只能存储52个数字,这就能解释toString(2)的执行结果了:如果计算机没有存储空间的限制,那么0.1的二进制应该是:0.00011001100110011001100110011001100110011001100110011001…科学计数法尾数位1.1001100110011001100110011001100110011001100110011001…但是由于限制,有效数字第53位及以后的数字是不能存储的,它遵循,如果是1就向前一位进1,如果是0就舍弃的原则。0.1的二进制科学计数法第53位是1,所以就有了下面的结果:0.00011001100110011001100110011001100110011001100110011010.2有着同样的问题,其实正是由于这样的存储,在这里有了精度丢失,导致了0.1+0.2!=0.3。事实上有着同样精度问题的计算还有很多,我们无法把他们都记下来,所以当程序中有数字计算时,我们最好用工具库来帮助我们解决,下面是两个推荐使用的开源库:number-precisionmathjs/下面我们再来看上面的其他两个问题。Why JavaScript计算出的 0.1的二进制 是这么多位而不是更多位???上面的toString原理帮我们解答了这个问题,在有效数字第53位以后的数字将遵循1进0舍的原则,内存中只允许存储52位有效数字。Why JavaScript计算的(0.1+0.2)的二进制和我们自己计算的(0.1+0.2)的二进制结果不一样呢???我们自己计算的0.1+0.2::0.0100110011001100110011001100110011001100110011001100111实际上这个结果的有效数字已经超过了52位,我们要从末尾进行1进0舍得到下面的结果0.0100110011001100110011001100110011001100110011001101JavaScript能表示的最大数字由与IEEE 754双精度64位规范的限制:指数位能表示的最大数字:1023(十进制)尾数位能表达的最大数字即尾数位都位1的情况所以JavaScript能表示的最大数字即位1.111…X 21023 这个结果转换成十进制是1.7976931348623157e+308,这个结果即为Number.MAX_VALUE。最大安全数字JavaScript中Number.MAX_SAFE_INTEGER表示最大安全数字,计算结果是9007199254740991,即在这个数范围内不会出现精度丢失(小数除外),这个数实际上是1.111…X 252。我们同样可以用一些开源库来处理大整数:node-bignumnode-bigint其实官方也考虑到了这个问题,bigInt类型在es10中被提出,现在Chrome中已经可以使用。bigInt类型BigInt 是第七种原始类型。BigInt 是一个任意精度的整数。这意味着变量现在可以计算9007199254740991即最大安全整数以上的数字。const b = 1n; // 追加 n 以创建 BigInt在过去,不支持大于 9007199254740992 的整数值。如果超过,该值将锁定为 MAX_SAFE_INTEGER + 1:const limit = Number.MAX_SAFE_INTEGER;⇨ 9007199254740991limit + 1;⇨ 9007199254740992limit + 2;⇨ 9007199254740992 <— MAX_SAFE_INTEGER + 1 exceededconst larger = 9007199254740991n;⇨ 9007199254740991nconst integer = BigInt(9007199254740991); // initialize with number⇨ 9007199254740991nconst same = BigInt(“9007199254740991”); // initialize with “string”⇨ 9007199254740991ntypeoftypeof 10;⇨ ’number’typeof 10n;⇨ ‘bigint’ ...

March 4, 2019 · 1 min · jiezi

javascript 判断数据类型的几种方法

javascript 判断数据类型的几种方法一、typeof 直接返回数据类型字段,但是无法判断数组、null、对象typeof 1"number"typeof NaN"number"typeof “1"“string"typeof true"boolean"typeof undefined"undefined"typeof null"object"typeof []“object"typeof {}“object"其中 null, [], {}都返回 “object"二、instanceof 判断某个实例是不是属于原型// 构造函数function Fruit(name, color) { this.name = name; this.color = color;}var apple = new Fruit(“apple”, “red”);// (apple != null)apple instanceof Object // trueapple instanceof Array // false三、使用 Object.prototype.toString.call()判断call()方法可以改变this的指向,那么把Object.prototype.toString()方法指向不同的数据类型上面,返回不同的结果Object.prototype.toString.call(1)"[object Number]“Object.prototype.toString.call(NaN);"[object Number]“Object.prototype.toString.call(“1”);"[object String]“Object.prototype.toString.call(true)"[object Boolean]“Object.prototype.toString.call(null)"[object Null]“Object.prototype.toString.call(undefined)"[object Undefined]“Object.prototype.toString.call(function a() {});"[object Function]“Object.prototype.toString.call([]);"[object Array]“Object.prototype.toString.call({});"[object Object]“最后我们可以修改一下原型上的typeof方法或者在自己的对象上面重新定义一个方法typeof()function _typeof(obj){ var s = Object.prototype.toString.call(obj); return s.match(/[object (.*?)]/)[1].toLowerCase();};

February 15, 2019 · 1 min · jiezi

js数据类型--object

系列文章1 、从数据类型讲原型原型链内容回顾在JavaScript中,数据类型可以分为原始类型以及引用类型。其中原始类型包括string,number, boolean, null, undefined, symbol(ES6新增,表示独一无二的值),这6种数据类型是按照值进行分配的,是存放在栈(stack)内存中的简单数据段,可以直接访问,数据大小确定,内存空间大小可以分配。引用类型包括function,object,array等可以可以使用new创建的数据,又叫对象类型,他们是存放在堆(heap)内存中的数据,如var a = {},变量a实际保存的是一个指针,这个指针指向对内存中的数据 {}。对象类型包含但不限于object、function、array、string、boolean、number、date、regexp。这一篇文章则主要讲object类型的功能及用法。一、开篇在js中,function类型的数据叫函数,又叫方法,array类型的数据叫数组,而object类型的数据就叫对象,需要根据实际情况来区分一些文章中的对象与对象类型。什么是对象?对象就是封装一个事物的属性和功能的程序结构,是内存中保存多个属性和方法的一块存储空间。什么是面向对象编程?面向对象编程(OOP)是一种编程思想,是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。它的特征是封装、继承、多态,优点是易维护、易扩展、质量高、效率高。通俗的讲就是以对象为基础来进行软件开发的思想,举个例子,比如我们做一个雨滴落地的动画,那么可以用面向对象的方法把雨滴看成一个对象,这个对象中包含颜色、形状、大小、速度等属性,同时还包括了开始下落、下落过程、落地后等方法 。二、创建对象1、直接量(字面量)创建因为这种创建方法很直接,所以叫直接量,又叫字面量var obj = {a:1}2、构造函数创建这一方法创建对象又叫工厂函数创建对象,顾名思义就是批量生产,使用这个方法我们需要用到关键字new。运行环境内置了一个对象的构造函数—Object,我们直接使用就可以了var obj = new Object({a:1}); 上面的例子中,我们在Object中加了一个参数,这个参数是初始化的值(将参数赋值给新对象,不是克隆),这个参数的格式需要符合对象的格式要求,如果你传入了一个别的类型的参数,那么创建的就不是object类型的对象了(数据类型还是对象,但不是object)var a = new Object(‘a’); // String {“a”}var b = new Object(’{a:1}’); // String {"{a:1}"}var c = new Object(1); // Number {1}另外,如果没有参数需要传入,则Object后面的()可以省略,即var a = new Object; //{}除了环境自带的构造函数,我们还可以根据实际需求自定义构造函数function Student(name,age){ this.name = name this.age = age}var xm = new Student(‘xiaoM’,12); // Student {name: “xiaoM”, age: 12}var xh = new Student(‘xiaoH’,14); // Student {name: “xiaoH”, age: 14}3、Object.create创建对象我们知道,Object是一个构造函数,而js中函数也是对象类型的数据,所以函数也是有属性的,而create就是其中的一个方法,该方法的作用是根据现有的对象新创建一个子对象。var son=Object.create(父对象);这句话做了2件事:1. 创建空对象son2. 设置son的__proto__指向父对象上面的解释其实是有一点瑕疵的,因为我们不但可以根据现有的对象来创建子对象,还可以根据null来创建子对象,我这么说是想强调下null不是一个对象,虽然Object.prototype继承自null,但null也不是一个对象,你可能会说:typeof null === “object” // trueObject.prototype.toString(null) === “[object Object]” // true但它确实不是一个对象,这是js的历史遗留问题,详细可以看这里 typeof null的前世今生继续回到我们的文章上来,如果我们使用了null作为父对象来创建一个子对象,那么子对象.proto === null //true和Object.prototype一个级别的!!!不过不同的是,Object.prototype是运行环境封装的,里面天生有一些属性及方法,而用null创建的子对象就像一个新生儿一样,里面干干净净的,什么都没有。使用null创建子对象的缺点就是我们不再能够使用Object.prototype自带的一些属性及API,如果需要的话,你就得自己去实现了,好处就是这个子对象是一个干干净净的对象,里面的一些属性及方法可以按照自己的想法来,不用担心与原型链上属性重名,造成变量污染,多用于存储数据。4、ES6 的 class创建对象 class关键字是ES6引入的概念,用于定义类(对象),用法如下://定义类class Point { constructor(x, y) { this.x = x; this.y = y; } toString() { return ‘(’ + this.x + ‘, ’ + this.y + ‘)’; }}可以看到里面有一个constructor方法,这就是构造方法,而this关键字则代表实例对象Point。Point类除了构造方法,还定义了一个toString方法。注意,定义“类”的方法的时候,前面不需要加上function这个关键字,直接把函数定义放进去了就可以了。另外,方法之间不需要逗号分隔,加了会报错。ES6 的类,完全可以看作构造函数的另一种写法。class Point { // …}typeof Point // “function"Point === Point.prototype.constructor // true上面代码表明,类的数据类型就是函数,类本身就指向构造函数。使用的时候,也是直接对类使用new命令,跟构造函数的用法完全一致。var point = new Point(2,3);point.toString() // “(2,3)“这里执行new Point(2,3)可以看作是执行了类Point里的constructor方法为x,y赋值,同时把toString函数挂到Point.prototype上去构造函数的prototype属性,在 ES6 的“类”上面继续存在。事实上,类的所有方法都定义在类的prototype属性上面。更多class的使用说明及其他es6的特性看一看阮一峰老师的ECMAScript 6 入门,讲的很详细,上面关于class的讲解也都摘抄自阮一峰老师的这本书里。三、对象的遍历遍历就是依次处理该数据结构的所有成员,JavaScript中的遍历是针对表示“集合”的数据结构,主要是数组(Array)和对象(Object),ES6 又添加了Map和Set。其中对象的遍历主要是使用for…in结构,用法如下:var a = {a:1,b:2}for(var k in a){ console.log(k)}//a b在 for…in 的使用中,我们需要小心的是,他不但可以遍历自己的私有属性,还会遍历其原型链上的公有属性。私有属性:对象本身所具有的属性公有属性:包括私有属性在内的其原型链上的可访问到的属性var a = {a:1,b:2}a.proto = {c:4}for(var k in a){ console.log(k)}//a b c我们可以通过obj.hasOwnProperty来判断一个属性是不是对象的自有属性for(var k in a){ if( a.hasOwnProperty( k ) ){ console.log(k) }}//a b以上,我们把所有可以遍历到的属性叫做可枚举属性,那么什么是可枚举属性和不可枚举属性呢?可枚举属性是指那些内部 “可枚举” 标志(enumerable)设置为 true 的属性,对于通过直接的赋值和属性初始化的属性,该标识值默认为即为 true,对于通过 Object.defineProperty、Object.create 等定义的属性,该标识值默认为 false。可枚举的属性可以通过 for…in 循环进行遍历(除非该属性名是一个 Symbol)。相对的,不可枚举属性就是用 for…in 遍历不到的属性,js中内置属性是遍历不到的。四、Object/Object.prototype常用API介绍我们知道无论是object、function、array还是string、boolean、number、date,他们都是对象类型的数据,我们在可以使用console.dir()来查看一个数据的结构。这样我们就可以很全面的看到一个对象上有哪些属性了。1、Object构造函数的方法Object是object的构造函数,我们使用console.dir(Object),可以看到:Object.assign()通过复制一个或多个对象来创建一个新的对象。Object.create()使用指定的原型对象和属性创建一个新对象。Object.defineProperty()给对象添加一个属性并指定该属性的配置。Object.defineProperties()给对象添加多个属性并分别指定它们的配置。Object.entries()返回给定对象自身可枚举属性的[key, value]数组。Object.freeze()冻结对象:其他代码不能删除或更改任何属性。Object.getOwnPropertyDescriptor()返回对象指定的属性配置。Object.getOwnPropertyNames()返回一个数组,它包含了指定对象所有的可枚举或不可枚举的属性名。Object.getOwnPropertySymbols()返回一个数组,它包含了指定对象自身所有的符号属性。Object.getPrototypeOf()返回指定对象的原型对象。Object.is()比较两个值是否相同。所有 NaN 值都相等(这与==和===不同)。Object.isExtensible()判断对象是否可扩展。Object.isFrozen()判断对象是否已经冻结。Object.isSealed()判断对象是否已经密封。Object.keys()返回一个包含所有给定对象自身可枚举属性名称的数组。Object.preventExtensions()防止对象的任何扩展。Object.seal()防止其他代码删除对象的属性。Object.setPrototypeOf()设置对象的原型(即内部[[Prototype]]属性)。Object.values()返回给定对象自身可枚举值的数组。2、Object 实例和Object 原型对象的方法Object.prototype本身是一个对象,所以我们使用console.log(Object.prototype),就可以看到他的结构:Object.prototype.hasOwnProperty()返回一个布尔值 ,表示某个对象是否含有指定的属性,而且此属性非原型链继承的。Object.prototype.isPrototypeOf()返回一个布尔值,表示指定的对象是否在本对象的原型链中。Object.prototype.propertyIsEnumerable()判断指定属性是否可枚举Object.prototype.toLocaleString()直接调用 toString()方法。Object.prototype.toString()返回对象的字符串表示。Object.prototype.valueOf()返回指定对象的原始值。由于 Object 以及 Object.prototype 的属性太多,这里就不详细阐述了,感兴趣的小伙伴可以到 MDN 观看,强烈建议把Object、Object.prototype的属性都过一遍。 ...

September 3, 2018 · 1 min · jiezi