golang的Map程序:
package main import "fmt" type e interface{} func mult2(t e) e { switch t.(type) { case int: return t.(int) * 2 case string: return t.(string) + t.(string) } return t } func add3(t e) e { switch t.(type) { case int: return t.(int) + t.(int) + t.(int) case string: return t.(string) + t.(string) + t.(string) } return t } func localmap(s []e,f func(e) e) { s2 := make([]e,len(s)) for k,v := range s { s2[k] = f(v) } fmt.Println(s2) } func main() { slice1 := []e{1,2,3,4,"a","hello"} slice2 := []e{"a","b","c"} localmap(slice1,mult2) localmap(slice2,mult2) localmap(slice1,add3) localmap(slice2,add3) }
运行结果:
[2 4 6 8 aa hellohello] [aa bb cc] [3 6 9 12 aaa hellohellohello] [aaa bbb ccc]
要分清数组指针类型 *[n]T和指针数组类型 [n]*T。用new创建数组,返回的是数组指针:
package main import "fmt" func test(a *[10]int) { a[2] = 100 } func main() { var a = new([10]int) test(a) fmt.Println(a,len(a)) }
golang的OOP示例:
package main import "fmt" type User struct { Id int Name string } type Manager struct { User Group string } type Tester interface { Test() } func (this *User) Test() { fmt.Println(this) } func (this *Manager) Test() { fmt.Println(this) } func dosometing(o Tester) { o.Test() } func main() { m := Manager{User: User{2,"jack"},Group: "IT"} dosometing(&m) dosometing(&m.User) }
拥有超集的接口可以被转换为子集的接口:
package main import "fmt" type User struct { Id int Name string } type Manager struct { Group string User } type IUser interface { Test() } type IManager interface { Test() Test2() } func (this *User) Test() { fmt.Println(this) } func (this *Manager) Test2() { fmt.Println(this) } func main() { var im IManager = &Manager{"IT",User{1,"tom"}} im.Test() im.Test2() var iu IUser = im iu.Test() }
对于channel,首先要明确“发送(send)”与“接收(receive)”的概念:“发送是指”值传递给channel;“接收”是指从channel读取值。可以定义仅能发送或仅能接收的单向channel。比如c1 chan<-int,仅能发送int类型的值给c1;c2 <-chan int,c2仅能接收int类型的值。示例如下:
package main import ( "fmt" ) func recv(i <-chan int,o chan<- bool) { for v := range i { fmt.Println(v) } o <- true } func send(i chan<- int) { for j := 0; j < 10; j++ { i <- j } close(i) } func main() { i := make(chan int) o := make(chan bool) go recv(i,o) go send(i) <-o }
使用channel实现信号量:
package main import ( "fmt" "sync" "time" ) var sem = make(chan int,2) var wg = sync.WaitGroup{} func worker(i int) { sem <- 1 fmt.Println(time.Now().Format("04:05"),i) time.Sleep(1 * time.Second) <-sem wg.Done() } func main() { for i := 0; i < 10; i++ { wg.Add(1) go worker(i) } wg.Wait() }