结构体 与 结构体 指针

247 阅读1分钟
  • 结构体
type MyStruct struct {
   Name string
}
x := Mystruct{}//或者 var x Mystruct 是结构体
y := &Mystrct{}//或者 var y *Mystruct 是结构体指针
  • 函数与方法的区别:
    函数是一种独立的程序代码块
    方法是在函数的基础上限定了可被调用的结构体
func add(x int, y int) int {//函数
    return x + y
}
type person struct {
    name string
    age  int
}
func (p person) PrintName1() {//方法
   fmt.Println(p.name)
}
func (p *person) PrintName2() {//方法
   fmt.Println(p.name)
}
package main

import "fmt"

type MyStruct struct {
   Name string
}

func (s MyStruct) SetName1() {
   fmt.Println(s.Name)
   s.Name = "sss"
   fmt.Println(s.Name)//结构体变量可以【.】访问到内部变量

}
func (s *MyStruct) SetName2() {
   fmt.Println(s.Name)
   s.Name = "ddd"
   fmt.Println(s.Name)//结构体指针也可以【.】访问到内部变量
}

func f1(req string) {//普通函数中的值传递
   req = "1111"
}
func f2(req *string) {//普通函数中的指针传递
   *req = "2222"
}

func (s MyStruct) SetName3() {
   s.Name = "sss"//传值,立马由于作用域的缘故,会整出一个副本
}

func (s *MyStruct) SetName4() {
   s.Name = "ddd"//传指针操作的就是指针下的值,不受作用域约束
}

func main() {
   m := MyStruct{Name: "xiaohaizi"}
   m.SetName1()
   m.SetName2()
   REQ := "000"
   f1(REQ)
   //可以看到不传指针,根本改不了外面的REQ本身
   fmt.Println("f1", REQ)
   f2(&REQ)
   //传指针就可以改到外面的REQ
   fmt.Println("f2", REQ)

   n := MyStruct{Name: "66666666666"}
   n.SetName3()
   //可以发现,传的结构体,改不了外面的数据
   fmt.Println("SetName3", n.Name)
   n.SetName4()
   //传的结构体指针,可以改外面的数据
   fmt.Println("SetName4", n.Name)

}

//综上来看,结构体 和 结构体指针 本质就是 普通变量 和 指针变量的区别
//但是结构体有一个特性,就是用 结构体点出来 和 指针点出来是一样的