这篇指南为了能够帮助Java程序员快速深入了解Go语言特性!
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")
并发
回归Sina SAE