2023-11-21日记(结构体、接口...)

2023-11-20  本文已影响0人  护念

概述

今天的知识点相对零散,以日记形式记录。

1. 结构体实例

  1. 首先,结构体是值类型,非引用类型;因此var 后 会分配内存。
  2. 注意下面三种写法的区别
package main

import "fmt"

type Person struct {
    Name string
}

func main() {
    var p1 = new(Person) // 结构体实例 - 指针
    var p2 = Person{}       //  结构体实例(老老实实写法)
    var p3 Person              // 结构体实例 (值类型自动初始化了)

    fmt.Printf("p1: %#v Type: %T\n", p1, p1)
    fmt.Printf("p2: %#v Type: %T\n", p2, p2)
    fmt.Printf("p3: %#v Type: %T\n", p3, p3)
}

// p1: &main.Person{Name:""} Type: *main.Person
// p2: main.Person{Name:""} Type: main.Person
// p3: main.Person{Name:""} Type: main.Person

2. 接口方法 + 指针接收者

  1. 在结构体中我们知道,无论是机构体指针还是实例它们都能同时驱动,实例接收者、指针接收者;
  2. 对于指针接收者而言,则不行,必须要老老实实用指针。
package main

import "fmt"

type Speaker interface {
    say()
}

type Person struct {
    Name string
}

func (p *Person) say() {
    fmt.Println("hello")
}

func main() {
    p1 := Person{Name: "zhangsan"}          // Person实例
    var p2 Speaker = Person{Name: "wangwu"} // Speaker 接口
    // 由于say方法的接收者是指针,而这里是实例所以会报错
    // cannot use Person{…} (value of type Person) as Speaker value in variable declaration: Person does not implement Speaker (method say has pointer receiver)
    // 正确写法这里改成指针

    p1.say()
    p2.say()
}

3. 看代码时遇到接口类型咋办?

  1. 只关注输入和输出,不关注具体实现(我们去看接口中方法的就行)
  2. 如果要知道当前这个接口具体指的是哪个对象

4. 看golang文档的心得

  1. type 相当于类
  2. 下面有函数-类方法;方法- 实例方法


    image.png

5. int类型是什么类型?

它的位数取决于你的操作系统,如果是32位则是32位;如果是64位则是64位

package main

import "fmt"

func main() {
    a := int(99999990999999)
    fmt.Printf("T: %T; %#v\n", a, a)
}

// T: int; 99999990999999
上一篇 下一篇

猜你喜欢

热点阅读