【オリジナル】go言語学習(十三)struct紹介2
5139 ワード
目次:メソッドの定義 関数と方法の違い 値タイプおよびポインタタイプ オブジェクト向けおよび継承 構造体とjsonシーケンス化 メソッドの定義
1、他の言語と同様に、Goの方法は別の方法で実現される.
2、Goの方法は関数の前に受信者を加えることで、コンパイラはこの方法がどのタイプに属するかを知っています.
Testの受け手なので、AというオブジェクトにはTestメソッドがあります.
aによってAのインスタンス例のメンバー変数量、すなわちstructのフィールドにアクセスする
3、現在のパッケージに定義できる任意の種類の追加方法
aによってIntegerのインスタンス例のメンバー変数量、すなわちintにアクセスする
Testの受け入れ者なのでIntegerというオブジェクトにはTestメソッドがあります
関数とメソッドの違い
1、関数不は任意のタイプに属し、方法は特定のタイプに属する
値タイプとポインタタイプ
1.ポインタタイプを受信者とする
Testの受け手なので、AというオブジェクトにはTestのメソッドが1つあります.
aによってAのインスタンス例のメンバー変数量、すなわちstructのフィールドにアクセスする
2、ポインタタイプと値タイプを受信者として区別する
3、什いつ値タイプ/ポインタタイプを受信者に適用しますか?
A.受信者の値を変更する必要がある場合B.受信者が大きいオブジェクトである場合、レプリカコピーのコストが比較的大きいC.一般的には、ポインタタイプを受信者として用いる
オブジェクトと継承
1、匿名構造体と継承
2、多重継承と衝突解決
構造体とjsonシーケンス化
1、構造体のシーケンス化:構造体がjsonデータフォーマットに変わる
2、構造体の逆シーケンス化: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)
}
}