Go言語入門#6
12196 ワード
ししん
C言語に似た言語なのでpointerコンセプトを使用しています.
ししん
:メモリアドレスが値のタイプ
var a int //변수 a는 메모리 공간의 100번지(변수의 시작주소)를 '가리키고' 있다.
var p *int //포인터 변수 선언
p = &a //a의 메모리 주소를 포인터 변수 p에 대입
*p = 20
ex)pの値が100の場合、メモリ空間100番上の変数空間の値として20
ex)
func main() {
var a int = 500
var p *int
p = &a
fmt.Printf("p의 값: %p\n", p) //p의 값: 0xc0000be000
fmt.Printf("p가 가리키는 메모리의 값: %d\n", *p) //p가 가리키는 메모리의 값: 500
*p = 100 //a = 100과 같은 것
fmt.Printf("a의 값: %d\n", a) //a의 값: 100
}
ポインタ変数のデフォルト値:nil
var p *int // p = nil
if p != nil {
// p가 nil이 아닌, 정상적인 메모리 주소를 가리키고 있을 때 실행
}
ポインタを使用する理由
type Data struct {
value int
data [200]int
}
func ChangeData(arg Data) {
arg.value = 999
arg.data[100] = 999
}
func main() {
var data Data
ChangeData(data)
fmt.Printf("value = %d\n", data.value) //value = 0
fmt.Printf("data[100] = %d\n", data.data[100]) //data[100] = 0
}
999が入力されていますが、0(デフォルト値が表示される理由)です!go言語での代入演算子機能:r-valueメモリサイズのl-value空間にコピー
したがって、レプリケーションは、2つのメモリサイズが同じであることを意味しますが、実際には異なるスペースです.
したがって、上記の例では
ChangeData(data)
で関数が呼び出されると、伝達されたデータは、実際の主関数内で宣言されたデータ構造体ではなく、伝達されたコピーである.ChangeData関数の実行中にレプリカ構造体の値を999に変更したため、関数からmain関数を返し、元の構造体の値を出力した場合、0は変更されません.
この問題を解決するためには,ポインタを導入するだけでよい.
値をコピーするのではなく、アドレス値をコピーします.
type Data struct {
value int
data [200]int
}
func ChangeData(arg *Data) { // *추가!
arg.value = 999
arg.data[100] = 999
}
func main() {
var data Data
ChangeData(&data) // &추가!
fmt.Printf("value = %d\n", data.value) //value = 0
fmt.Printf("data[100] = %d\n", data.data[100]) //data[100] = 0
}
このような状況が発生すると、
ChangeData関数の作業は次のとおりです.
データ構造タイプのアドレス値をパラメータとして受け入れます.
これは、アドレスのメモリ領域の値を999に設定します.
main関数とChangeData関数で同じメモリ領域
ここで指摘する事項.
では、ChangeData関数の内部文は何も変更する必要はありませんか?
argは、データ構造関数タイプの変数であり、データ構造タイプ変数のアドレス値を持つポインタ変数となりますが、
arg.value
、arg.data[100]
は使用できますか?=>Go言語では許可されています!
慣例に従って使用する場合は、
(*arg).value
、(*arg,data[100])
に変更する必要があります.argというポインタ変数のアドレス値は、指向するメモリ領域の値にアクセスします.
ポインタ変数名の後ろに点をつけるだけで、自分で説明できます.
構造ポインタの初期化
シェイプに精通した構造体ポインタの初期化
var data Data
var p *Data = &data
->このようにして1行に減らすことができます.var p *Data = &Data{}
減少した段階.
構造体が形成する記憶空間の名前は名前をつけなければなりませんか?
Instance
:メモリに割り当てられたデータエンティティ
1.「ポインタ変数pが指すデータインスタンスが作成されました」
var p *Data = &Data{}
var p1 *Data = &Data{}
var p2 *Data = p1
var p3 *Data = p1
var data1 Data
var data2 Data = data1
var data3 Data = data1
new()内蔵関数
:構造体の生成に使用可能
p1 := &Data{}
var p2 = new(Data)
1と2には同じ機能があります.1カッコ内に初期値を入れることができます.
ex :
&Student{"Lydia", 23}
2初期値は加算できません.無条件にdefault値に初期化!Reference
この問題について(Go言語入門#6), 我々は、より多くの情報をここで見つけました https://velog.io/@sheecho0804/Go언어-입문-6テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol