Go-Structure

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

定义&赋值

要点:
- 定义一个新的结构体
- 结构体对象的声明与初始化
- 对象和指针

package main
import "fmt"

type Point struct {
    x float64 
    y float64 
}

/*
You could write the code as below, which is more convenient.
type Point struct {
    x,y float64
}
*/

func print(p Point) {
    fmt.Printf("Point[x=%.2f, y=%.2f]\n", p.x, p.y)
}

func main() {
    var p1 Point; // all fields are set to default value.

    print(p1)

    p1.x++
    p1.y++
    print(p1)

    p2 := new (Point) // p2 is a pointer, and all filed are set to default value.
    print(*p2)

    p3 := Point{x : 31, y : 32}
    print(p3)

    p4 := Point{41, 42}
    print(p4)

    p5 := &Point{51, 52} // a pointer
    //print(p5) //cannot use p5 (type *Point) as type Point in argument to print
    print(*p5)
}

从目前来看,这个struct和C/C++的struct是完全一样的。——Go的初始化倒是方便很多。

接下来是struct往class转换的关键点。

结构体嵌套&成员方法

注:会适当在一个例子中描述多个语法点,从而减少代码阅读量。

要点:
- 在Go中没有class这个语法或关键字,都统一为struct,但可以为struct定义成员函数,从而和传统的class概念保持一致了。
- 在area()这个函数声明中,func和函数名area之间的,Go称之为receiver。这个receiver也可以看做一种参数,有名称、有类型,在函数体中也可以直接引用。
- 尽管area声明的时候是*Circle,但Circle对象(非指针类型)仍然可以用.操作符访问。——Go会自动处理。

package main
import "fmt"
import "math"

type Point struct {
    x,y int
}

type Circle struct {
    center Point 
    r int
}

func (c *Circle) area() float64 {
    return math.Pi * float64(c.r) * float64(c.r)
}

func main() {
    var circle Circle
    circle.center.x = 3;
    circle.center.y = 4;
    circle.r = 5;

    fmt.Println(circle.area())
}

匿名数据成员

Go支持anonymous fields. 这种方式使用起来更为方便。

在Introducing Go中,论证了这种anonymous fields与has-a&is-a之间的辩论关系。用设计层面看,anonymous fields的确更像继承关系,即is-a。有传统的命名域(non-anonymous fields)属于一种依赖关系,即has-a。但有时候为了使用上的方便,特别是在Go语言提供了这么便利的语法下,anonymous fields还是很有诱惑力的,再加上Go倡导的简洁思想,为什么不用呢?!

package main
import "fmt"
import "math"

type Point struct {
    x,y int
}

type Circle struct {
    Point 
    r int
}

func (c *Circle) area() float64 {
    return math.Pi * float64(c.r) * float64(c.r)
}

func main() {
    var circle Circle
    circle.x = 3;
    circle.y = 4;
    circle.r = 5;

    fmt.Println(circle.area())
}

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

本文来自:CSDN博客

感谢作者:u013344915

查看原文:Go-Structure

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

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