Go语言指针、结构体 | 青训营

75 阅读2分钟

指针

  • 空指针直接声明,就有nil值
    • 与c++一样,new声明
    • *+类型的方式
    • 注意:Go中只有值传递,指针传参传的是值

  • go 可以通过 unsafe.Pointer 来把指针转换为 uintptr 类型的数字,来实现指针运算。这里请注意,uintptr 是一种整数类型,而不是指针类型。
    • 对语句for _, v := range input { ch <- &v }
      • for range语句中,v变量用于保存迭代input数组所得的值,但是v只被声明了一次,此后都是将迭代input出的值赋值给vv变量的内存地址始终未变,这样再将v的地址发送给ch通道,发送的都是同一个地址
      • 改进:
        • 引入一个中间变量,使得每次temp有个新声明:for _, v := range input { temp := v ch <- &temp }
        • 直接引用数据的内存(无需开辟新的内存空间):for k, _ := range input { c <- &input[k] }
        • 当然,尽可能别用这样的方式(将指针与for range结合)

结构体

  • go中无class

  • 属性定义在结构体里 type 名 struct{}

    • func (person Profile) FmtProfile() {}

      • 其中fmt_profile 是方法名,而(person Profile) :表示将 fmt_profile 方法与 Profile 的实例绑定。
      • Profile 称为方法的接收者,而 person 表示实例本身,相当于 Python 中的 self,在方法内可以使用 person.属性名 的方法来访问实例属性。
    • 实例化

      • myself := Profile{name: "小明", age: 24, gender: "male"}
    • 指针相关

      • 定义方法的方式
        • 当你想要在方法内改变实例的属性的时候,必须使用指针做为方法的接收者
        • func (person *Profile) increase_age() { person.age += 1 }
      • 使用指针的场景
        • 需要在方法内部改变结构体内容的时候
        • 出于性能的问题,当结构体过大的时候
  • 结构体实现 “继承”

    • go语言本身不存在继承
    • 它使用组合的方法,实现类似继承的效果
    • 方式:
      • 例子:将 company 这个 结构体嵌入到 staff 中,做为 staff 的一个匿名字段,staff 就直接拥有了 company 的所有属性了
      •    type staff struct { 
               name string 
               company // 匿名字段 
           }
        
      • 然后在实例化staff之前,先实例化company,再作为一个对象value赋值用于实例化staff

首字母大小写

  • Go语言对首字母有自己的规则
    • 它被来实现控制对方法的访问权限。
      • 当方法的首字母为大写时,这个方法对于所有包都是Public,其他包可以随意调用
      • 当方法的首字母为小写时,这个方法是Private,其他包是无法访问的。

思考学习

  • 跟c++还是有很多区别的,要更加熟悉语法才行
  • 做做项目练练手才是王道