私は "The Go Programming Language"という本を読んでいます。経験豊富なプログラマーにとっては非常に良い経験であり、他の言語の共通部分の違いについて説明していますが、私が完全に理解していないケースが見つかりました。構造体リテラルに移動しますが、なぜこのアドレス可能ですか?
私はC++が十分に優れていることを知っていますが、Go呼び出し(C++では何が呼び出されるか)はrvalues/xvalues "non-addressable"と理解しています。 "変数" [GOPLの言葉]のみがアドレス可能です。
OK、十分です。それは理にかなっている。
従って、例えば、これは、(最初の印刷のページ159による)違法である
Point{1, 2}.ScaleBy(2) // compile error: can't take address of Point literal
(*Point).ScaleBy
は、受信引数として*Point
をとり、そしてPoint
リテラルは、非アドレス指定可能であるためです。
(あなたが本を読んでいない場合は、Point
はフィールドX, Y float64
を持つ構造体である。
しかし、162ページ、我々は明らかに有効であり、意志である
type ColoredPoint struct {
*Point
Color color.RGBA
}
p := ColoredPoint(&Point{1, 1}, red)
// ...more code ...
を持っていますコンパイル
質問:。
2番目のケースのPoint
リテラルがアドレス可能なのはなぜですか?
便宜のために特別なケースですか、大きな画像に何かを見逃していますか?
私はそれを本当に楽しんでいます!私は仕事を非常にすぐにフルタイムで書くことになる可能性が高いので、私は(多かれ少なかれ急いで)それを読んでいます。この部分を欠落している必要があります。私はこれがK&Dとそこにあると思う....私はK &R. ;を意味する - )もう一度ありがとう! – Tobias