一名Java开发的Go语言学习笔记(一)

2023-05-15  本文已影响0人  泊浮目
版本 日期 备注
1.0 2023.5.15 文章首发

本文首发于泊浮目的掘金:https://juejin.cn/user/1468603264665335

0. 概要

最近因为业务需要在学Go语言,虽然之前也用过别的语言,但主力语言一直是Java。在这里也想主要想用Java做对比,写几篇笔记。

这篇主要是讲语言本身及较为表面的一些对比。

这里的对比用的是Java8,Go的版本是1.20.2。

1. Compile与Runtime

有兴趣的同学可以看我之前的的一篇笔记:《笔记:追随云原生的Java》

2. 命名规范

3. 标准库对于工程能力的支持

4. Composite litera(复合字面值)

可能没人听过这个说法,举几个例子:

m := map[int]string {1:"hello", 2:"gopher", 3:"!"}

复合字面值由两部分组成:一部分是类型,比如上述示例代码中赋值操作符右侧的map[int]string;另一部分是由大括号{}包裹的字面值。

在声明对象时,也有类似的用法:

// $GOROOT/src/net/http/transport.go
var DefaultTransport RoundTripper = &Transport{
    Proxy: ProxyFromEnvironment,
    DialContext: (&net.Dialer{
        Timeout:   30 * time.Second,
        KeepAlive: 30 * time.Second,
        DualStack: true,
    }).DialContext,
    MaxIdleConns:          100,
    IdleConnTimeout:       90 * time.Second,
    TLSHandshakeTimeout:   10 * time.Second,
    ExpectContinueTimeout: 1 * time.Second,
}
 

Go推荐使用field:value的复合字面值形式对struct类型变量进行值构造,这种值构造方式可以降低结构体类型使用者与结构体类型设计者之间的耦合,这也是Go语言的惯用法。

这个是真的很香,Groovy和Kotlin也有类似的支持,很方便使用。尤其是构造函数特别长的时候,你可能说builder也可以做到,但谁不想少写几行代码呢。

5. 对于编程范式的支持

//声明一个类型
type MyInt int
//绑定一个方法
//func后面的()里,相当于声明了这个方法绑定的类型。在Go语言里叫做recevier,一个函数只能有一个recevier,且不能是指针、接口类型。
//不能横跨Go包为其他包内的自定义类型定义方法。
func (i MyInt) String() string {
    return fmt.Sprintf("%d", int(i))
}
//在编译期,会把方法的第一个参数变成recevier。很简单的实现。有点像Koltin中的Extension Properties。

6. 异常流:Error与Exception

7. 并发

上一篇 下一篇

猜你喜欢

热点阅读