Golang 语言特性
阅读原文时间:2023年07月08日阅读:1

1. 函数

与c 语言不同,go 语言中,函数的参数和返回值都由栈来存储。

传值:函数调用时会复制参数,被调用方和调用方持有两份不相关的两份数据

传引用:函数调用时会传递参数指针,被调用方和调用方持有相同的数据,任意一方做出修改都会影响另一方

  • 不同的语言选择不同的方式传递参数,go函数的参是传值类型。无论是传递基本类型,结构体还是指针,都会对传递的参数进行复制。

  • 将指针作为参数传入函数时,函数内部会复制指针,也就是会同时出现两个指针指向原有的内存空间,因此 go 语言中传指针本质上也是传值。

  • 如果值参数大小比较大,比如长数组,那么copy 参数内容会对性能造成很大的影响。此时,传指针类型性能更好一些。

    package main

    import (
    "encoding/json"
    "fmt"
    )

    type s1 struct {
    // 字段小写开头是不能被外界访问到的,json 序列化取不到值。这种称为小写开头的字段称为私有属性。
    Name string
    Age int
    }

    type s2 struct {
    Addr string
    Married bool json:"married" // 结构体 tag
    }

    type s3 struct {
    Hobby string
    // 结构体嵌套
    FromS1 s1
    // 结构体匿名嵌套
    s2 // 架构体的匿名字段
    }

    func main() {

    // 1. 结构体初始化
    var s s3
    s.Hobby = "Games"
    //s.fromS1 = s1{name: "siri",age: 18}
    s.FromS1.Name = "siri"
    s.FromS1.Age = 18
    s.s2.Addr = "Beijing"
    s.s2.Married = false
    
    fmt.Println(s)
    data,_ := json.Marshal(s)
    fmt.Printf("%s\n",data)
    
    // 2. 匿名结构体。即 非 type 关键字声明的结构体
    var p struct{
        name string
        age int
    }
    p.name = "Bob"
    p.age = 19
    fmt.Println(p)
    
    // 3. 指针类型的方法
    ss := s1{Name: "jeans",Age: 20}
    ss.ChangeName("Bill",80)
    fmt.Println(ss)  // 名字和年龄被修改了

    }

    func (s *s1)ChangeName(name string,age int) {
    s.Name = name
    s.Age = age
    }