Python Javascrip Go基础点比较学习(一)


前言

 

    使用过多个语言做互联网开发的朋友,往往在切换过程中没那么快反应过来该用哪种语法,譬如我要知道对象obj是什么类型,那我该用typeof(obj)? type(obj)?还是type obj? 因为这些都见过且容易混淆忘记。 本文就总结下python,javascrip和go在一些基础语法上写法,大家对比着看可能更加深理解,也作为以后开发时查阅语法帮助文档。 文中主要是比较主要语法,不进行细节深入。

 

1. 基本数据类型

  • 1.1 数值类型

    1.1.1 python

    int 整数,可以是任意大的正整数,负整数和零
    float 浮点数/小数,可以任意大小


    1.1.2 javascript

    Number: 不区分整数据小数正负,一律通用,有两个特殊的值是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都是False

    1.3.2 javascript

    Boolean: true/false
    显式转换:'',0,NaN,undefine,null都是false;[],{}是true

    1.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



 

/latefirstcmt/6