Go语言学习记录--结构体

Go语言中的结构体

  Go语言中没有类这一概念,但是其中所包含的结构体可以实现继承的功能。

  自定义类型

  使用type关键字声明自定义类型的格式如下:

  type new_type_name orign_type_name

  type为关键字,new_type_name是自定义类型名,origin_type_name是GO某个自带的类型(eg,struct)

声明并实例化指针类型的结构体变量

  在go语言中,使用new()函数可以对结构体变量进行实例化,并返回结构体变量的地址

  除了使用new()函数,还使用&运算符直接对结构体进行取结构体地址操作

下面代码展示了声明结构体,以及结构体指针的用法;

package main

import (
    "fmt"
)

func test1() {
    var name string
    name = "tom"
    var p *string
    p = &name
    fmt.Println("name:", name)
    fmt.Println("p:", p)
    fmt.Println("*P:", *p)
}

func test2() {
    type person struct {
        id   int
        age  int
        name string
    }

    tom := person{
        id:   1,
        age:  13,
        name: "tom",
    }
    fmt.Println(tom)
    var p_struct *person
    p_struct = &tom
    fmt.Println("p_struct: ", &p_struct)
    fmt.Println("*p_struct: ", *p_struct)
}

func test3() {
    type customer struct {
        id  int
        age int
    }
    var c = new(customer)
    c.id = 101
    c.age = 12
    fmt.Println(*c)
}
func main() {
    test1()
    test2()
    test3()
}

运行结果:

 

构造函数与方法

  在go语言中,构造函数是通过初始化结构体来模拟实现的。

package main

import "fmt"
import "reflect"

type Cat struct {
    gender int
    color  string
    name   string
}

func newCat(gender int, color string, name string) *Cat {
    return &Cat{
        gender: gender,
        color:  color,
        name:   name,
    }
}
func main() {

    CatOne := newCat(0, "white", "三酷猫")
    fmt.Println(CatOne)
    fmt.Println(reflect.TypeOf(CatOne))

}

运行结果:

 

   方法与接收者

  在Go语言中,也有方法的概念。它作用于结构体中特定字段的函数,这些字段变量被称为接收者。声明格式如下:

  func (receiver_name receiver_type) function_name(params)(return_types){}

  与函数的的区别:声明函数是无须给定接收者参数的。

  废话不说,看代码:

package main

import (
    "fmt"
    "reflect"
)

type NBAPLAYER struct {
    height  int
    postion string
    name    string
}

func newPlayer(height int, postion string, name string) *NBAPLAYER {
    return &NBAPLAYER{
        height:  height,
        postion: postion,
        name:    name,
    }
}

func (nbaInstance NBAPLAYER) get_score(score int) {

    fmt.Println(nbaInstance.name, "今晚拿了", score, "分")
}

func (nbaInstance NBAPLAYER) train() {

    fmt.Println(nbaInstance.name, "正在训练")
}

func (nbaInstance NBAPLAYER) reName(newname string) {
    nbaInstance.name = newname
    fmt.Println("方法中nbaInstance的name属性值为:", nbaInstance.name)
}

func main() {
    nbaplayer := newPlayer(198, "控球后卫", "Kol Mikkelson")

    fmt.Println(nbaplayer)
    fmt.Println(reflect.TypeOf(nbaplayer))

    nbaplayer.get_score(55)
    nbaplayer.train()

    nbaplayer.reName("KOl")
    nbaplayer.train()

}

运行结果:

 

 

  

posted @ 2022-12-04 20:27  99号的格调  阅读(22)  评论(0编辑  收藏  举报