blog

練習問題を解く(1)

次のコードは何を出力しますか?\nfunc test1 、 func { 。\nreturn func\nx += 10\n}, func()...

Nov 11, 2020 · 2 min. read
シェア

次のコードの出力は?

func test1(x int) (func(), func()) {
	return func() {
		fmt.Println(x)
		x += 10
	}, func() {
		fmt.Println(x)
	}
}
func test2(x []int) (func(), func()) {
	return func() {
		fmt.Println(x)
		x[0] = 0
		
	}, func() {
		fmt.Println(x)
	}
}
func test3(x [3]int) (func(), func()) {
	return func() {
		fmt.Println(x)
		x[0] = 0
		
	}, func() {
		fmt.Println(x)
	}
}
func main() {
 cc := 10
 dd :=[]int{1,2,3}
 a,b := test1(cc)
 a()
 b()
 fmt.Println(c)
 c,d := test2(dd)
 c()
 d()
 fmt.Println(dd)
 ee := [3]{4,5,6}
 e,f := test3(ee)
 e()
 f()
 fmt.Println(ee)
}

結果

a()==> 10
b()==> 20
cc ==>10
c() ==> [1 2 3]
d() ==> [0 2 3]
dd ==>[0 2 3]
e()==>[4 5 6]
f()==>[0 5 6]
ee ==>[4 5 6]

まとめ

配列と整数は値型であり、関数に参照を渡すとそのコピーがコピーされ、そのコピーは新しくオープンされたメモリアドレスとなり、関数内部で変更しても元の値に影響を与えません。一方、スライス・スライス型は参照型であり、渡される参照はポインタなので、関数内部で変更すると元の値が変わってしまいます。

補足:延期を伴う複合試験

func test(x [3]int) (func(), func()) {
	defer func() {x[2]=1}()
	return func() {
		fmt.Printf("%T,%v
",x,x)
		x[0] = 0
	}, func() {
		fmt.Printf("%T,%v
",x,x)
	}
}
func main() {
 var c =[3]int{1,2,3}
 a, b := test(c)
	a()
	b()
	fmt.Printf("%T,%v
",c,c)
}

輸出

[3]int,[1 2 1]
[3]int,[0 2 1]
[3]int,[1 2 3]
Read next

Redisの分散ロック

効率性:分散ロックの使用により、異なるノードが同じ作業を繰り返すことでリソースを浪費することを防ぎます。例えば、ユーザーが支払いを済ませた後、異なるノードが複数のSMSメッセージを送信する可能性があります。 正しさ:分散ロックはまた、2つのノードが同じデータ上で動作する場合、そのような異なるプロセスを動作させるために同じ注文のマシンの複数のノードとして、正しさへのダメージの発生を回避することができます注文エラーの最終的な状態につながる可能性があります...

Nov 11, 2020 · 6 min read