`
yang_kunlun
  • 浏览: 77238 次
  • 性别: Icon_minigender_1
  • 来自: 地球
最近访客 更多访客>>
社区版块
存档分类
最新评论

GO 语言入门

阅读更多
google go: 入门
参考: http://www.infoq.com/articles/google-go-primer

特点: simple, fast, safe and concurrent

Variable Declarations

var sum int // Just a declaration
var total int = 42 // A declaration with initialization
name := "Samuel"

Conditionals

if result := someFunc(); result > 0 {
/* Do something */
} else {
/* Handle error */
}

Switches

var result int
switch byte {
case 'a', 'b':
  result = 1
default:
  result = 0
}

switch result := calculate(); true {
case result < 0:
  /* negative */
case result > 0:
  /* positive */
default:
  /* zero */
}

Range

range表达式右边必须是array, slice, string or map 类型, or a pointer to an array; or it may be a channel.

Functions

func add(a, b int) int { return a + b }

Multiple Return Values

func divide(a, b int) (quotient, remainder int) {
  quotient = a / b
  remainder = a % b
  return
}

Anonymous Functions 匿名函数(闭包)

func makeAdder(x int) (func(int) int) {
  return func(y int) int { return x + y }
}

func main() {
  add5 := makeAdder(5)
  add36 := makeAdder(36)
  fmt.Println("The answer:", add5(add36(1))) //=> The answer: 42
}
闭包可以做为参数传递

Primitive Types

两种新类型 two new types: slice and map.

Arrays不是动态的,跟c一样。
slices是一种新形式的array

/* Construct a slice on ary that starts at s and is len elements long */
s1 := ary[s:len]

/* Omit the length to create a slice to the end of ary */
s2 := ary[s:]

/* Slices behave just like arrays */
s[0] == ary[s] //=> true

// Changing the value in a slice changes it in the array
ary[s] = 1
s[0] = 42
ary[s] == 42 //=> true
改变slices的同时,也将改变array

/* Move the start of the slice forward by one, but do not move the end */
s2 = s2[1:]

/* Slices can only move forward */
s2 = s2[-1:] // this is a compile error

/* Cannot grow it past its capacity */
s = s[0:4] // this is a compile error

不需要array也能初始化slices

/* literal */
s1 := []int{1,2,3,4,5}

/* empty (all zero values) */
s2 := make([]int, 10) // cap(s2) == len(s2) == 10

Maps 哈希

m := make(map[string] int) // A mapping of strings to ints

/* Store some values */
m["foo"] = 42
m["bar"] = 30

/* Read, and exit program with a runtime error if key is not present. */
x := m["foo"]

/* Read, with comma-ok check; ok will be false if key was not present. */
x, ok := m["bar"]

/* Check for presence of key, _ means "I don't care about this value." */
_, ok := m["baz"] // ok == false

/* Assign zero as a valid value */
m["foo"] = 0;
_, ok := m["foo"] // ok == true

/* Delete a key */
m["bar"] = 0, false
_, ok := m["bar"] // ok == false

Object Orientation 面向对象

Structs

type Point struct {
  x, y float64
}

var p *Point = new(Point)
p.x = 3
p.y = 4
实例化个对象,并用指针类型的p去调用它的方法和变量
/* Note the receiver is *Point */
func (self *Point) Scale(factor float64) {
  self.x = self.x * factor
  self.y = self.y * factor
}
p.Scale(2);
d = p.Length() //=> 10
注意下面的self被定义成指针,这样self的值修改后可以返回修改后的值。如果定义成Point,参数是传值的,修改后的值不会被返回。

Interfaces 接口

duck-typed mentality 编译是动态识别类型

定义 type Writer interface {
  Write(p []byte) (n int, err os.Error)
}
type Frobber interface {
  Frob()
}

func frobtastic(f Frobber) { f.Frob() }
功能的抽象,作为参数可在别处调用

每个对象都实现了一个空接口 interface {}

Inheritance 继承

go语言没有继承, 使用组合和代理
type Engine interface {
  Start()
  Stop()
}

type Car struct {
  Engine
}
func GoToWorkIn(c Car) {
  /* get in car */

  c.Start();

  /* drive to work */

  c.Stop();

  /* get out of car */
}

也可以使用代理
type Base struct {}
func (Base) Magic() { fmt.Print("base magic") }
func (self Base) MoreMagic() {
  self.Magic()
  self.Magic()
}

type Foo struct {
  Base
}
func (Foo) Magic() { fmt.Print("foo magic") }
f := new(Foo)
f.Magic() //=> foo magic
f.MoreMagic() //=> base magic base magic

方法重载不对其有影响

Concurrency 并发

message-passing model  消息传送 支持内存共享
逻辑: 通信不依赖内存共享 内存共享依赖通信

两个基本结构: goroutines  channels

Goroutines
有不同名字, 可以卸载任何依赖包
定义 go DoThis() // but do not wait for it to complete
匿名函数调用  go func() {
  for { /* do something forever */ }
}() // Note that the function must be invoked

Channels

提供了FIFO先进先出的消息队列供并发间通信
/* Creating a channel uses make(), not new - it was also used for map creation */
ch := make(chan int)

/* Sending a value blocks until the value is read */
ch <- 4

/* Reading a value blocks until a value is available */
i := <-ch

长时间数值计算
ch := make(chan int)

go func() {
  result := 0
  for i := 0; i < 100000000; i++ {
    result = result + i
  }
  ch <- result
}()

/* Do something for a while */

sum := <-ch // This will block if the calculation is not done yet
fmt.Println("The sum is:", sum)

两个方法定制:
指定缓存大小
可发送接受操作成功信息
/* Create a channel with buffer size 5 */
ch := make(chan int, 5)

/* Send without blocking, ok will be true if value was buffered */
ok := ch <- 42

/* Read without blocking, ok will be true if a value was read */
val, ok := <-ch

Packages 包
文件开头 依赖包声明, 大写开头的能同时被其他包使用

package geometry

import "math"

/* Point is capitalized, so it is visible outside the package. */

type Point struct {

  /* the fields are not capitalized, so they are not visible
     outside of the package */

  x, y float64
}

总结

两个大的缺失: exceptions and generics(泛型), 目的是要取代C

分享到:
评论

相关推荐

    go语言入门教程.pdf

    go语言入门教程.pdf

    go 语言 入门

    Go语言,通常被称为Golang,是由Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。它具有简洁、快速、安全和现代的特点。Go语言设计团队的初衷是为了让编程更加简单、高效,同时能够应对...

    go语言入门教程,新手必备

    ### Go语言入门教程知识点详解 #### 一、Go语言的历史背景与起源 - **Limbo语言的影响**:Limbo语言被视为Go语言的前身之一,它不仅由相同的设计团队开发,而且Go语言还从Limbo中继承了许多优秀特性。 - **贝尔...

    Go语言入门经典 源码

    Go语言,又称Golang,是由Google开发的一种静态类型的、编译型的、并发型的、垃圾回收的、具有C风格的编程语言。本资源“Go语言入门经典 源码”是一份针对初学者的Go语言学习资料,包含了丰富的源代码示例,旨在帮助...

    go语言入门教程

    go语言入门教程,让你轻松的入门学习掌握。Go语言是谷歌推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发Go,是因为过去10...

    go语言入门精通全资料

    Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易 Go 是由 Google 的一个团队与一些开源社区的 贡献者 一同开发的开源项目。 Go 编程语言是一个开源项目,它使程序员更具生产力。 Go 语言具有很...

    Go语言入门PPT

    Go语言入门PPT,包含对Go主要特性的讲解及相关代码示例

    Golang韩顺平Go语言入门_素材文件.zip

    《Golang韩顺平Go语言入门》是一套全面介绍Go语言核心编程的教程素材,旨在帮助初学者快速掌握这门现代、高效的系统编程语言。Go语言,也被称为Golang,由Google公司于2009年推出,由Robert Griesemer、Rob Pike及...

    go语言入门文档

    Go语言,又称Golang,是由Google开发的一种静态类型的、编译型的、并发型的、垃圾回收的编程语言。它的设计目标是提高开发者的生产力和软件的运行效率,特别注重简洁、清晰和高效的语法,使其成为构建大规模分布式...

    Go语言入门教程+pdf

    Go语言入门教程+pdf

    Go语言圣经,golang学习入门到精通

    Go语言,又称Golang,是由Google开发的一种静态类型的、编译型的、并发型的、垃圾回收的语言。它旨在提高编程效率,简化并发编程,并强调简洁的编程哲学。Go语言的设计受到了多门经典编程语言的影响,如C语言、...

    Go语言入门新手参考.docx

    Go语言入门新手参考 Go语言作为现代化的语言,旨在提供一种简洁、快速、可靠的编程体验。下面是Go语言入门新手参考的知识点总结: 1. Go语言的起源、发展与普及: Go语言由谷歌公司开发,于2009年首次发布。Go...

    golang语言入门笔记,保留一下。

    go语言入门笔记。。

    go语言入门教程.doc

    Go语言,也称为Golang,是由Google设计的一种静态类型的编程语言。它于2009年发布,并因其简洁、高效的特点迅速获得了开发者们的青睐。Go语言的设计目标是提供一种易于学习、编译速度快、运行效率高的现代编程语言。...

    golang基础教程-go语言快速入门.zip

    《Go语言快速入门:Go语言基础教程》 Go语言,又称Golang,是Google在2009年推出的一种开源编程语言,由罗伯特·格瑞史莫、罗布·派克和肯特·贝克等大神设计。Go语言的设计目标是简单、高效、安全,特别适合构建...

    (自学笔记)Go语言入门教程.pdf.zip

    Go语言(又称Golang)是由Google的三位工程师Robert Griesemer、Rob Pike和Ken Thompson于2007年开始设计,并在2009年11月正式宣布推出的静态强类型、编译型编程语言。Go语言的设计目标是提供一种高效、简洁、安全且...

    Go语言入门英语讲解PDF(生肉).zip

    Go语言,也被称为Golang,是由Google开发的一种静态类型的、编译式的、并发型且具有垃圾回收功能的编程语言。它的设计目标是提高开发效率,同时保持程序的高性能和可靠性。Go语言以其简洁的语法、高效的并发模型以及...

Global site tag (gtag.js) - Google Analytics