go语言八股文

1.go语言的接口是怎么实现

接口(interface)是一种类型,它定义了一组方法的集合。任何类型只要实现了接口中定义的所有方法,就被认为实现了该接口。

代码的实现

复制代码
package main

import "fmt"

// 定义接口
type Shape interface {
    Area() float64
    Perimeter() float64
}

// 定义实现接口的类型
type Rectangle struct {
    Width  float64
    Height float64
}

// 实现接口方法
func (r Rectangle) Area() float64 {
    return r.Width * r.Height
}

func (r Rectangle) Perimeter() float64 {
    return 2 * (r.Width + r.Height)
}

func main() {
    // 使用接口
    var s Shape
    rect := Rectangle{Width: 4, Height: 5}
    s = rect

    fmt.Println("面积:", s.Area())       // 输出: 面积: 20
    fmt.Println("周长:", s.Perimeter())  // 输出: 周长: 18
}

理解与记忆方法

1接口是方法的集合:接口定义了一组方法,任何类型实现了这些方法就实现了接口。

2隐式实现:Go 不需要显式声明实现某个接口,只要类型的方法集包含接口的所有方法即可。

3空接口:interface{} 是最通用的接口,可存储任何类型值,用于灵活性需求。

4接口值的内部结构:接口值包含动态类型信息和实际数据值,支持类型断言和类型切换。

5鸭子类型:如果一个东西走起来像鸭子,叫起来也像鸭子,那么它就是鸭子。即,只要类型实现了接口的方法,就被认为实现了接口。

2.go语言使用断言时会发生拷贝吗

**类型断言是否会发生拷贝,取决于接口值的存储方式

场景 1:接口存储的是值类型(直接拷贝)

场景 2:接口存储的是指针类型(不拷贝)

3.go语言中如何访问私有成员

1.导出公有方法【推荐度:★★★★★】(get和set)
复制代码
package main

import "fmt"

// 定义一个结构体
type Person struct {
    name string  // 私有字段
    age  int     // 私有字段
}

// 导出 Get 方法 - 获取 name
func (p *Person) GetName() string {
    return p.name
}

// 导出 Set 方法 - 设置 name
func (p *Person) SetName(newName string) {
    p.name = newName
}

// 导出 Get 方法 - 获取 age
func (p *Person) GetAge() int {
    return p.age
}

// 导出 Set 方法 - 设置 age
func (p *Person) SetAge(newAge int) {
    if newAge >= 0 {
        p.age = newAge
    } else {
        fmt.Println("年龄不能为负数")
    }
}

func main() {
    // 创建 Person 实例
    person := Person{
        name: "张三",
        age:  25,
    }

    // 调用 Get 方法
    fmt.Println("姓名:", person.GetName()) // 输出: 姓名: 张三
    fmt.Println("年龄:", person.GetAge())  // 输出: 年龄: 25

    // 调用 Set 方法
    person.SetName("李四")
    person.SetAge(30)

    fmt.Println("新姓名:", person.GetName()) // 输出: 新姓名: 李四
    fmt.Println("新年龄:", person.GetAge())  // 输出: 新年龄: 30

    // 测试设置非法年龄
    person.SetAge(-5) // 输出: 年龄不能为负数
}
2.反射(reflect包)【推荐度:★★★】
复制代码
导入反射包:在代码中导入 reflect 包。
获取反射对象:使用 reflect.TypeOf 获取类型的反射对象,reflect.ValueOf 获取值的反射对象。
获取字段:通过反射对象的 FieldByName 或 Fields 方法获取结构体的字段。
设置可导出性:如果字段是私有的(小写开头),需要通过反射设置其可导出性(CanSet)。
访问和修改字段:使用反射对象的 Interface 方法获取字段的值,Set 方法修改字段的值
package main

import (
	"fmt"
	"reflect"
)

// 定义一个结构体
type Person struct {
	name string  // 私有字段
	age  int     // 私有字段
}

func main() {
	// 创建 Person 实例
	person := Person{
		name: "张三",
		age:  25,
	}

	// 使用反射访问私有字段
	accessPrivateField(&person)
}

// 使用反射访问私有字段
func accessPrivateField(obj interface{}) {
	// 获取反射对象
	val := reflect.ValueOf(obj).Elem() // 获取指针对应的值

	// 获取 name 字段
	nameField := val.FieldByName("name")
	if nameField.CanSet() {
		fmt.Println("name 字段值:", nameField.Interface())
		// 修改 name 字段值
		nameField.SetString("李四")
	}

	// 获取 age 字段
	ageField := val.FieldByName("age")
	if ageField.CanSet() {
		fmt.Println("age 字段值:", ageField.Interface())
		// 修改 age 字段值
		ageField.SetInt(30)
	}

	// 打印修改后的值
	fmt.Println("修改后的 person:", obj.(*Person))
}
3.同包内直接访问【推荐度:★★★★】

自学go语言笔记,希望我们可以一起学习!

相关推荐
m0_6896182836 分钟前
从海洋生物找灵感:造个机器人RoboPteropod,它能在水下干啥?
笔记·机器人
Asus.Blogs1 小时前
为什么 import _ “github.com/go-sql-driver/mysql“ 要导入但不使用?_ 是什么意思?
sql·golang·github
龙湾开发2 小时前
轻量级高性能推理引擎MNN 学习笔记 02.MNN主要API
人工智能·笔记·学习·机器学习·mnn
HappyAcmen3 小时前
线代第二章矩阵第八节逆矩阵、解矩阵方程
笔记·学习·线性代数·矩阵
程序员爱钓鱼3 小时前
跳转语句:break、continue、goto -《Go语言实战指南》
开发语言·后端·golang·go1.19
愚润求学4 小时前
【递归、搜索与回溯】专题一:递归(二)
c++·笔记·算法·leetcode
愚润求学5 小时前
【Linux】基础 IO(一)
linux·运维·服务器·开发语言·c++·笔记
Wallace Zhang5 小时前
STM32F103_LL库+寄存器学习笔记22 - 基础定时器TIM实现1ms周期回调
笔记·stm32·学习
大白的编程日记.5 小时前
【Linux学习笔记】理解一切皆文件实现原理和文件缓冲区
linux·笔记·学习
孞㐑¥5 小时前
Linux之进程控制
linux·开发语言·c++·经验分享·笔记