← 記事一覧へ

Go 学習記録(9):構造体とメソッド

Go 基礎学習の第 9 回。文法、実例、学習の過程を記録します。

構造体

1. type キーワード

type は次の用途で使います。

構造体の宣言

インターフェースの宣言

型エイリアスの宣言

新しい型の定義

型スイッチや型アサーションでも関連する構文を使う

1.1. 型エイリアス

別名を付けると意図が伝わりやすくなります。エイリアスは元の型を指し、独立した型を作るものではありません。

//以定义int的别名举例
type MyInt = int
var i MyInt
fmt.Println("%T\n", i)
//上面代码输出的结果为int,相当一给int取了一个小名,MyInt本质上还是int

1.2. 定義型

既存の基底型から新しい型を定義できます。基底型には int、string、構造体などがあり、構造体なら名前付きの複数フィールドを持てます。用途に合うデータ構造を表現できます。

type MyInt int // 相比于类型别名,没有等号
var i MyInt
fmt.Println("%T\n", i)
//上面代码输出的结果为xxxx.MyInt

新しい型を定義する意味

メソッドを持たせ、用途を明確にできます。

func (mi MyInt) string() string{
    return strconv.Itoa(int(mi))
}

func main(){
    var i MyInt = 10
    fmt.Println(i.string())
}
// 上面的代码给MyInt增加了一个string方法,这样就可以将MyInt类型转换为string类型

2. 構造体の宣言と初期化

Go の構造体は、C の構造体の簡潔さと、メソッドによるオブジェクト指向的な構成を組み合わせています。

名前、年齢、住所、携帯番号などを保存する場合、次のように構造体を定義できます。

type Person struct{
    name string
    age int
    address string
    mobile string
}

func main(){
    //结构体的初始化方式
    p1 := Person{"小明", 18, "北京", "13812345678"} //省略写法每个元素都要写
    p2 := Person{name: "小红", age: 19, address: "上海", mobile: "13812345679"} //能够填部分元素,更灵活
    var p3 Person
    p3.name = "小刚"

    var persons []Person
    persons = append(persons, p1)
    persons = append(persons, Person{"小刚", 20, "广州", "13812345680"})
}

3. 無名構造体

一時的なフィールドのまとまりには、無名構造体を使えます。

address := struct{
    province string
    city string
    district string
}{
    "北京",
     "北京", 
     "海淀区"
}
fmt.Println(address.city)

4. 構造体の入れ子

構造体のフィールドとして、別の構造体を持てます。

type Person struct{
    name string
    age int
}
// 可以不用重复定义
type Student struct{
    // 第一种嵌套方式
    p Person
    score float32
}

func main() {
    // 第一种初始化方式
    s := Student{
        p: Person{
            name: "小明",
            age: 18,
        },
        score: 90,
    }
    fmt.Println(s.p.name)

    // 第二种初始化方式
    s := Student{}
    s.p.name = "小明"
}

埋め込みフィールド

type Person struct{
    name string
    age int
}
// 可以不用重复定义
type Student struct{
    // 第二种嵌套方式--匿名嵌套
    Person
    score float32
}

func main() {
    // 初始化方式
    s.name = "小明"
}

5. 構造体のメソッド

構造体型にメソッドを定義します。

Go のメソッドは、構造体の宣言の外に記述します。

type Person struct{
    name string
    age int
}

func (p Person) print(){
    fmt.Printf("姓名:%s, 年龄:%d\r\n", p.name, p.age)
}

func main() {
    p := Person{
        name: "小明",
        age: 18,
    }
    p.print()
}

元の構造体のフィールドを変更する場合は、ポインタレシーバを使います。

type Person struct{
    name string
    age int
}

func (p *Person) print(){
    p.age = 19
    fmt.Printf("姓名:%s, 年龄:%d\r\n", p.name, p.age)
}

func main() {
    p := Person{
        name: "小明",
        age: 18,
    }
    p.print()
}
//此时输出的结果为:姓名:小明, 年龄:19
この記事の日付について

旧サイトに記載された日付を保持しています。実際に書き始めた時期は、これより早い可能性があります。

同じシリーズ · Go の基礎学習

前の記事Go 学習記録(8):関数・defer・エラー ←次の記事Go 学習記録(10):ポインタと nil →