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系语言似乎是阉割版的,即只有在变量声明时会使用到,并不会涉及到指针操作,虽然觉得奇怪但是这样还是降低了语言难度哈。

  • 相关阅读:
    大端与小端编号方法的区别
    socket、listen 等函数的打电话隐喻
    windows 网络编程报错 error LNK2019
    有符号数与无符号数之间的转换
    C++ 代码命名建议
    编写启发式代码的方法
    求给定数目的前 n 个素数
    不使用 “+” 实现加法操作
    二叉搜索树中两个节点的旋转
    Python玩转硬件:TPYBoard-Micropython开发板大盘点
  • 原文地址:https://www.cnblogs.com/puyangsky/p/5763067.html
Copyright © 2011-2022 走看看