Go言語入門#6

12196 ワード

ししん


C言語に似た言語なのでpointerコンセプトを使用しています.

ししん


:メモリアドレスが値のタイプ
var a int   //변수 a는 메모리 공간의 100번지(변수의 시작주소)를 '가리키고' 있다.
var p *int  //포인터 변수 선언 
p = &a  //a의 메모리 주소를 포인터 변수 p에 대입
  • 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
    }
  • %p:ポインタのアドレス値.16進数で表示される
  • ポインタ変数のデフォルト値:nil

    var p *int  // p = nil
    if p != nil {
    	// p가 nil이 아닌, 정상적인 메모리 주소를 가리키고 있을 때 실행
    }
  • ポインタ変数が宣言された場合、初期化されていない場合はデフォルト値に設定されます.
  • デフォルトはnil
  • です
  • 0と同じ意味ですが、->pタイプ:*int、0タイプ:intを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
    }
    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
    }
  • 72*:関数のパラメータとしてデータ構造体タイプのアドレス値を受け入れます.
  • &追加:関数を呼び出すときに、データ構造体のアドレス値をパラメータで送信します.
    このような状況が発生すると、
    ChangeData関数の作業は次のとおりです.
    データ構造タイプのアドレス値をパラメータとして受け入れます.
    これは、アドレスのメモリ領域の値を999に設定します.
    main関数とChangeData関数で同じメモリ領域
  • を使用
    ここで指摘する事項.
    では、ChangeData関数の内部文は何も変更する必要はありませんか?
    argは、データ構造関数タイプの変数であり、データ構造タイプ変数のアドレス値を持つポインタ変数となりますが、arg.valuearg.data[100]は使用できますか?
    =>Go言語では許可されています!
    慣例に従って使用する場合は、(*arg).value(*arg,data[100])に変更する必要があります.
    argというポインタ変数のアドレス値は、指向するメモリ領域の値にアクセスします.
    ポインタ変数名の後ろに点をつけるだけで、自分で説明できます.

    構造ポインタの初期化


    シェイプに精通した構造体ポインタの初期化
    var data Data
    var p *Data = &data
    ->このようにして1行に減らすことができます.
    var p *Data = &Data{}
  • データ{}:構造体+括弧は構造体作成者を表す.値は初期化されていないためdefault値があります.
  • 構造体を作成し、構造体変数
  • を宣言する.
  • で作成した構造体変数のアドレス値をポインタ変数に代入
  • 構造体を作成した後、ポインタ変数にアドレス値を代入します.
    減少した段階.
    構造体が形成する記憶空間の名前は名前をつけなければなりませんか?
  • Instance


    :メモリに割り当てられたデータエンティティ
    1.「ポインタ変数pが指すデータインスタンスが作成されました」
    var p *Data = &Data{}
  • 「1つのデータインスタンスがポインタ変数によって指し示す」
  • var p1 *Data = &Data{}
    var p2 *Data = p1
    var p3 *Data = p1
  • 「データ1、データ2、データ3の3つのインスタンス」
  • 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値に初期化!