大家好,作为一名Java老兵,最近因工作原因需要熟悉一下golang。下面谈一下我对这个语言的一些看法。

 

听说go语言很火,一个Java老兵怎么看

 

 

golang出身贵族google,于2009年11月正式宣布推出。相比Java在1995年推出,golang算是一门比较新的语言了。更是因为有docker,k8s等助力,让golang跟着火了起来。不过,看最近几年的发展,并没有像Java一样迅速的火起来,相对来说,golang这10年的发展,并非顺风顺水,竞争产品也在不断增加。

个人还是比较喜欢golang的,但是作为一个企业级语言,我觉得golang在生态方面还需要加强,在语法上有些复杂。不信,请看。

一、生态

生态系统,最早是从生物课本上面学到的。现在看,生态真是太重要了。中国就是因为没有打造出一个软件生态系统,所以20多年过去了,还没有搞出自己的操作系统。golang也是一样,在Java语言中,web项目有tomcat这样的中间件,spring和mybatis框架,日志log4j等,每个组件和中间件都很成熟,有良好的扩展性。但是golang,web开发大部分人用的是gin,url及处理方法,需要在一个main函数中写上好几百行url和处理函数的映射关系,甚至上千行。除了gin,在golang中,很难找到类似spring,mybaitis,log4j这样的框架。生态这方面来看,golang甚至还不如.net。

golang开发一个web项目

package main

import "github.com/gin-gonic/gin"

func main() {
    r := gin.Default()
    r.GET("/ping", func(c *gin.Context) {
        c.JSON(200, gin.H{
            "message": "pong",
        })
    })
    r.Run() // listen and serve on 0.0.0.0:8080
}

二、复杂语法

我大学学习的c语言,工作后用的Java,这两种语言,语法上非常相似,关键字也比较少。尽管现在Java8增加了像lamda,函数式接口,stream等新特性,但是其基本类型语法基本上没有变化。但是golang则不一样。下面我从两个方面说一下golang的特别语法之处。

2.1数组和结构体默认为值传递

golang的数组和struct,一反常态的竟然是值传递。所以Java和c语言的开发转golang的话,一定要注意这两个特性。

来个数组传递例子:

func printAndModify(data [3]int )  {
   fmt.Printf("%d\n" ,data[0])
   data[0]=10
}
func main() {
   var data  = [3]int{1, 2, 3}
   printAndModify(data)
   fmt.Printf("%d\n" ,data[0])
}

打印结果:

1
1

未声明数组大小的传递。

func printAndModify(data []int) {
   fmt.Printf("%d\n",data[0])
   data[0] =10
}
func main() {
   data := []int {1,2,3}
   printAndModify(data)
   fmt.Printf("%d\n",data[0])
}

打印结果

1
10

怎么样,golang够奇妙的吧;

2.2独特的函数定义

golang的函数其实和c的函数是一样的,和Java的成员方法不太一样。但是其书写方式一开始还真不习惯,函数返回值在函数定义的最后面。

习惯了c和java的程序员,这个特性让人很疑惑。

函数定义

func 函数名(形式参数列表)(返回值列表){
    函数体
}

如下定义了一个返回值为两个int值的函数定义

func typedTwoValues() (int, int) {
    return 1, 2
}

调用使用以下方法

func main() {
    a, b := typedTwoValues()
    fmt.Println(a, b)
}

如果在函数前面加上类型,是什么意思?大家有兴趣可以自己探索一下。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐