go学習ドキュメント-構造(struct)--メソッド(method)
2874 ワード
一、構造1、構造体はJavaのメソッドのないクラスに似ています. 2、構造体は 3、構造体を構成する要素をフィールド(fields)と呼び、各フィールドにはタイプと名前があり、 4、構造体のフィールドは、任意のタイプであってもよい.構造体自体であってもよいし、関数またはインタフェースであってもよい. 5、ネストされた構造体(継承と同様)の場合、フィールドはリロード可能な である.
1、インスタンス化
--newを使います(ポインタタイプが得られます)
new関数を使用して、新しい構造体変数にメモリを割り当て、割り当てられたメモリへのポインタを返します:
--オブジェクトの字面量の仕方(値のタイプが得られます)
式new(Type)と&Type{}は等価であり,得られるのはポインタである.
2、ポインタタイプのインスタンス割り当て
3、匿名(またはインライン)フィールド
匿名フィールド:フィールドには名前がなくてもよいが、タイプは必須であり、タイプがフィールドの名前である.匿名フィールド自体は、構造体であってもよい.
二、方法1,Goには 2、受信者は を推奨する.2、メソッドはタイプと同じファイルにないことができますが、同じパッケージにある必要があります. 3、タイプ+メソッドは、 4、同じ受信者タイプに重複名を付けない方法.
三、構造体の遍歴
, , !! !!
であり、new
関数により実例化することができる(参照タイプが得られる).
.1、インスタンス化
--newを使います(ポインタタイプが得られます)
new関数を使用して、新しい構造体変数にメモリを割り当て、割り当てられたメモリへのポインタを返します:
var t *T = new(T)
type struct1 struct {
i1 int
f1 float32
str string
}
var stru *struct1 = new(struct1)
--オブジェクトの字面量の仕方(値のタイプが得られます)
type Interval struct {
start int
end int
}
intr1 := Interval{0, 3} // __( )__
intr2 := Interval{end:5, start:1} // __( )__
intr3 := &Interval{end:5} // __( )__
式new(Type)と&Type{}は等価であり,得られるのはポインタである.
, make ,
2、ポインタタイプのインスタンス割り当て
pers2 := new(Person)
pers2.lastName = "Woodward"
(*pers2).lastName = "Woodward" //
3、匿名(またはインライン)フィールド
匿名フィールド:フィールドには名前がなくてもよいが、タイプは必須であり、タイプがフィールドの名前である.匿名フィールド自体は、構造体であってもよい.
type struct01 struct { a,b int }
type struct02 struct {
struct01 //
a int // struct01 a
int // ,
}
# :
str02 := new struct02()
str02.struct01.a = 123
str02.a = 1
str02.int = 2 //
str02.b = 3
二、方法
this
の概念はなく,方法は (receiver)
を介してタイプに関連付けられている.
(Goは自動的に
となり、対応する値として解釈される)でも
でもよいし、参照タイプ(メモリを節約し、速度が速い)
の概念に結合される.# :
func (recv receiver_type) methodName(parameter_list) (return_value_list) { ... }
# :
type struct01 struct { a, b int } //
// , sum
func (stru01 *struct01) sum() int {
// stru01 this
return stru01.a + stru01.b
}
func (_ *struct01) saySth() {
fmt.Println(' struct01 , _ ')
}
に定義された方法は、ポインタが参照を解くため、
によって呼び出されてもよいし、
によって呼び出されてもよい.
に定義されたメソッドは、
でのみ呼び出され、値では呼び出されません.三、構造体の遍歴
package main
import (
"fmt"
"reflect"
)
type person struct {
name string
age int
}
func main() {
v := reflect.ValueOf(person{"Diana", 30})
count := v.NumField()
for i := 0; i < count; i++ {
f := v.Field(i)
switch f.Kind() {
case reflect.String:
fmt.Println(f.String())
case reflect.Int:
fmt.Println(f.Int())
}
}
}