1. 匿名结构体
- 全局组合
1 2 3 4 5 |
var config struct {//定义一个用于全局配置结构体 APIKey string OAuthConfig oauth.Config } config.APIKey = "BADC0C0A" |
- 数据模板
5
6
7
8
data := //匿名结构体的定义 Title Users []*User }{//同时初始化 title, users, } err := tmpl.Execute(w, data)
(比map[string]interface{}消耗更小和更安全)
- 测试表(用作测试数据构造)
8
9
10
indexRuneTests = []struct { s rune rune out int }{ {"a A x", 'A', 2}, {"some_text=some_value", '=',152)!important">9},152)!important">"☺a", 'a',152)!important">3},152)!important">"a☻☺b", '☺',152)!important">4}, }
- 嵌套加锁
7
hits sync.Mutex n int } hits.Lock() n++//十对“n”的操作是安全的 Unlock()
2. 嵌套结构体
- 反序列化深层嵌套的json
10
11
12
13
14
15
16
17
18
{"data": {"children": [ {"data": { "title": "The Go homepage", "url": "http://golang.org/" }}, ... ]}} type Item URL string } Response Data Children []Data Item } } }
3. godoc命令,输出package的文档注释
1
% godoc sync Mutex
18
19
20
21
22
23
24
PACKAGE package sync import "sync" TYPES Mutex struct { // contains filtered or unexported fields } A Mutex is a mutual exclusion lock. Mutexes can be created as part of other structures; the zero value for an unlocked mutex. func (m *Mutex) Lock() Lock locks m. If lock already in use,210)!important">calling goroutine blocks until mutex available. Unlock() Unlock unlocks It run-time error if m not locked on entry to Unlock. associated with particular goroutine. is allowed one goroutine to and then arrange another unlock it.
4. godoc -src 命令
1
% godoc -src sync Mutex
7
// A Mutex is a mutual exclusion lock. // Mutexes can be created as part of other structures; // the zero value for a Mutex is an unlocked mutex. state int32 sema uint32 }
未导出的元素也将显示!
5. 获取指定域名下的包
1
go get camlistore.org/pkg/netutil
go help remote
可查看更详细的信息.
6. 模拟一个文件系统
获取到的包里,代码访问了文件系统,但是测试时不希望真正访问磁盘
20
fs fileSystem = osFS{} fileSystem interface { Open(name string) (file,210)!important">error) Stat(os.FileInfo,210)!important">error) } file io.Closer Reader ReaderAt Seeker Stat() (error) } // osFS 实现接口filesystem,并访问本地磁盘. osFS struct{} osFS) error) { return name) } name) }
7. 方法表达式
os/exec中的实际例子:
13
c *Cmd) stdin() (f *File,210)!important">err error) stdout() (stderr() (F func(*Cmd) (*_,210)!important">setupFd := range []F{(*Cmd).stdin, (*stdout,210)!important">stderr} { fd,210)!important">setupFd(c) err != nil { c.closeDescriptors(closeAfterStart) closeAfterWait) err } childFiles = append(childFiles,210)!important">fd) }
8. 使用统一个Channel发送和接收消息
22
main "fmt" battle = make(chan string) func warrior(string,210)!important">done chan struct{}) { select { case opponent := <-battle: fmt.Printf("%s beat %s\n",210)!important">name,210)!important">opponent) battle <- name: // I lost :-( } done <- struct{}{} } main() { done := struct{}) langs := []string{"Go", "C",152)!important">"C++",152)!important">"Java",152)!important">"Perl",152)!important">"Python"} l := range langs { go l,210)!important">done) } _ = langs { <-done } }
9. 使用channel的close发送广播
19
waiter(i int,210)!important">block,22)!important">struct{}) { time.Sleep(Duration(rand.Intn(3000)) * Millisecond) Println(i,152)!important">"waiting...") <-block "done!") struct{}),22)!important">struct{}) i := 0; i < 4; i++ { done) } Sleep(5 * Second) close(block) i++ { <-done } }
另外一个例子
24
worker(ch chan Work,210)!important">quit quitting bool for { w := <-ch: quitting { w.Refuse(); Println("worker",152)!important">"refused",210)!important">w) break } Do(); "processed",22)!important">case <-quit: "quitting") quitting = true } } } ch,210)!important">quit := Work),210)!important">makeWork(ch) i++ { quit) } quit) 2 * Second) }
10. select中使用空channel
quit == quit = nil } } } Second) }