【Go】语法基础之结构体

puyangsky · · 1560 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

结构体的定义很简单:

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

 


有疑问加站长微信联系(非本文作者)

本文来自:博客园

感谢作者:puyangsky

查看原文:【Go】语法基础之结构体

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1560 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传