• 从 Java 到 Go


    go 中少得可怜的集合类

    Java 中的集合类是丰富多彩的,这也造成了,初学者的选择困难症。了解得不够仔细的话,经常是随便选。而 go 中则少得可怜,原生的只有 map 、 slice (类似于 Java 中的 List) 和 array(我还没用过这种类型)。array 和 slice 的区别类似于 Java 中的数组和 list 的区别。Go 中连个 Set 都没有,用起来很不方便(当然,也有别人造好的轮子)。

    go 中没有重入锁的概念

    go 中一个 goroutine (类似于 Java 的线程) 获得了某个锁,如果在其随后调用的方法中,还有获得这个锁的代码,那么相当于死锁了,不像 Java 中可以重入。这点感觉不是太好。编码时要特别小心。

    go 中错误处理

    go 认为错误是可预见性的,所以一般会发生错误的地方(如:数据库操作,网络连接)显式地把错误当做返回值。所以有大量的地方有类似如下的代码。当一个service 里调用多个会返回 error 的方法时,会有多个下面这样处理的代码片断,感觉有点繁锁。个人还是比较喜欢 Java 的在最外层去捕捉异常的方式。

    if err != nil {
       ......
    }
    

    go 的日期格式

    go 中的日期格式化时,用的是: 2006-01-02 15:04:05 , 而不是 yyyy-MM-dd HH:mmss 这种比较通用的表示。有点太异类了。

    go 的时间

    在设置某个请求的时候,一般会设置一个超时时间, go 中专门定义了一个 duration 的类型, 如 time.Second 表示秒,一般我们会定义一个变量(如: DefaultTimeout = 10),然后设置的时候,我们想当然地认为像下面这样设置

    req.SetTimeout(DefaultTimeout * time.Second)
    

    但是很不幸,编译器直接报错了。但是像下面那样写又是可以的。WTF。

    req.SetTimeout(10 * time.Second)
    

    解决方法是:

    req.SetTimeout(time.Duration(DefaultTimeout) * time.Second)
    

    go 中几乎没有 null 值

    go 中除了需要用 make 创建的类型和 interface, 其它的类型都没有 null 值,go 都会给其一个“零”值。这个从 Java 转过来的特别不习惯,主要有几下几点:

    • go 中如果要返回一个结构体, 则方法中当出现错误处理时,没办法返回一个 nil 值 ,只能返回一个空的结构体。感觉有点浪费内存。
    • 对于一些代码项,不要使用 0。比如 status 用 0 表示 disabled。如果这样做了,当你查询时, 不管你传没传 status, 得到的 status 的值就是 0,没办法区分到底要不要根据 status 进行查询

    赋值顺序一定要正确

    stu := new(Student)
    students := make([]Student, 0)
    students = append(students, stu)
    
    teacher := new(Teacher)
    teachers := make([]Teacher, 0)
    teachers = append(teachers, teacher)
     
    stu.Teachers = teachers
    

     这样的话,你会一头雾水地发现 students 里的stu 里的 Teachers 是空的。 WTF。 你需要把 students = append(students, stu) 这一句放到最下面才能解决问题。

    go 中除非显示地用指针,否则都是值传递

    这一点对于 Java 转来的同学,特别的不习惯。获取到一个列表后,想要循环这个列表,对每条记录的信息做些修改。像下面这样。

    for i, record := range list{
      record.Name = "xxx"
      //list[i].Name = "xxx"
    }
    

    你会奇怪的发现, list 里的对象的值并没有被改变,还是原来的值。WTF。需要使用注释掉的那条语句才行。

    go 中变量可见性

    go 中变量或 struct 是否对外部包可见,是根据命名的第一个字母是否大写。 这点个人感觉不太习惯。一般 Java 的习惯是类都是大写开头,变量都是小写开头(除常量外)。

    go 中的 struct

    struct 类似于 Java 中的类,但是其本体内只能定义成员变量(属性),其方法需要通过下面的方式定义。感觉怪怪的。

    type Student struct{
      Age int
      Name string
    }
    func (s *Student) Sleep(){
       // ...
    }
    

    暂时就写这些,以后碰到再加上。

  • 相关阅读:
    Vue内置指令
    Vue计算属性
    Ubuntu下编译Bilibili/ijkplayer
    自毁程序
    Android最大可运行内存
    Android ListView onItemClick Not Work
    Java/Android 二进制数据与String互转
    JAVA/Android Map与String的转换方法
    java中打印变量地址
    Win7 关闭Window update
  • 原文地址:https://www.cnblogs.com/langfanyun/p/15506752.html
Copyright © 2020-2023  润新知