静态 强类型 编译型语言
GO语言适用场景及GO语言的优势
Go语言是谷歌推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:
我们之所以开发Go,是因为过去10多年间软件开发的难度令人沮丧。
Go是谷歌2009发布的第二款编程语言。该奖项授予在2009年市场份额增长最多的编程语言。
谷歌资深软件工程师罗布·派克(Rob Pike)表示,“Go让我体验到了从未有过的开发效率。”派克表示,和今天的C++或C一样,Go是一种系统语言。他解释道,“使用它可以进行快速开发,同时它还是一个真正的编译语言,我们之所以现在将其开源,原因是我们认为它已经非常有用和强大。
package main import "fmt" func main() { fmt.Println("Hello, 世界") }
var age int =10 var age =10 age := 2018 const age int = 10 const age= 10
大些字母开头的变量或者函数等是public的,可以被其他包访问;小些的则是private的,不能被其他包访问到。这样就省去了public和private声明的烦恼,使代码变的更简洁。
map类型,Java里是Map接口,go里叫做字典
ages := make(map[string]int) ages["weimin"] = 20 ages["brother"] = 30 fmt.Print(ages["michael"]) //删除 delete(ages,"michael")
package main import "time" type Person struct { age int name string } func (p Person) GetName() string { return p.name } func GetTime() time.Time{ return time.Now() }
包名调用称之为函数
创建对象实例调用称之为方法
func backValue() (string, int, error) { return "helloWorld", 100, nil } str,value:=backValue() str,_:=backValue()
Go的指针和C中的声明定义是一样的,其作用类似于Java引用变量效果。 var age int = 10 var p *int = &age *p = 11 fmt.Println(age) // age=11
package main import ( "fmt" ) type Person struct { age int name string Address // 组合 } type Address struct { city string } func (p Person) GetName() string { return p.name } func (p Person) GetAge() int { return p.age } //值拷贝,不改变原来的User对象值 func valueDeliver(person Person) { person.name = "值拷贝" person.age = 12 fmt.Println("person :", person) } func pointerDeliver(person *Person) { person.name = "指针" person.age = 12 fmt.Println("person :", person) } func main() { person := Person{} valueDeliver(person) pointerDeliver(&person) //person : {12 值拷贝 {}} //person : &{12 指针 {}} }
Go的接口和Java类型,不过它不需要强制实现,在Go中,如果你这个类型(基本类型,结构体等都可以)拥有了接口的所有方法,那么就默认为这个类型实现了这个接口,是隐式的,不需要和java一样,强制使用implement强制实现。
package main import ( "fmt" "strconv" ) type Stringer interface { String() string } type User struct { age int name string } func (p User) String() string { return "name is " + p.name + ",age is " + strconv.Itoa(p.age) } func main() { var str Stringer user := &User{} user.age = 10 user.name = "hello" str = user fmt.Println(str) }
package main import "fmt" //协程通信 exit := make(chan struct{}) go func() { time.Sleep(time.Second * 3) println("chan1 chan goroutine end") defer close(exit) //关闭通道 }() println("main start...") <-exit //main start... //chan1 chan goroutine end //main end... //同步 var rw sync.RWMutex func (p *Person) updateToken(name string) { rw.Lock() defer rw.Unlock() // updateToken }
go内置的error类型非常简洁,只用实现Error方法即可,可以打印一些详细的错误信息,比如常见的函数多值返回,最后一个返回值经常是error,用于传递一些错误问题,这种方式要比java throw Exception的方法更优雅。
Defer代替finally
go中没有java的finally了,那么如果我们要关闭一些一些连接,文件流等怎么办呢,为此go为我们提供了defer关键字,这样就可以保证永远被执行到,也就不怕关闭不了连接了。
f,err:=os.Open(filename) defer f.Close()