ゴー言語は継承し、他のオブジェクト指向の概念の「クラス」をサポートしていません「クラス」の概念がありません。Goが埋め込まれた構造を介して、拡張性と柔軟性をより高いオブジェクト指向のインターフェース言語と相まって。
エイリアス、およびカスタムタイプを入力
カスタム・タイプ
このようないくつかの囲碁言語などの基本データ型、がありstring
、整型
、浮点型
、布尔
あなたが行くの言語使用することができますし、他のデータ型、type
カスタム型を定義するキーワードが。
カスタムタイプは、新しい型を定義することです。私たちは、構造体によっても定義することができます内蔵の基本的なタイプに基づいて定義することができます。例えば:
// 将MyInt定义为int类型
type MyInt int
タイプの別名
タイプの別名があるGo1.9
新しいバージョンが追加された機能します。
別名規定を入力します。TypeAliasはエイリアスのみを入力して、本質的には、TypeAliasとタイプが同じタイプです。子供のように子ニックネーム、ペットの名前、学校の学名、英語教師を持っており、彼の英語名を与えるが、これらの名前はすべて個人的に彼を参照してください。
type TypeAlias = Type
私たちは前に見てきたrune
、とbyte
次のように、それらが定義されているタイプの別名であります:
type byte = uint8
type rune = int32
型定義と型の別名との違い
タイプ別名型定義は、等号の表面との間の唯一の違いです、私たちはコードに従うことによって、それらの間の違いを理解する必要があります。
//类型定义
type NewInt int
//类型别名
type MyInt = int
func main() {
var a NewInt
var b MyInt
fmt.Printf("type of a:%T\n", a) //type of a:main.NewInt
fmt.Printf("type of b:%T\n", b) //type of b:int
}
結果はタイプがあることを示してmain.NewInt
メインパッケージ定義されたの上映NewInt
タイプ。B型ですint
。MyInt
そこにコンパイルされていない場合にのみ存在するコードで入力MyInt
タイプを。
構造
ゴーデータ型の基礎となるするのGo言語が提供する、物事のいくつかの基本的な性質の言語で表現することができますが、私たちは、物事の財産の全部または一部を表現したいときは、この時間は、単一の基本データ型は明らかに需要を満たすことができませんカスタムデータ型の種類は、基本データ型の複数をカプセル化することができ、データ型は、この構造、英語名を呼ばれますstruct
。つまり、我々はできるstruct
の独自のタイプを定義します
言語を経るstruct
オブジェクト指向を実装します。
構造が定義されています
使用type
してstruct
、次のようにキーワードが構造を定義するために、特定のコードの形式は次のとおりです。
type 类型名 struct {
字段名 字段类型
字段名 字段类型
…
}
どこで:
- 名タイプ:カスタム構造の識別名は、同じパッケージに繰り返すことはできません。
- フィールド名:構造体フィールド名を示します。構造体のフィールド名は一意でなければなりません。
- フィールドタイプ:フィールドの具体的な構造の種類を示します。
例えば、我々が定義しPerson
、以下のように、(ヒトの)身体構造
type Person struct {
name string
city string
age int8
}
フィールドの同じ型も1行に書き込むことができ、
type Person struct {
name,city string
age int8
}
我々が持っているので、person
カスタム型を、それが持っているname
、city
、age
三つのフィールド、それぞれの名前、都市と年齢を。我々は、この使用しperson
た構造を簡単に表現すると、プログラム内の個人情報を保存することができます。
基本データ型を記述するために使用される言語に組み込まれた値であり、構造は、値の集合を記述するために使用されます。例えば、人はそれが基本的にデータの高分子型で、名前、年齢、居住地の市、などを持っています
構造の例
構造がインスタンス化された場合にのみ、それが実際にメモリを割り当てます。つまり、フィールドは、構造体を使用するためにインスタンス化する必要があります。
自体の構造の一種で、私たちは宣言のような組み込み型を使用することができますvar
構造型を宣言するためにキーワードを。
var 结构体实例 结构体类型
基本的なインスタンス化
例えば:
type Person struct {
name string
city string
age int8
}
func main(){
var p1 Person
p1.name = "Jack"
p1.city = "China"
p1.age = 18
fmt.Printf("p1=%v\n", p1) // p1={Jack China 18}
fmt.Printf("p1=%#v\n", p1) // p1=main.Person{name:"Jack", city:"China", age:18}
}
私たちは、.
例えば、アクセス構造に(メンバ変数)をフィールドp1.name
とp1.age
そうで。
匿名構造
いくつかの一時的なデータ構造などの定義でも匿名でシーン構造を使用することができます。
package main
import (
"fmt"
)
func main() {
var user struct{Name string; Age int}
user.Name = "小王子"
user.Age = 18
fmt.Printf("%#v\n", user)
}
ポインタ型構造を作成します。
また、使用することができnew
、インスタンス化されたキーワードの構造を構造体のアドレスを取得します。形式は次のとおりです。
var p2 = new(person)
fmt.Printf("%T\n", p2) //*main.person
fmt.Printf("p2=%#v\n", p2) //p2=&main.person{name:"", city:"", age:0}
その結果から、我々は印刷されていることがわかりますp2
構造体のポインタを。
なお、囲碁言語で直接支持構造体ポインタ.
メンバーアクセス構造に。
var p2 = new(person)
p2.name = "小王子"
p2.age = 28
p2.city = "上海"
fmt.Printf("p2=%#v\n", p2) //p2=&main.person{name:"小王子", city:"上海", age:28}
インスタンス化のアドレス構造を取ります
使用&
フェッチ体構造のアドレス操作は、構造のタイプに相当するnew
動作の一例。
p3 := &person{}
fmt.Printf("%T\n", p3) //*main.person
fmt.Printf("p3=%#v\n", p3) //p3=&main.person{name:"", city:"", age:0}
p3.name = "七米"
p3.age = 30
p3.city = "成都"
fmt.Printf("p3=%#v\n", p3) //p3=&main.person{name:"七米", city:"成都", age:30}
p3.name = "七米"
実際には、底があり(*p3).name = "七米"
、これは、私たちが達成するのを助けるために行くの言語構文糖があります。
構造の初期化
構造は、そのメンバ変数は、その種類に対応するゼロ値であり、初期化されていません。
type person struct {
name string
city string
age int8
}
func main() {
var p4 person
fmt.Printf("p4=%#v\n", p4) //p4=main.person{name:"", city:"", age:0}
}
使用して、キーと値のペアを初期化します
初期化されたキー値の構造を使用する場合、フィールド構造に対応するキーは、フィールドの初期値であるべきです。
p5 := person{
name: "小王子",
city: "北京",
age: 18,
}
fmt.Printf("p5=%#v\n", p5) //p5=main.person{name:"小王子", city:"北京", age:18}
また、例えば、構造体へのポインタを初期化する鍵になることがあります。
p6 := &person{
name: "小王子",
city: "北京",
age: 18,
}
fmt.Printf("p6=%#v\n", p6) //p6=&main.person{name:"小王子", city:"北京", age:18}
なし初期値とすると、いくつかのフィールドは、フィールドを書き込むことはできません。この場合、値フィールドには初期値がフィールドタイプのゼロ値で指定されていません。
p7 := &person{
city: "北京",
}
fmt.Printf("p7=%#v\n", p7) //p7=&main.person{name:"", city:"北京", age:0}
初期設定値のリストを使用します
初期構造は、キーが書き込みにないとき、の値に直接書き込む初期化され、省略することができます。
p8 := &person{
"沙河娜扎",
"北京",
28,
}
fmt.Printf("p8=%#v\n", p8) //p8=&main.person{name:"沙河娜扎", city:"北京", age:28}
この初期化形式を使用すると、に注意を払う必要があります。
- すべてのフィールドは構造を初期化する必要があります。
- シーケンスの初期値を充填する構造体の宣言でフィールドの順序と一致する必要があります。
- この方法は、ミックスや鍵初期化メソッドはできません。