Golang 语言特性

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
}


上一篇:1.Go语言快速入门


下一篇:Go语言编程从入门到精通(包的使用、导入、安装、更新、创建)