Go-Structure

定义&赋值

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

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())
}
发布了384 篇原创文章 · 获赞 44 · 访问量 56万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览