構造
囲碁のオブジェクト指向言語の構造によって実現され、構造が値型で、新しいを作成するために使用することができます。
定義
次のように構造が定義されています。
type identifier struct{
filed1 type
filed2 type
}
フィールド構造の名前がある提出され、タイプは、彼らが名前を知らなかった場合、プレースホルダに_を使用することができ、フィールドのタイプです。任意のタイプのフィールドと、偶数構造自体、またはインタフェースの関数であってもよいです。
初期化
同様に、初期化C ++、文はまた、新しいキーワードを割り当てることができます後に直接割り当てることができ、操作は以下の
package main
type ListNode struct {
Val int
Next *ListNode
}
func main() {
//直接声明
var node ListNode
node.Val =1
//new出来
node2:=new(ListNode)
node2.Val=2
}
メンバー方法
外部を達成するために、体内の構造体の定義、
あなたは、あなたが見つけることができる定義するとき、それは実現方法構造体のメンバーのためのチャネルを提供しますので、タイプは、FUNCかもしれません。
package main
import "fmt"
type ListNode struct {
Val int
Next *ListNode
toString func()
}
func doSth() {
fmt.Println("do something")
}
func main() {
var node ListNode
node.Val =1
node.toString=doSth
node.toString()
}
仕上げはそれが非常に法外な発見されたが、この方法のメンバーではなく、合格しなければならないノードのプロパティにアクセスすることはできません彼らは行くことができる前に、と言うこと。
真のメンバーのためのインビトロの方法で構造
package main
import "fmt"
type ListNode struct {
Val int
Next *ListNode
}
//值传递下的成员方法,无法改变node真正的属性
func (node ListNode)setVal(val int) {
node.Val=val
}
//引用传递下的成员方法,可以改变node的真正属性
func (node *ListNode)setVal2(val int) {
node.Val=val
}
func main() {
var node ListNode
node.Val =1
node.setVal(2)
fmt.Println(node.Val)
(&node).setVal2(2)
fmt.Print(node.Val)
}
補助文字列フィールド
文字列フィールドの補助文字列は、同じラインでのみ反射して、フィールド宣言を得ることができます
package main
import (
"fmt"
"reflect"
)
type Person struct {
Name string "Name"
Age int "Age"
Sex int "Sex"
}
func main() {
person := Person{}
person.Name = "Tim"
person.Age = 10
person.Sex = 1
for i := 0; i < 3; i++ {
refTag(person, i)
}
}
func refTag(p Person, i int) {
pType := reflect.TypeOf(p)
iFiled := pType.Field(i)
fmt.Println(iFiled.Tag)
}
reflect.TypeOfは、変数が構造体である場合、それはあなたがTagプロパティを使用することができ、提出された構造により、インデックスフィールドであってもよいし、変数の正しい種類を取得することができます。
匿名フィールド
ゴー構造は、特別なフィールド、匿名のフィールドをサポートしています。これらのフィールドは、明示的にのみ、フィールドタイプに名前を付けていない、この時点でのフィールドタイプは、フィールドの名前で、フィールドも、匿名の構造とすることができます。だから、匿名フィールドの同じ種類は一つだけを持つことができます。
type Test1 struct {
t1 int
t2 int
}
type Test struct {
a int
b string
bool
Test1
}
func main() {
test := new(Test)
test.a = 1
test.b = "2"
test.bool = true
test.t1 = 2
test.t2 = 3
fmt.Println(test)
}
継承
組み合わせとして知られている別の構造に構造を挿入
匿名差、及びこれらの組み合わせ
別の匿名の構造、ネストされた構造体と、この構造は、直接それによって継承を実現し、本体匿名アクセス方法を構成することができる
ネストされた構造体場合別のよく知られた構造、[]は、モデルを組み合わせると呼ばれる
複数の匿名構造体のネストされた構造は、構造を直接多重継承を達成するために、複数の匿名構造にアクセスできるかどうか方法
package main
import "fmt"
type ListNode struct {
Val int
Next *ListNode
}
//组合
type TreeNode struct {
lnode ListNode
}
//继承
type GraphNode struct {
ListNode
}
//值传递下的成员方法,无法改变node真正的属性
func (node ListNode)setVal(val int) {
node.Val=val
}
//引用传递下的成员方法,可以改变node的真正属性
func (node *ListNode)setVal2(val int) {
node.Val=val
}
func main() {
var treeNode TreeNode
treeNode.lnode.setVal2(1)
var graphNode GraphNode
graphNode.setVal2(2)
}