Go语言方法快速入门

2020-11-21  本文已影响0人  Jaeyok

方法是和数据类型绑定的,自定义数据类型可以用方法

package main
import "fmt"

type Person struct {
    Name string
    Age int
}
//方法是结构体的指针拷贝 会改变原结构体的数值
func(p *Person) say() {

    p.Name ="jack"
    fmt.Println("方法中Name:", p.Name)
}
//方法是结构体的值拷贝 不会改变原结构体的数值
func(p Person) sayhello() {

    p.Name ="love"
    fmt.Println("方法中Name:", p.Name)
}



func say(p *Person){
    p.Age=28
    fmt.Println("Age:", p.Age)
}
//结构体拷贝 变量拷贝
func(p *Person) getSum(n1 int, n2 int) (int){

    return n1+n2
}
//String函数会在println中自动调用 绑定了Person这个类型
func(p Person) String() string{
    str := fmt.Sprintf("Name=[%v], Age=[%v]",p.Name,p.Age)
    return str
}

func main() {
    //方法的使用
     var p Person
     p.Name="Tom"
     p.say()
    fmt.Println("主函数中Name:", p.Name)

    (&p).sayhello()//形式上是引用类型,但是方法中变量为值类型,因此还是值拷贝,无法改变变量的数值。

     fmt.Println("主函数中Name:", p.Name)
     var result = p.getSum(2,3)
     fmt.Println(result)
     //变量调用方法时,变量本身也会传到方法里面,如果变量是值类型,则值拷贝
     //如果是引用类型,则是地址拷贝
     fmt.Println(p)
     var sp Person
     fmt.Println(sp)

    say(&p)
     fmt.Println(p)

}

Go语言工厂模式,如果一个包内结构体名字首字母为小写,需要编写new函数。如果结构体中某个字段首字母为小写,需要在此包内新建一个在Get函数。

package student
type student struct {
    Name string
    age int
}

func NewStudent(name string, age int ) *student{

    return &student{
        Name: name,
        age:  age,
    }

}

func GetAge(stu *student) int{
    return stu.age
}
package main
import (
    "exceise/student"
    "fmt"
)

func main() {
    stu := student.NewStudent("Loveyou", 18)
    fmt.Println("新建的student类型为:",*stu)
    fmt.Println("name=",stu.Name,"Age",student.GetAge(stu))
}

输出结果如下:

新建的student类型为: {Loveyou 18}
name= Loveyou Age 18

上一篇下一篇

猜你喜欢

热点阅读