探索Google Go语言(一)

开发 前端
本文不是教程,本身只是为了让大家对Google Go语言有进一步的了解。极力维持语言特性的简洁,力求小而精,越深入go,你就会发现go真的是太简洁了。

看到网上有些人说Go是python 4.0,对此看法,我不敢苟同。从本质上讲,这两个是完全不同的语言。go是静态型编译语言,python是动态型解释语言(脚本语言);go的执行速度属于微秒级,可精确到纳秒,而python属于毫秒级,根本无法比;go完全支持指针,python不支持,只有引用。闲话不多说,下面就来看看go长得啥样子。如果你有C/C++,JAVA,C#,python等语言基础,对linux有些了解,我相信你一定会很快会对go有初步了解。

  老规矩,先来个hello world。

  hello.go

package main //声明本文件的package名    
import "fmt" //import语言的fmt库——用于输出    
func main() { 
  var str string = "hello world" 
  //str := "hello world" 
  //var str = "hello word" 
   fmt.Println(str)  

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  运行

  有两种方式可以解释运行

  1、先编译:go build hello.go

    再运行:./hello

  2、也可以直接进行编译运行(其实下面这个命令实际是编译成hello.out再执行):go run hello.go

  对于习惯了C系列语言的同学来说,会对go的语法很不习惯。***,go没有使用“;”作为语句结束标志;第二,go是变量在类型前面,变量初始化还可以如注释的那两行语句,不用指定类型,go编译器可以从初始化表达式的右值导出该变量应该声明为哪种类型,这让go看起来有点像动态语言,这也可能为什么有人说它是python 4.0的原因吧。

  go很可能是***个将代码风格进行强制统一的语言,例如go语言要求public的变量名必须以大写字母开头,private变量则以小写字母开关,这种做法不仅免除了public,private关键字,更重要的是统一了风格。还有,对于判断语句,如果你写成这样:

if str == "descur"
    .... 

else
    .... 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

是不能编译通过的,一定要写成这样:

if str == "descusr"
    ... 
}else
    ... 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

这可能对那些在微软怀抱中长大的孩子来会很痛苦,但对像我这些有代码洁癖的人来说未尝不是好事。其实统一了代码风格,进行团队合作时是很有益的。

编程哲学
  • 1.

  C语言是纯过程式的,这和它产生的历史背景有关。C#/JAVA语言则是高度的面向对象语言,典型表现是它们的体系里不存在孤立的方法,这些方法必须是属于某个类。而go没有去否认任何一方,而是用批判吸收的眼光,综合了各种编程思想,融合众家之长,极力维持语言特性的简洁,力求小而精,越深入go,你就会发现go真的是太简洁了。

  从编程范式的角度看,go是变革派,不是改良派。

  虽然go属于面向对象语言,但在go的概念里没有面向对象这个概念,只有结构体。go的类具有高度的粒子性,如下面的代码:

type rect struct { 
      width, height int 
 } 
  
 func (r *rect) area() int { //求面积 
      return r.width * r.height  
 }    
  
 func (r *rect) perimeter() int{ //求周长 
      return 2*(r.width + r.height)  
 }    
  
 func main() { 
      r := rect{width: 10, height: 15
      fmt.Println("面积: ", r.area()) 
      fmt.Println("周长: ", r.perimeter())  
      rp := &r 
      fmt.Println("面积: ", rp.area()) 
      fmt.Println("周长: ", rp.perimeter())  
 } 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.

类和类方法完全分开,只有在初始化对象后才进行调用,减少了耦合度。go没有构造函数和析构函数。由于go语言中没有虚函数,也就没有vptr,支持构造函数和析构函数就没有太大价值。

  其次,go语言反对函数和操作符重载,而C#,C++,和JAVA允许同名函数或者操作符,只要它们的参数列表不同。虽然重载解决了一小部分OOP问题,但却给这些语言带来了极大的负担,并且这种方法对解决问题问题并没有带来多大价值,所以go就不提供重载。

  再次,go反对继承,反对虚函数和虚函数重载。其实,go也提供了继承,只不过采用了组合的方法来提供:

type Car struct{ 
     Base 
     ... 
 } 
  
 func (color *Car) Drive(){ 
     ... 
 } 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  放弃了大量的OOP特性后,go提供了一份相当棒的功能:接口。你可能会有疑问,所有面向对象语言也有接口啊?但那些面向对象语言的接口都基本上一样,而go的却跟它们不一样。

  go语言中的接口与其他语言***的一点区别是它的非侵入性。在C#等面向对象语言中,为了实现接口,你需要从接口继承,如:

public interface IBankAccount 

    void PayIn(decimal amount); 

  • 1.
  • 2.
  • 3.
  • 4.
 
class SaverAccount : IBankAccount 

 
    public void PayIn(decimal amount) 
    { 
        Console.WriteLine("This is PayIn"); 
    } 
 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

在go语言中,实现类的时候无需从接口派生,如:

type SaverAccount  struct{   //go 
    ... 

 
var saveAccount IBankAccount = new(SaveAccount) 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

只要实现了IBankAccount要求的所有方法,就实现了该接口,可以进行赋值,相当原子性。

原文链接:http://www.cnblogs.com/descusr/archive/2012/11/07/2759575.html

【编辑推荐】

责任编辑:彭凡 来源: 博客园
相关推荐

2011-01-05 10:58:05

Google Go

2023-11-30 08:09:02

Go语言

2012-07-06 13:16:37

Google Go

2009-12-10 10:33:09

Go语言

2010-08-10 15:13:11

GoGoogle

2018-03-12 22:13:46

GO语言编程软件

2010-10-13 10:47:52

GoGoogle

2012-03-13 10:40:58

Google Go

2012-08-06 08:50:05

Go语言

2013-07-30 09:23:43

VMwareGoogle云平台

2013-07-30 09:27:32

Go云计算语言

2009-12-28 09:09:34

Google开源项目

2024-03-29 09:12:43

Go语言工具

2009-11-11 10:43:49

Go语言Google

2024-04-07 00:04:00

Go语言Map

2019-05-15 11:38:22

GoogleGo编程语言

2017-01-09 11:28:31

编程语言排行榜

2011-11-14 09:47:20

Google Go

2010-01-11 09:38:28

编程语言排行榜Google Go

2022-09-16 07:40:17

CloudWeGo开源Rust
点赞
收藏

51CTO技术栈公众号