Golang笔记之结构体和方法

Golang中的struct有点跟Java中的类相似.

struct

管他什么特性不特性的,先来段代码.看看跟学过的其他语言有啥区别.

package main

import (
    "fmt"
)

type Person struct {
    name string
    age  int
}
type Student struct {
    grade  string
    Person //匿名字段
}

func main() {
    stu := new(Student)
    var stu2 Student = Student{"一年级",Person{"Arya Stark",15}}
    stu3 := Student{grade: "二年级",Person: Person{"Magicer",32}}
    stu.grade = "三年级"
    stu.Person = Person{"Jon Snow",33}
    fmt.Println(stu) //输出  &{三年级 {Jon Snow 33}}
    //在这里可以直接stu.name获得匿名字段的值,也可以stu.Person.name
    fmt.Println(stu.name,stu.age,stu.grade,stu.Person) //输出Jon Snow 33 三年级 {Jon Snow 33}
    fmt.Println(stu2)                                     //输出   {一年级 {Arya Stark 15}}
    fmt.Println(stu3)                                     //输出   {二年级 {Magicer 32}}

}

Golang中没有继承,但是我们可以使用组合的方式来实现和继承类似的效果.比如上面的代码.我们不能通过显示的让Student继承自Person但是我们可以通过组合的方式来得到这种效果.

type

我们可以通过type关键字来定义一个类型.比如这里的Person类型和Student类型.我们还可以通过type关键字来为int等来设置别名 如type grade int.通过type关键字来定义的

方法

先来段跟方法有关的代码,看下Golang中的方法是个什么鬼.

package main

import (
    "fmt"
)

type Student struct {
    name string
    age  int
}

//值方法
//当我们不需要在方法中使用这个结构的值的时候,可以使用_
func (_ Student) lean() {
    fmt.Println("Student lean")
} //指针方法
//这里的(stu *Student)用来表示这个方法是属于谁的.可以位于不同的文件中,只要是在同一个包中就可以
//在这里我们的stu是Student的指针,只有这时候我们才可以修改p的值,// 当使用(stu Student)时,我们使用的是一份copy.
func (stu *Student) eat(food string) {
    fmt.Println(stu.name," eat ",food,"\t ",stu)
}
func main() {
    stu := new(Student)
    stu.eat("Apple") //student eat  Apple     &{ 0}
    stu.lean()       // Student lean

    var stu2 Student = Student{"Jason",22}
    fmt.Println(stu2) //{Jason 22}
    stu2.eat("Apple") //Jason  eat  Apple     &{Jason 22}
}

我们看到上面Student中的nameage字段都是非导出字段.那么如果我们要在不同的包中对其的值进行修改怎么办呢?
这个时候我们就可以写上跟Javasettergetter方法.如下

func (stu *Student) setName(name string) {
    stu.name = name
}
func (stu *Student) getName() string {
    return stu.name
}

一个Golang初学者,记录的东西难免有错误,还望多多指出啊.谢谢.

相关文章

程序目录结构 简单实现,用户登录后返回一个jwt的token,下次请求带上token请求用户信息接口并返回信息...
本篇博客的主要内容是用go写一个简单的Proof-of-Work共识机制,不涉及到网络通信环节,只是一个本地的简...
简介 默克尔树(MerkleTree)是一种典型的二叉树结构,其主要特点为: 最下面的叶节点包含存储数据或其...
接下来学习并发编程, 并发编程是go语言最有特色的地方, go对并发编程是原生支持. goroutine是go中最近本...
先普及一下, 什么是广度优先搜索 广度优先搜索类似于树的层次遍历。从图中的某一顶点出发,遍历每一个顶...
第一天: 接口的定义和实现 第二天: 一. go语言是面向接口编程. 在学习继承的时候说过, go语言只有封装,...