前言
使用过多个语言做互联网开发的朋友,往往在切换过程中没那么快反应过来该用哪种语法,譬如我要知道对象obj是什么类型,那我该用typeof(obj)? type(obj)?还是type obj? 因为这些都见过且容易混淆忘记。 本文就总结下python,javascrip和go在一些基础语法上写法,大家对比着看可能更加深理解,也作为以后开发时查阅语法帮助文档。 文中主要是比较主要语法,不进行细节深入。
1. 基本数据类型
-
1.1 数值类型
1.1.1 python
int 整数,可以是任意大的正整数,负整数和零 float 浮点数/小数,可以任意大小
1.1.2 javascriptNumber: 不区分整数据小数正负,一律通用,有两个特殊的值是NaN和Infinity
1.1.3 golang
int
有符号整型,位宽度(bit)跟所在操作系统位宽一样。如果想指定位宽,有int8,int16,int32,int64 uint 无符号整型,位宽度(bit)跟所在操作系统位宽一样。如果想指定位宽,有uint8,uint16,uint32,uint64 byte unit8的别名 rune int32的别名,常用表一个unicode字符 float32 32位宽浮点数 float64 64位宽浮点数 complex64 复数:由实数部分float32和虚数部分float32组成 complex128 复数:由实数部分float64和虚数部分float64组成 -
1.2 字符串
1.2.1 python
(按python3标准)
类型: str (字节类型:bytes)
表示:单引号,双引号一般字符串,三引号表多行字符串
长度计算: len() 计算字符数(非字节数)
格式化: "ho-%d-%s" % (10, 'good') 结果'ho-10-good'
常用方法:
`encode() decode() split() strip() upper() lower() join() find() index()`1.2.2 javascript
类型: string
表示:单引号,双引号一般字符串,ES6用反引号表示多行字符串
长度计算: .length属性=字符数(非字节数)
格式化: 加号连接, 'ho-' + 10 + '-' + 'good'
常用方法:
`indexOf() lastIndexOf() substr() trim() split() toUpperCase() toLowerCase() slice()`
1.2.3 golang
类型: string
表示:双引号,反引号(原生多行)
长度计算: len()
格式化: fmt.Sprintf()
常用方法: 一般要借助strings包
strings.Split() strings.Index() strings.LastIndex() strings.Join() strings.Replace() strings.ToUppe() strings.ToLower() strings.Contains() strings.HasPrefix() strings.HasSuffix()
-
1.3 布尔值
1.3.1 python
bool: True/False显式转换: '',0,[],{},None都是False1.3.2 javascript
Boolean: true/false
显式转换:'',0,NaN,undefine,null都是false;[],{}是true1.3.3 golang
bool: true/false
强类型不能显式转换成bool;
类型转换时可借助strconv包进行,字符串转bool用strconv.ParseBool(str)
str为1 t true True TRUE时返回true,
str为0 f false False FALSE时返回false
-
1.4 数组/列表
1.4.1 python
类型: list (常量时tuple)长度计算:len()访问:中括号+索引,list1[3] 支持负索引,支持切片list2[2:5:1]常用方法:`append() insert() extend() pop() sort() remove() reverse()`extend()和加号一样,参数内每个元素加进列表尾遍历:for val in arr: print(val)
1.4.2 javascript
类型: 属于object,可通过Array(1,3)定义和[1,3]一样长度属性:arr.length访问:中括号+索引list1[3], 不支持负索引,不支持切片冒号用法,但支持越界赋值,支持字符串索引,切片通过.slice方法做。常用方法:`slice() indexOf() sort() push() pop() join() reverse() shift() unshift() concat()`concat和加号不同,加号会转成字符串相加遍历:for (var i=0; i<arr.length; i++) { } for (var i in arr){ }
1.4.3 golang
类型:[N]type,切片时无N,数组像py里的tuple,切片像py里的list
长度计算:len()
访问:中括号+索引list1[3],不支持负索引,不能越界赋值,用中括号内冒号的形式返回一个切片
常用函数(全局):
append() copy() cap()
遍历:
for i:=0; i<len(arr); i++{ } for i,val = range arr{ }
-
1.5 映射/map
1.5.1 python
类型:dict
长度计算:len()初始化赋值:obj = {"key1": "value1", 12: "value2"}访问:中括号+索引,索引是常量即可(不一定要str),访问不存在索引时会异常;不能用点号访问常用方法:`get() has_key() items() pop() copy() update() values() ('member' in obj)`全局函数:del遍历:for key in dict1:print(key, '->', dict1[key])for key,val in dict2.items():print(key, '->', val)1.5.2 javascript
类型:object
长度计算:Object.keys(obj).length
初始化赋值:
var obj={key1: "value1",
"key2": "value2",
33: 'value3
}
访问:中括号+索引,或者用点号(成员标识符合法时才行),譬如obj.member等于obj['member'],obj[1]等于obj['1'];索引不存在时返回undefine。
常用方法:
hasOwnProperty() toString()
全局函数
Object.assign()合并 Object.key() in delete
遍历:
for (var key in obj) { console.log(obj[key]); }
1.5.3 golang
类型:map[Ktype]Vtype
长度计算:len()
初始化赋值: mp := map[string]int{"age": 10}
访问:中括号+索引,索引类型跟Ktype要一样;当索引不存在时返回Vtype的缺省初始值(2nd返回值false)。
常用函数:
delete(mp, key)
遍历:
for k,v := range mp{ fmt.Println(k, v) }
2. 语法约定
-
2.1 语句块
功能 python javascript golang 语句块 以缩进形式限定语句块 用大括号包住语句块,括号头不能放新行 用大括号包住语句块,括号头不能放新行 -
2.2 导入
2.2.1 python
import pkg
from pkg import fun
import后跟‘包或模块’,包是含有__init__.py的目录,模块是普通py文件。 包名和目录名要一样。
导入时搜索路径关键看sys.path列表变量。
注意:py2和py3的导入搜索路径有所不同,py3比py2要严格。python2缺省为相对路径导入(首先相对自身py文件所在目录下找,后才到sys.path),python3缺省为绝对路径导入
python -m是在当前执行命令的目录到为`.`,没有-m是以入口文件作为`.`。
2.2.2 javascript
<script src="xxx.js" type="text/javascript"></script>
h5时可省略type。
另外顺便贴下css引入,
<link rel="stylesheet" type="text/css" href="xxx.css">
h5时可省略type。
2.2.3 golang
import(
别名 path/包名
)
有如下特点:
别名可以没有,或点号,下划线;
path在一般在GOPATH路径下;
包名在go文件开始时用package声明(和具体文件名无关系),首字母大写时为导出,包名和目录可以不同,但一个目录只可有一个包,
import关键字导入的是package路径,而在源文件中使用package时,才需要package名;
一个包只能有一个package main;
import “path1/model” //加载gopath/src/path1/model模块;
导入时包内的所有init()被执行;
-
2.3 类型判别
2.3.1 python
查看类型:type()
是否某个类型:isinstance(obj, Type)
是否同一引用:is (注意跟==的区别,面试常考(范围为范围[-5, 256])缓存)
另外提一下java: Java 会对 -128~127 的整数进行缓存,并且注意 == 和 equals 有区别,直接看code吧
Integer a = 10; Integer b = 10; System.out.println(a == b); // true System.out.println(a.equals(b)); // true Integer a = 1000; Integer b = 1000; System.out.println(a == b); // false System.out.println(a.equals(b)); // true
2.3.2 javascript
查看类型:typeof(xxx) 注意数组和map都返回`object`
是否属于某个类型:a instanceof A
获取准确具体类型: Object.prototype.toString.call(xx)
console.log(Object.prototype.toString.call(123));//[object Number] console.log(Object.prototype.toString.call(true));//[object Boolean] console.log(Object.prototype.toString.call("ho"));//[object String] console.log(Object.prototype.toString.call(undefined));//[object Undefined] console.log(Object.prototype.toString.call(null));//[object Null] console.log(Object.prototype.toString.call({name: "ho"}));//[object Object] console.log(Object.prototype.toString.call(function(){}));//[object Function] console.log(Object.prototype.toString.call([]));//[object Array] console.log(Object.prototype.toString.call(new Date));//[object Date] console.log(Object.prototype.toString.call(/\d/));//[object RegExp] function Person(){}; console.log(Object.prototype.toString.call(new Person));//[object Object]
2.3.3 golang
是否某个类型: obj2,err:=obj.(Type) // obj是否属于Type类型
或 switch val := obj.(type){
case int:
case string:
default:}
----
reflect包反射 参考
TypeOf() Type
ValueOf() Value
-
2.4 条件判断
2.4.1 python
if a >= b and not( b > 0): pass elif c in cond1: pass else: pass
2.4.2 javascript
if (a > b && b > 0){ } else if(b > c || !(d >= 0)){ } else { }
注意: 大括号头都不能单独一行
2.4.3 golang
if a > b && b > 0 || c > 0 { } else if c < 13 { } else { } ---- if val,err=func(); err!=nil{ } --
注意: 大括号头尾都不能单独一行
-
2.5 循环
2.5.1 python
for a in list1: print(a) for i in range(10): print(i) count = 0 while (count < 10): count += 1
2.5.2 javascript
var i; for (i=0; i < 10; i++){ ... } for (var key in obj) { console.log(obj[key]) } var i=0; while (i < 10) { } do { } while(i < 10);
2.5.3 golang
for i:=0; i < 10; i++ { fmt.Println("i is ", i) } for i < 100 { } for key, value := range myMap { fmt.Println(key, value) }
2.6 Json处理
2.6.1 python
import json 序列化:json.dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, encoding="utf-8", default=None, sort_keys=False, **kw) 反序列化:json.loads(s, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
2.6.2 javascript
原生支持
序列化:JSON.stringify(obj)
反序列化:JSON.parse(str)2.6.3 golang
import "encoding/json" 序列化:func Marshal(v interface{}) ([]byte, error) 反序列化:func Unmarshal(data []byte, v interface{}) error