【オリジナル】go言語学習(十三)struct紹介2

5139 ワード

目次:
  • メソッドの定義
  • 関数と方法の違い
  • 値タイプおよびポインタタイプ
  • オブジェクト向けおよび継承
  • 構造体とjsonシーケンス化
  • メソッドの定義
    1、他の言語と同様に、Goの方法は別の方法で実現される.
    package main
    
    import "fmt"
    
    type Integer int
    
    func (i Integer) Print() {
    	fmt.Println(i)
    }
    
    func main() {
    	var a Integer
    	a = 1000
    	a.Print()
    
    	var b int = 200
    	a = Integer(b)
    	a.Print()
    }
    
    //   
    // 1000
    // 200
    

      
    2、Goの方法は関数の前に受信者を加えることで、コンパイラはこの方法がどのタイプに属するかを知っています.
    type A struct {
    }
    func (a A) Test(s string) {
    }
    

    Testの受け手なので、AというオブジェクトにはTestメソッドがあります.
    aによってAのインスタンス例のメンバー変数量、すなわちstructのフィールドにアクセスする
    3、現在のパッケージに定義できる任意の種類の追加方法
    type int Integer //Integer int   
    func (a Integer) Test(s string) {
    }
    

    aによってIntegerのインスタンス例のメンバー変数量、すなわちintにアクセスする
    Testの受け入れ者なのでIntegerというオブジェクトにはTestメソッドがあります
    関数とメソッドの違い
    1、関数不は任意のタイプに属し、方法は特定のタイプに属する
    type People struct {
    	Name    string
    	Country string
    }
    
    //   
    fun PrintTest(){
        fmt.Printf("name=%s country=%s",People.Name,People.Country)
    }
    
    //   
    func (p People) Print() {
    	fmt.Printf("name=%s country=%s
    ", p.Name, p.Country) }

      
     
    値タイプとポインタタイプ
    1.ポインタタイプを受信者とする
    type A struct {
    }
    func (a *A) Test(s string) {
    }
    

    Testの受け手なので、AというオブジェクトにはTestのメソッドが1つあります.
    aによってAのインスタンス例のメンバー変数量、すなわちstructのフィールドにアクセスする
    2、ポインタタイプと値タイプを受信者として区別する
    //    ,copy  ,    
    func (p People) Set(name string, country string) {
    p.Name = name
    p.Country = country

    }

    // , func (p *People) SetV2(name string, country string) { p.Name = name p.Country = country }

    3、什いつ値タイプ/ポインタタイプを受信者に適用しますか?
    A.受信者の値を変更する必要がある場合B.受信者が大きいオブジェクトである場合、レプリカコピーのコストが比較的大きいC.一般的には、ポインタタイプを受信者として用いる
    オブジェクトと継承
    1、匿名構造体と継承
    type Animal struct {
        Name string
    }
    
    type People struct {
        Sex string
        Age int
        Animal //or *Animal
    }
    

      
    2、多重継承と衝突解決
    type Mother struct {
        Name string
    }
    
    type Father struct {
        Name string
    }
    
    type People struct {
        Sex string
        Age int
        *Mother
        *Father
    }
    

      
    構造体とjsonシーケンス化
    1、構造体のシーケンス化:構造体がjsonデータフォーマットに変わる
    type People struct {
        Sex string
        Age int
        *Mother
        *Father
    }
    

      
    2、構造体の逆シーケンス化:jsonデータフォーマットから構造体へ
    package main
    
    import (
    	"encoding/json"
    	"fmt"
    )
    
    type Student struct {
    	Id   string
    	Name string
    	Sex  string
    }
    
    type Class struct {
    	Name     string
    	Count    int
    	Students []*Student
    }
    
    // json       
    var rawJson = `{"Name":"101","Count":0,"Students":[{"Id":"0","Name":"stu0","Sex":"man"},{"Id":"1","Name":"stu1","Sex":"man"},{"Id":"2","Name":"stu2","Sex":"man"},{"Id":"3","Name":"stu3","Sex":"man"},{"Id":"4","Name":"stu4","Sex":"man"},{"Id":"5","Name":"stu5","Sex":"man"},{"Id":"6","Name":"stu6","Sex":"man"},{"Id":"7","Name":"stu7","Sex":"man"},{"Id":"8","Name":"stu8","Sex":"man"},{"Id":"9","Name":"stu9","Sex":"man"}]}`
    
    func main() {
    	c := &Class{
    		Name:  "101",
    		Count: 0,
    	}
    
    	for i := 0; i < 10; i++ {
    		stu := &Student{
    			Name: fmt.Sprintf("stu%d", i),
    			Sex:  "man",
    			Id:   fmt.Sprintf("%d", i),
    		}
    		c.Students = append(c.Students, stu)
    	}
    
    	// json    
    	data, err := json.Marshal(c)
    	if err != nil {
    		fmt.Println("json marshal failed")
    		return
    	}
    
    	fmt.Printf("json:%s
    ", string(data)) // json fmt.Println("unmarsha1 result is

    ") var c1 *Class = &Class{} err = json.Unmarshal([]byte(rawJson), c1) if err != nil { fmt.Println("unmarhsal failed") fmt.Println(err) return } fmt.Printf("c1:%#v
    ", c1) for _, v := range c1.Students { fmt.Printf("stu:%#v
    ", v) } }