1 GO语言的模块化和面向对象 - 电子电路图,电子技术资料网站 - 德赢Vwin官网

您好,欢迎来德赢Vwin官网 网! ,新用户?[免费注册]

您的位置:德赢Vwin官网 网>源码下载>数值算法/人工智能>

GO语言的模块化和面向对象

大小:0.6 MB 人气: 2017-09-28 需要积分:2

  这是关于评论GO语言的第二部分,第一部分:,第三部分会在不日后在CSDN公众号(ID:csdnnews)发布。

  在第一部分里面就GO语言的简单功能(特征)做了论述,如常用语法,基本类型等。本文将主要提及GO所支持的package(包)和面向对象。在这之前呢,还是建议读者阅读一下此书,照旧,欢迎各方高人点评和纠错。

  总的来说,我发现GO语言面向对象的语法有点乱,一致性差、不明显,所以对于大多数使用场合,个人更倾向于C++明显的继承层次结构。

  在这个部分的文章里面故意不提及系统构建,分发或者配置等内容。

  Packages(包)

  Go代码是以软件包的形式组织的,Java也有包的概念,二者很像,跟C++命名空间也有点类似。 在源文件的开头声明包的名称:

  package foo

  当需要用到某个包时,用import方式导入:

  package bar //定义了包名

  import ( //告诉Go编译器这个程序需要使用 foo、moo 包(的函数,或其他元素)

  “foo”

  “moo”

  )

  func somefunc() {

  foo.Yadda()

  var a moo.Thing

  。。.

  }

  包名称应与文件的目录名称匹配。 这是import语句找到对应包的关键。一个目录可允许有多个文件,这些文件都是同一个包的一部分。

  package main不受以上规则约束。由于其唯一性,所以对应的目录不需要命名为main。

  结构体

  在Go语言中可以像C一样声明一个结构体:

  type Thing struct {

  // Member fields.

  // Notice the lack of the var keyword.

  a int

  B int // See below about symbol visibility

  }

  var foo Thing

  foo.B = 3

  var bar Thing = Thing{3}

  var goo *Thing = new(Thing)

  goo.B = 5

  我习惯使用var关键字演示变量的实际类型,也可能会选择较短的表达式 := 。

  请注意,我们可以将其创建为一个值或一个指针(使用内置的new()函数),与C或C ++不同,Go中的结构体所占的实际内存并不能确定是在堆还是栈上。 具体由编译器决定,一般是根据内存是否需要延续功能调用来分配。

  以前,我们已经看到内置的make()函数用于实例化slices(切片)和maps(集合)。 make()仅适用于那些内置类型。 对于自定义类型,可以使用new()函数。 我发现这个区别有点混乱,但是我一般不喜欢使用语言本身就可以实现的类型区别。 我喜欢C++标准库如何在C++中实现方式,当往库里面添加内容时,语言本身几乎没有什么特别的支持。

  Go类型通常具有“构造函数”(而不是方法),应该调用该函数来正确实例化该类型,但是我认为没有办法强制执行正确的初始化,就像C++或Java中的默认构造函数。 例如:

  type Thing struct {

  a int

  name string

  。。.

  }

  func NewThing() *Thing {

  // 100 is a suitable default value for a in this type:

  f := Thing{100, nil}

  return &f

  }

  // Notice that different “constructors” must have different names,

  // because go doesn‘t have function or method overloading.

  func NewThingWithName(name string) *Thing {

  f := Thing{100, name}

  return &f

  }

  Embedding Structs(嵌套结构体)

  可以匿名地将一个结构体“嵌入”到其他结构体中,如下所示:

  type Person struct {

  Name string

  }

  type Employee struct {

  Person

  Position string

  }

  var a Employee

  a.Name = “bob”

  a.Position = “builder”

  这感觉有点像C ++和Java中的继承,例如,可以这样:

  var e = new(Employee)

  // Compilation error.

  var p *Person = e

  // This works instead.

  // So if we thought of this as a cast (we probably shouldn’t),

  // this would mean that we have to explicitly cast to the base class.

  var p *Person = e.Person

  // This works.

  e.methodOnPerson()

  // And this works.

  // Name is a field in the contained Person struct.

  e.Name = 2

  // These work too, but the extra qualification is unnecessary.

  e.Person.methodOnPerson()

  Methods(方法)

  Go语言中的结构体可以有Methods(与结构相关联的函数),这点和C/Java语言的classes(类)很像 , 但在语法方面略有不同。

非常好我支持^.^

(0) 0%

不好我反对

(0) 0%

      发表评论

      用户评论
      评价:好评中评差评

      发表评论,获取积分! 请遵守相关规定!