Golang Tips

2744 ワード

1)ローカル変数を返すアドレスは全く問題なく,Cとは異なる点に注意する.このローカル変数に対応するデータは、関数が返された後も有効です.
func NewFile(fd int, name string) *File {
	if fd < 0 {
		return nil
	}
	f := File{fd, name, nil, 0}
	return &f
}

2)
make(T, args)   new(T)。 、 ,  T(  *T)  ( ) 。
make([]int, 10, 100)
100  int  , 10, 100 10 。



3)Map
, 。 , , 。

4)
%T

5)
type ByteSize float64

const (
    //                 
    _           = iota // ignore first value by assigning to blank identifier
    KB ByteSize = 1 << (10 * iota)
    MB
    GB
    TB
    PB
    EB
    ZB
    YB
)

6)channel

, 。 , 。 Go 。

c := make(chan int)  //       
//  Go      。     ,        。
go func() {
	list.Sort()
	c  
   

。 , , ; , ; , 。

 

, 。 ,  handle, , , “ ” 。  process  , 。

var sem = make(chan int, MaxOutstanding)

func handle(r *Request) {
	sem  
   

 

, :  MaxOutstanding  Go ,  Serve  Go 。 , , 。 ,  Serve  Go , , Bug。

func Serve(queue chan *Request) {
	for req := range queue {
		sem 

Bug Go  forサイクルでは、このサイクル は のたびに されるので、req はすべてのGoパス で されます.これは たちが んでいるものではありません.reqがGoパスごとに であることを する があります.reqの を パラメータとしてGoパスの パケットに す がある.

func Serve(queue chan *Request) {
	for req := range queue {
		sem 

もう1つのリソース の い は、 のhandle Goパスを し、 チャネルからデータを み すことである.Goパスの は、 に び されるprocessの を する.Serveは、 に、 を するチャネルを し、すべてのGoパスが されると、チャネルからのメッセージの をブロックし、 する.
func handle(queue chan *Request) {
	for r := range queue {
		process(r)
	}
}

func Serve(clientRequests chan *Request, quit chan bool) {
	//       
	for i := 0; i < MaxOutstanding; i++ {
		go handle(clientRequests)
	}
	 
  

:https://www.cnblogs.com/gm-201705/p/8301690.html