这篇指南为了能够帮助Java程序员快速深入了解Go语言特性!
主要区别
面向对象:
- Go 语言的面向对象编程(OOP)非常简洁而优雅。说它简洁,简洁之处在于,它没有了OOP中很多概念,比如:继承、虚函数、构造函数和析构函数、隐藏的this指针等等。说它优雅,是它的面向对象(OOP)是语言类型系统(type system)中的天然的一部分。整个类型系统通过接口(interface)串联,浑然一体。
employee.go
- package employee
- import (
- "fmt"
- )
- type employee struct {
- firstName string
- lastName string
- totalLeaves int
- leavesTaken int
- }
- func New(firstName string, lastName string, totalLeave int, leavesTaken int) employee {
- e := employee {firstName, lastName, totalLeave, leavesTaken}
- return e
- }
- func (e *employee) LeavesRemaining() {
- fmt.Printf("%s %s has %d leaves remaining", e.firstName, e.lastName, (e.totalLeaves - e.leavesTaken))
- }
main.go
- package main
- import "oop/employee"
- func main() {
- e := employee.New("Sam", "Adolf", 30, 20)
- e.LeavesRemaining()
- }
Go interface
- package main
- import "fmt"
- import "math"
- // Here's a basic interface for geometric shapes.
- type geometry interface {
- area() float64
- perim() float64
- }
- // For our example we'll implement this interface on
- // `rect` and `circle` types.
- type rect struct {
- width, height float64
- }
- type circle struct {
- radius float64
- }
- // To implement an interface in Go, we just need to
- // implement all the methods in the interface. Here we
- // implement `geometry` on `rect`s.
- func (r rect) area() float64 {
- return r.width * r.height
- }
- func (r rect) perim() float64 {
- return 2*r.width + 2*r.height
- }
- // The implementation for `circle`s.
- func (c circle) area() float64 {
- return math.Pi * c.radius * c.radius
- }
- func (c circle) perim() float64 {
- return 2 * math.Pi * c.radius
- }
- // If a variable has an interface type, then we can call
- // methods that are in the named interface. Here's a
- // generic `measure` function taking advantage of this
- // to work on any `geometry`.
- func measure(g geometry) {
- fmt.Println(g)
- fmt.Println(g.area())
- fmt.Println(g.perim())
- }
- func main() {
- r := rect{width: 3, height: 4}
- c := circle{radius: 5}
- // The `circle` and `rect` struct types both
- // implement the `geometry` interface so we can use
- // instances of
- // these structs as arguments to `measure`.
- measure(r)
- measure(c)
- }
方法:
- type MyType struct {
- n int
- }
- func (p *MyType) Value() int { return p.n }
- func main() {
- pm := new(MyType)
- fmt.Println(pm.Value()) // 0 (zero value)
- }
函数类型:
- type Operator func(x float64) float64
- // Map applies op to each element of a.
- func Map(op Operator, a []float64) []float64 {
- res := make([]float64, len(a))
- for i, x := range a {
- res[i] = op(x)
- }
- return res
- }
- func main() {
- op := math.Abs
- a := []float64{1, -2}
- b := Map(op, a)
- fmt.Println(b) // [1 2]
- c := Map(func(x float64) float64 { return 10 * x }, b)
- fmt.Println(c) // [10, 20]
- }
匿名函数与闭包:
- func Slice(slice interface{}, less func(i, j int) bool)
- people := []string{"Alice", "Bob", "Dave"}
- sort.Slice(people, func(i, j int) bool {
- return len(people[i]) < len(people[j])
- })
- fmt.Println(people)
- // Output: [Bob Dave Alice]
- // OR
- people := []string{"Alice", "Bob", "Dave"}
- less := func(i, j int) bool {
- return len(people[i]) < len(people[j])
- }
- sort.Slice(people, less)
- // Count prints the number of times it has been invoked.
- func New() (Count func()) {
- n := 0
- return func() {
- n++
- fmt.Println(n)
- }
- }
- func main() {
- f1, f2 := New(), New()
- f1() // 1
- f2() // 1 (different n)
- f1() // 2
- f2() // 2
- }
指针:
- type Student struct {
- Name string
- }
- var ps *Student = new(Student) // ps holds the address of the new struct
- ps := new(Student)
- s := Student{"Alice"} // s holds the actual struct
- ps := &s // ps holds the address of the struct
- // Bob is a function that has no effect.
- func Bob(s Student) {
- s.Name = "Bob" // changes only the local copy
- }
- // Charlie sets pp.Name to "Charlie".
- func Charlie(ps *Student) {
- ps.Name = "Charlie"
- }
- func main() {
- s := Student{"Alice"}
- Bob(s)
- fmt.Println(s) // prints {Alice}
- Charlie(&s)
- fmt.Println(s) // prints {Charlie}
- }
错误处理:
- type error interface {
- Error() string
- }
- f, err := os.Open("filename.ext")
- if err != nil {
- log.Fatal(err)
- }
- // coustome error
- err := errors.New("Houston, we have a problem")
并发
未完待续。。。。