zoukankan      html  css  js  c++  java
  • 【Go】语法基础之结构体

    结构体的定义很简单:

    type Vertex struct {
        X, Y float64
    }

    可以理解为多个变量的集合。

    结构体的使用:

    1、直接使用:

    v := Vertex{1, 2}

    var v = Vertex{1, 2}

    2、通过new关键字:

    v := new(Vertex)

    3、通过指针访问:

    v := &Vertex{1, 2}

    为结构体添加方法:

    package main
    
    import (
        "fmt"
        "math"
    )
    
    type Vertex struct {
        X, Y float64
    }
    
    func (v *Vertex) Scale(f float64) {
        v.X = v.X * f
        v.Y = v.Y * f
    }
    
    func (v *Vertex) Abs() float64 {
        return math.Sqrt(v.X*v.X + v.Y*v.Y)
    }
    
    func main() {
        v := &Vertex{3, 4}
        v.Scale(5)
        fmt.Println(v, v.Abs())
    }

    给结构体添加方法,就是在定义方法的时候在func和方法名之间加一个括号,加入该结构体的指针引用(也可以是值引用)。

    这里值得注意的是指针引用和值引用的区别:

    指针引用可以对结构体内部数据进行修改,而值引用不可以,如下面的例子:

    package main
    
    import (
        "fmt"
    )
    
    type Vertex struct {
        X, Y int
    }
    
    //值引用
    func (v Vertex) show() {
        v.X = 1
    }
    
    //指针引用
    func (v *Vertex) show1() {
        v.X = 1
    }
    
    func main() {
        v := &Vertex{3, 4}
        v.show()
        fmt.Println(v.X) //输出:3
        v.show1()
        fmt.Println(v.X) //输出:1
    }

    可以看出若在结构体的方法定义时没有使用指针引用,是无法改变结构体的成员变量值的。

    总结:golang是非面向对象语言,对于写java比较多的我还是有点难以接受的,可能C系同学更易接受吧。若非要比较,也可以说go语言中的结构体类似java中的类,但是很明显缺少继承多态等等OO的特性。

    另外,go中的指针相比较于C系语言似乎是阉割版的,即只有在变量声明时会使用到,并不会涉及到指针操作,虽然觉得奇怪但是这样还是降低了语言难度哈。

  • 相关阅读:
    html 上传图片前预览
    php获取当月天数及当月第一天及最后一天、上月第一天及最后一天实现方法
    php 计算 pdf文件页数
    php 获取半年内每个月的订单数量, 总价, 月份
    php 获取两个数组之间不同的值
    小程序支付功能
    关于nginx的Job for nginx.service failed because the control process exited with error code.错误
    linux 安装 Apollo
    MongoDB待续。。。
    ABP vNext...待续
  • 原文地址:https://www.cnblogs.com/puyangsky/p/5763067.html
Copyright © 2011-2022 走看看