Go语言学习笔记4——struct

原创 2012年03月04日 19:50:57

        原计划这篇是写函数的,翻来覆去的研究函数,也没找到什么感悟,于是就写struct吧。这可是个好家伙阿,一个非玩具的C系统中,绝对是struct的天下,可Go更是青出于蓝胜于蓝。

        struct在Go中基本总是和type一起出现,Go的type关键字相似于C中的typedef,给一个变量定义个别名。

先欣赏一段struct的代码:

package main

import "fmt"

/**
 * 定义Person类
 */
type Person struct {
    name string
    age  int
}

/**
 * 为Person类定义方法
 */
func (this *Person) SetName(name string) {
    this.name = name
}

func (this *Person) GetName() string {
    return this.name
}

func (this *Person) SetAge(age int) {
    this.age = age
}

func (this *Person) GetAge() int {
    return this.age
}


/**
 * 定义Girl类, 继承于Person
 */
type Girl struct {
    Person
    gender string
}

func (this *Girl) SetGender(gender string) {
    this.gender = gender
}

func (this *Girl) GetGender() string {
    return this.gender
}


func main() {
    p1 := new(Person)
    p1.SetName("yixiao")
    p1.SetAge(25)

    fmt.Printf("Name: %s, Age: %d\n", p1.GetName(), p1.GetAge())


    var p2 Person
    p2.SetName("wxw")
    p2.SetAge(23)

    fmt.Printf("Name: %s, Age: %d\n", p2.GetName(), p2.GetAge())

    var g Girl
    g.SetName("lili")
    g.SetAge(12)
    g.SetGender("girl")

    fmt.Printf("Name: %s, Age: %d, Gender: %s\n", g.GetName(), g.GetAge(), g.GetGender())
}

         我相信java和C++程序员看到这段代码绝对有一种似曾相识的感觉。封装的数据之上还能提供操作的方法,这就是最基本的面向对象。虽然Go支持一定的面向对象编程,但我们必须得清楚它不是一门OO的语言,仅仅是一门命令式的语言,和C一样。上面代码的mian函数中使用了两种定义Person对象的方法,第一个其实是指针,第二个才是变量,但两种方式都可以用同一种途径来访问其方法,这是Go语言所允许的,如果你是一个C程序员,你可能会非常的惊讶。

         上面的代码中也有继承的关系,这都是面向对象编程的基本技术,可我个人还是趋向于尽量避免使用继承,能不用就不用,所有Go支持继承并没有让我为此而兴奋,不过语言级支持为封装的数据类提供方法倒是非常不错的,这就满足很大一部分用C++的类写着C程序的人。因为他们只要简单的数据和方法的封装,不要多态,更不要泛型等。

(纠正:这里准备的说不应该是继承,应该是组合,类型的组合,虽然效果相似于继承。我记得C++程序员就经常争论究竟是用继承还是用组合。)

         一个合格的C++程序员绝对不是用C++写着C程序,他们需要熟悉各种奇迹淫巧,需要对C++类的内存分布了如指掌。一个再复杂的类,你只要给他一支笔和一张纸,他就能给你画出各种成员变量,各种方法,虚函数,纯虚函数的内存分布,并且还能清楚的阐述虚函数表的性能等问题。时至今日,我早已经将虚函数,纯虚函数,甚至虚函数表等东东忘得一干二尽了。这些东西根本不是用来帮助你写出优雅的程序,而是阻碍着你,让你一辈子都无法洞悉小的优雅。


面向对象的精髓在于抽象,万物被过度抽象的结果就是迷失自我。



Go语言核心之美 3.4-Struct结构体

struct结构体也是一种聚合的数据类型,结构体中可以有零个或多个任意类型的值-结构体的成员。用来演示struct的一个经典案例就是公司的员工信息,每条员工信息都包含:员工编号,姓名,住址,出生日期,...
  • abv123456789
  • abv123456789
  • 2016-03-25 17:46:56
  • 12375

go语言之结构体数组转为string字符串

转换顺序:先将struct结构体转为map,再将map转为string字符串 struct --> map --> string type demo struct { Id ...
  • qq_29447481
  • qq_29447481
  • 2017-06-06 09:35:37
  • 5227

go - struct类型

struct类型 1. 概述   与C语言struct一样,与java/php等class类似,在Go中,用于扩展类型,面向对象编程(本部分暂未做详细介绍)等   声明格式:(是类型的组合) t...
  • chuangrain
  • chuangrain
  • 2013-07-15 18:06:15
  • 18111

Go-struct嵌套初始化与赋值

struct嵌套的几种用法。
  • u013344915
  • u013344915
  • 2017-01-14 20:05:04
  • 3446

go-struct、方法

package mainimport "fmt"func main() { //创建对象,通过.方式进行初始化 a := person{} a.name = "wyf" ...
  • u013210620
  • u013210620
  • 2016-08-14 16:40:43
  • 1851

Go语言基础:struct

跟C语言或其它语言一样,也有结构体struct。C语言中用关键词typedef来给结构体定义,Go中用的都是type。 struct语法格式 type typeName struct { ...
  • uudou
  • uudou
  • 2016-09-01 14:32:15
  • 693

Go语言中的实现类似泛型的方法

Go语言中提供了一些方法来处理类似的泛型函数。 1。使用类型断言 2。Go语言反射功能 3。自定义类型接口和类型package main import ( "fmt" )func max...
  • wangwenhao00
  • wangwenhao00
  • 2017-12-15 14:53:10
  • 285

自定义泛型的结构(struct)

注意点: 首先,结构的声明要加入,如 MyPoint, 不然结构体里面用到T会混淆。其次,default关键字的新用法:除了在Switch里面的用法;在泛型里面表示该类型的默认值。比如int的默认值为...
  • xxpyeippx
  • xxpyeippx
  • 2008-06-24 09:56:00
  • 1242

Go语言基础:深入理解 struct 内嵌 inteface

对上一篇文章用到的匿名接口的深入理解:http://blog.csdn.net/uudou/article/details/52456133 对于 struct 内嵌 inteface 的使用,我是...
  • uudou
  • uudou
  • 2016-09-16 18:08:29
  • 3291

[golang] struct转JSON,解析JSON

[golang] struct转JSON,解析JSON
  • shachao888
  • shachao888
  • 2016-12-23 15:26:11
  • 6088
收藏助手
不良信息举报
您举报文章:Go语言学习笔记4——struct
举报原因:
原因补充:

(最多只允许输入30个字)