Go面接問題から発見されたgoLangの基礎問題

10316 ワード

チュートリアルにないLangogベースの深層問題
  • 1.あなたが知らない定数と変数のもう一つの違い
  • 2.関数の戻りタイプ定義変数と非定義変数が同じかどうか
  • .
  • 3.ポインタ変数の初期値
  • 4.for index,val:=range xxx{}文注意すべき問題
  • 1.定数と変数の違いを知らない
    定数は一度しか与えられないことを知っています.しかし、定数がメモリに割り当てられないことを知らない人も多い.つまり,goLangプログラミングでは定数のアドレスが取れない.しかし、私たちは変数のアドレスを得ることができます.
    2.関数の戻りタイプ定義変数と非定義変数は同じかどうか
    関数の戻りタイプを定義するには、次の2つの方法があります.
    //   :        
    func method() int,error{}
    
    //   :           
    func method() a int,e error{}
    

    この2つの方法には影響はないようですが、関数内でdeferキーワードを使用すると、戻り値が影響を受けることがわかります.たとえば、次の2つのコードがあります.
    func deferM1(i int) int{
    	t:=i
    	defer func(){
    		t+=3
    	}()
    	return t
    }//    t
    
    func deferM2(i int) (t int){
    	t=i
    	defer func(){
    		t+=3
    	}()
    	return t
    }//    3+i
    

    3.ポインタ変数の初期値
    ポインタ変数を定義する場合、値が割り当てられていない場合、その初期値は確かにnilであり、この点は問題ありません.しかし、このポインタ変数の値をインタフェースタイプに返すと、このとき何になりますか.不思議なことに、それは包装されたnilで、このようなで、具体的なコードは以下の通りです.
    type People interface {
    	Show()
    }
    
    type Student struct {
    	name string
    	age int
    	addr string
    }
    
    func (str Student)Show(){}
    
    func live() People {
    	var str *Student
    	return str
    }//        
    
    func live() *Student {//           
    	var str *Student
    	return str
    }//        ,     nil
    

    4.for index,val:=range xxx{}文注意すべき問題
    for rangeを用いて集合を遍歴すると,valの到達は集合内の要素アドレスであると自然に考えられる.そう思っている同級生は、間違っている.実はindexとvalの2つの変数は、メモリ内の位置が変わらない.ループするたびに、セットの値copyがこの2つの変数に挿入されます.次の要素を削除すると、現在保存されている値が上書きされます.次のコード
    type Student struct {
    	name string
    	age int
    	addr string
    }
    
    func show()  {
    	strm := make(map[string]*Student)
    	strs:=[]Student{
    		{"zhangsan",14,"    "},
    		{"lisi",16,"    "},
    		{"xiaoming",18,"    "}}
    	for _,str:=range strs{//strm          ,   str     
    		strm[str.name]=&str
    	}
    	fmt.Println(strm,strs)
    	for key,val:=range strm{
    		fmt.Println(key,val.name)
    	}
    	fmt.Println("=============================================")
    	for i:=0;i<len(strs);i++{//                   
    		strm[strs[i].name]=&strs[i]
    	}
    	fmt.Println(strm,strs)
    
    }