Go面接問題から発見されたgoLangの基礎問題
10316 ワード
チュートリアルにないLangogベースの深層問題1.あなたが知らない定数と変数のもう一つの違い 2.関数の戻りタイプ定義変数と非定義変数が同じかどうか . 3.ポインタ変数の初期値 4.for index,val:=range xxx{}文注意すべき問題 1.定数と変数の違いを知らない
定数は一度しか与えられないことを知っています.しかし、定数がメモリに割り当てられないことを知らない人も多い.つまり,goLangプログラミングでは定数のアドレスが取れない.しかし、私たちは変数のアドレスを得ることができます.
2.関数の戻りタイプ定義変数と非定義変数は同じかどうか
関数の戻りタイプを定義するには、次の2つの方法があります.
この2つの方法には影響はないようですが、関数内で
3.ポインタ変数の初期値
ポインタ変数を定義する場合、値が割り当てられていない場合、その初期値は確かに
4.for index,val:=range xxx{}文注意すべき問題
for rangeを用いて集合を遍歴すると,valの到達は集合内の要素アドレスであると自然に考えられる.そう思っている同級生は、間違っている.実はindexとvalの2つの変数は、メモリ内の位置が変わらない.ループするたびに、セットの値copyがこの2つの変数に挿入されます.次の要素を削除すると、現在保存されている値が上書きされます.次のコード
定数は一度しか与えられないことを知っています.しかし、定数がメモリに割り当てられないことを知らない人も多い.つまり,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)
}