理解 struct 类型

A struct is a sequence of named elements, called fields, each of which has a name and a type.

结构体是由一系列具有指定数据类型的字段组成的, 也就是说, 可以在单个变量中存储众多类型不同的数据字段.
也可以通过单个变量引用一系列相关的值.

目前自己的理解: struct 就是一种数据类型, 就像我们熟悉的整形, 浮点型一样的数据类型, 只不过保存数据的格式有所不同.

定义和使用 struct

定义一个 struct. 为了让数据结构看起来更有实际意义, 这里是引用了汽车的例子, 像是创建了一个汽车的模型, 里面的各个字段(元素)都是汽车相关的属性:

type car struct{
    gas_pedal uint16 // min 0 max 65535
    brake_pedal uint16 
    steering_wheel int16  // -32k   +32k
    top_speed_kmh float64 
}

声明类型为结构体的变量并赋值:

func main() {
    // 方法一
    var a_car car
    a_car.gas_pedal = 22341
    a_car.brake_pedal = 0
    a_car.steering_wheel = 12561
    a_car.top_speed_kmh = 225.0

    // 方法二(常用)
    b_car := car{gas_pedal: 22341,
                brake_pedal: 0,
                steering_wheel: 12561,
                top_speed_kmh: 225.0}

    // 方法三
    c_car := car{22341, 0, 12561, 225.0}

    // 取值
    fmt.Println(a_car.gas_pedal)
}}

struct 类型的方法

2 types of methods:
value receivers: receive values and do calculation on value
pointer receivers: if you want to modify some part of that struct, change a value in that struct, then you need a pointer receiver.

struct 类型的两种方法:
接收值变量: 只能接收值, 做一些计算处理等.
接收指针变量: 可以改变 struct 里元素的值.

method of value receiver 接收值变量的方法

define methods on values. It's making a copy of whatever you are pasing, you can do anything without affecting the original struct.

相当于 copy 一份 struct 的值作为副本, 然后你在方法里所做的任何操作都不会影响到原 struct 的值. 这种方式适用于你不想改变原值, 或者 struct 的数据结构比较轻量的情况, 也就是说如果 struct 的数据结构很庞大, 那么这种方式还挺影响性能的.

// 定义一个常量
const usixteenbitmax float64 = 65535

// 给类型为 struct 的变量 car 定义一个 kmh() 方法, 返回值类型为 float64
func (c car) kmh() float64 {
    // 用 car 中元素的值做计算
    return float64(c.gas_pedal) * (c.top_speed_kmh / usixteenbitmax)
}

func main() {
    a_car := car{gas_pedal: 22341,
                brake_pedal: 0,
                steering_wheel: 12561,
                top_speed_kmh: 225.0}

    fmt.Println(a_car.gas_pedal)
    fmt.Println(a_car.kmh())
    }

method of value pointer 接收指针变量的方法

define methods on pointers. It's gona modify the original struct. For bigger struct, pointer receiver is more efficient than the value receiver.

在 struct 结构的指针上定义方法, 方法会直接作用在原值上. 对于体量比较大的 struct, 不管你是否想要修改原值, 这种方法还是比较高效的.

// 给类型为 struct 的变量 car 定义一个 new_top_speed() 方法, 没有返回值
func (c *car) new_top_speed(newSpeed float64) {
    c.top_speed_kmh = newSpeed
}

以上, 就是在 struct 结构上定义方法的内容.


下面是通过普通方法, 把 struct 类型作为参数, 也可以实现同样的效果:

// 通过这个函数的传参也可以看出, struct 类型真的就跟 float 一样, 在 go 中都是数据类型
func newer_top_speed(c car, speed float64) car {
    c.top_speed_kmh = speed
    return c
}

func main() {
    a_car := car{gas_pedal: 22341,
                brake_pedal: 0,
                steering_wheel: 12561,
                top_speed_kmh: 225.0}

    fmt.Println(a_car.top_speed_kmh) //225

    a_car = newer_top_speed(a_car, 500)

    fmt.Println(a_car.top_speed_kmh) // 500
    }

把 struct 作为参数传递也有两种的, 一种是传值, 一种是传指针, 上面例子就是传值的.

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!