Goの構造体変数は、代入ステートメントを使用して非常に簡単に別の変数にコピーできます。
package main
import (
“fmt”
)
type Dog struct {
age int
name string
}
func main() {
roger := Dog{5, “Roger”}
mydog := roger
if roger == mydog {
fmt.Println(“Roger and mydog are equal structs”)
}
}
mydog
そしてroger
は2つの別個の変数ですが、プロパティごとに比較すると、まったく同じです。
他のオブジェクトに影響を与えることなく、これらの変数のすべてのプロパティを変更できるようになりました。Dog
構造体には、値によってコピーされる基本型が含まれています。
構造体に参照型がある場合、これはそれほど簡単ではありませんでした。pointer
値ではなくコピーされるので、浅いコピー。
例えば
type Cat struct {
age int
name string
friends []string
}
私たちの猫の友達のリストはスライス、参照型(ポインター、マップ、関数、チャネルとともに)であるため、猫のオブジェクトがあり、上記の犬の例のようにコピーした場合、コピーすることはできません。他のオブジェクトにも影響を与えずにfriendsプロパティを変更します。
Aディープコピーが必要です。
構造体をディープコピーする
このようなディープコピーは手動で実行できます。スライスの場合、次のようにコピーを実行できます。
package main
import (
“fmt”
)
type Cat struct {
age int
name string
friends []string
}
func main() {
wilson := Cat{7, “Wilson”, []string{“Tom”, “Tabata”, “Willie”}}
nikita := wilson
<span style="color:#a6e22e">nikita</span>.<span style="color:#a6e22e">friends</span> = make([]<span style="color:#66d9ef">string</span>, len(<span style="color:#a6e22e">wilson</span>.<span style="color:#a6e22e">friends</span>))
copy(<span style="color:#a6e22e">nikita</span>.<span style="color:#a6e22e">friends</span>, <span style="color:#a6e22e">wilson</span>.<span style="color:#a6e22e">friends</span>)
<span style="color:#a6e22e">nikita</span>.<span style="color:#a6e22e">friends</span> = append(<span style="color:#a6e22e">nikita</span>.<span style="color:#a6e22e">friends</span>, <span style="color:#e6db74">"Syd"</span>)
<span style="color:#a6e22e">fmt</span>.<span style="color:#a6e22e">Println</span>(<span style="color:#a6e22e">wilson</span>)
<span style="color:#a6e22e">fmt</span>.<span style="color:#a6e22e">Println</span>(<span style="color:#a6e22e">nikita</span>)
}
上記のコードは次のようになりますウィルソンであること{7 Wilson [Tom Tabata Willie]}
そしてニキータであること{7 Wilson [Tom Tabata Willie Syd]}
したがって、スライスは、同じスライスへの参照だけでなく、完全に異なるオブジェクトであることがわかります。
ディープコピーライブラリの使用
https://github.com/jinzhu/copierそこにある(多くの)ディープコピーライブラリ/ヘルパーの1つです。これにより、各フィールドを明示的に管理しなくても、構造体をディープコピーすることが非常に簡単になります。これが例です。必要なのはcopier.Copy(&nikita, &wilson)
そして、私たちは設定されています:
package main
import (
“fmt”
“github.com/jinzhu/copier”
)
type Cat struct {
age int
name string
friends []string
}
func main() {
wilson := Cat{7, “Wilson”, []string{“Tom”, “Tabata”, “Willie”}}
nikita := Cat{}
copier.Copy(&nikita, &wilson)
<span style="color:#a6e22e">nikita</span>.<span style="color:#a6e22e">friends</span> = append(<span style="color:#a6e22e">nikita</span>.<span style="color:#a6e22e">friends</span>, <span style="color:#e6db74">"Syd"</span>)
<span style="color:#a6e22e">fmt</span>.<span style="color:#a6e22e">Println</span>(<span style="color:#a6e22e">wilson</span>)
<span style="color:#a6e22e">fmt</span>.<span style="color:#a6e22e">Println</span>(<span style="color:#a6e22e">nikita</span>)
}
その他のチュートリアル:
- NGINXリバースプロキシを使用してGoサービスを提供する
- Goで構造体のコピーを作成する
- GoWebサーバーの基本
- Goでのマップタイプの並べ替え
- 一言で言えばポインタを移動します
- タグの説明に行く
- 日付と時刻のフォーマットに移動
- Goを使用したJSON処理
- 可変個引数関数に移動
- GoStringsチートシート
- GoEmptyインターフェイスの説明
- Go withVSCodeとDelveのデバッグ
- NamedGoはパラメータを返します
- Goで乱数と文字列を生成する
- Goプロジェクトのファイルシステム構造
- Goに実装された二分探索アルゴリズム
- Goでのコマンドラインフラグの使用
- GOPATHの説明
- Goでコマンドラインアプリを作成する:lolcat
- Goを使用したCLIコマンドの作成:cowsay
- Goでのシェルパイプの使用
- CLIチュートリアルに移動:フォーチュンクローン
- Goを使用してフォルダ内のファイルを一覧表示します
- Goを使用して、GitHubからリポジトリのリストを取得します
- 移動し、文字列のスライスをファイルに追加します
- 文字列をバイトスライスに変換します
- GoでローカルGitの貢献を視覚化する
- GoCPUとメモリプロファイリングの開始
- Goプログラムの「インデックス作成をサポートしていません」エラーを解決する
- Goプログラムでの実行時間の測定
- 重複するタイトルを検出するためにGoを使用してWebクローラーを構築する
- ベストプラクティスに進む:ポインターまたは値のレシーバー?
- ベストプラクティスに進む:メソッドまたは関数を使用する必要がありますか?
- データ構造の移動:設定
- マップのチートシートに移動
- Goでジェネリック型の実装を生成する
- Goデータ構造:辞書
- Goデータ構造:ハッシュテーブル
- Go throughChannelsにイベントリスナーを実装する
- Goデータ構造:スタック
- データ構造の移動:キュー
- Goデータ構造:二分探索木
- Goデータ構造:グラフ
- Goデータ構造:リンクリスト
- Goデータ構造の完全ガイド
- Go値の比較
- Goはオブジェクト指向ですか?
- GoでのSQLデータベースの操作
- Goでの環境変数の使用
- チュートリアルに進む:PostgreSQLに裏打ちされたREST API
- GoWebサーバーでのCORSの有効化
- DockerコンテナへのGoアプリケーションのデプロイ
- GoがPHP開発者として学ぶための強力な言語である理由
- 移動し、io.Reader.ReadString改行文字を削除します
- 移動、変更を監視してプログラムを再構築する方法
- 行って、日付からの月を数えます
- GoでHTTPPOSTパラメーターにアクセスする