Golang基础-11

Go面试题集:第一弹:语法基础(共92题)-Part2(第11~第20题) 结果不确定性:遍历时删除元素可能导致部分键未被访问或重复访问。规范建议:Go 官方明确建议避免在遍历时修改map结构(增删键),以确保行为可预测。 阅读详情

Go语言基础

介绍

基础

介绍

  • 本文介绍Go语言中面向对象(封装、继承、多态)相关特性、反射(Type、Value、动态创建结构体)相关特性、等相关知识。

基础

面向对象
  • Go语言是否是一门面向对象的语言,Golang 官方答案是:YES OR NO。
  • Go语言从设计和语法上本身是一门面向过程、支持并发的语言,没有类、继承和多态的特性。
  • Go语言提供了部分面向对象的特性、可以实现类似面向对象程序设计。
封装
  • 封装就是隐藏实现细节,将数据和方法使用语法规则约束(类似private),外部对象无法直接访问数据字段,只能通过所提供的方法进行操作。在面向对象语言中,封装是类 class 提供的特性。
  • Go语言没有类的概念,但提供了结构体的定义,可以将属性字段定义在结构体中,通过实例化结构体对象来访问字段。结构体中不能定义方法,都在类外定义。
  • Go语言中,通过变量名或方法名首字母的大小写来实现类似public和private功能,但在同一个包中,不管首大写或小写都在包内可见,所以在Go语言中,对封装的约束是在包级别的约束,同一个包内无访问限制。
// 包 pkgtest 内容,文件名称 pkgtest.go
package pkgtest

import "fmt"

// 结构体及所有字段外部可直接访问
type NetAddr struct {
	Ip   string
	Port int
}

// 结构体外部可直接访问,字段外部不可访问
type NetAddrs struct {
	ip   string
	port int
}

// 提供外部直接访问的方法
func (c *NetAddrs) SetAddrPort(ip string, port int) {
	c.ip = ip
	c.port = port
}

// 自定义结构体打印信息
func (c *NetAddrs) String() string {
	return fmt.Sprintf("ip: %#v, port: %#v", c.ip, c.port)
}

// main 包 main.go 文件
package main

import (
	"fmt"
	"pkgtest"
)

func main() {
	a := pkgtest.NetAddr{"127.0.0.1", 9080}
	fmt.Printf("a =  ip: %#v, port: %#v\n", a.Ip, a.Port)

	var b pkgtest.NetAddrs
	fmt.Println("b = ", &b)
	b.SetAddrPort("127.0.0.1", 9090)
	fmt.Println("b = ", &b)
}

输出结果
a = ip: “127.0.0.1”, port: 9080
b = ip: “”, port: 0
b = ip: “127.0.0.1”, port: 9090

继承
  • 继承可以提高程序代码复用性,将多个结构体所存在的相同的属性字段和方法提取出来,抽象出一个新的结构体作为基类,其它派生类去继承此类的特性,并且可以扩展自有属性和方法。
  • Go语言中没有继承的概念,通过匿名结构体嵌套来实现继承的效果,与真正的继承存在一些区别。
  • Go语言支持多继承,即在结构体中嵌套多个匿名结构体。
  • 通过嵌入结构体类型实现代码复用和扩展性并不是完全等同于传统面向对象语言中的继承关系。
package main

import "fmt"

type Animal struct {
	name string
}

// 基类方法
func (c Animal) GetName() string {
	return fmt.Sprintf("name: %#v", c.name)
}

type Cat struct {
	Animal // 继承Animal
	id     int
}

// 派生类独有方法
func (c Cat) Voice() {
	fmt.Println("id: ", c.id, ", cat ~~~~~~")
}

func main() {
	ani := Animal{"animal"}
	fmt.Println(ani, ", ", ani.GetName())

	cat := &Cat{Animal{"maomao"}, 10010}
	fmt.Println(cat)

	fmt.Println(cat.GetName())
	cat.Voice()
}

输出结果
{animal} , name: “animal”
&{{maomao} 10010}
name: “maomao”
id: 10010 , cat ~~~~~~

  • 重写基类方法。
package main

import "fmt"

type Animal struct {
	name string
}

// 基类方法
func (c Animal) GetName() string {
	return fmt.Sprintf("Animal name: %#v", c.name)
}

type Cat struct {
	Animal // 继承Animal
}

// 派生类重新基类方法
func (c Cat) GetName() string {
	return fmt.Sprintf("Cat name: %#v", c.name)
}

func main() {
	ani := Animal{"animal"}
	fmt.Println(ani, ", ", ani.GetName())

	cat := Cat{Animal{"cat"}}
	fmt.Println(cat, ", ", cat.GetName())
}

输出结果
{animal} , Animal name: “animal”
{{cat}} , Cat name: “cat”

多态
  • 多态是指一个对象可以具有多种不同的形态或表现形式,也就是同一个方法在不同的对象实例中,行为不同。
  • Go 语言中,没有传统的类和继承的概念,多态性通常使用接口(interface)来实现,由于接口可以引用不同类型的对象,所以通过接口类型可以实现多态。
package main

import "fmt"

// 定义接口
type Animal interface {
	Eat()
}

// 接口实现
type Cat struct {
}

func (c Cat) Eat() {
	fmt.Println("cat eat")
}

type Dog struct {
}

func (c Dog) Eat() {
	fmt.Println("dog eat")
}

// 提供统一接口调用函数
func Invork(a Animal) {
	a.Eat()
}

func main() {
	// 声明接口变量,接收不同的的对象
	var a Animal = Cat{}
	Invork(a)

	a = Dog{}
	Invork(a)
}

输出结果
cat eat
dog eat

反射
  • 反射是指在程序运行时,可以动态的访问和修改任意类型对象的结构和成员。
  • Go 语言中提供 reflect 包提供反射的功能,对于每一个变量都有:Type 和Value 两个属性。
  • 反射三原则:从接口值到反射对象的反射(Reflection goes from interface value toreflection object);从反射对象到接口值的反射(Reflection goes from reflection object to interface value);为了修改反射对象,其值必须可设置(To modify a reflectionobject, the value must be settable)。
Type
  • reflect.Type 是一个接口类型,用于获取变量类型信息,可通过 reflect.TypeOf 函数获取某个变量的类型信息,通过 reflect.ValueOf 函数获取某个变量的值。
package main

import (
	"fmt"
	"reflect"
)

func main() {
	// 定义不同类型的变量
	a := 10
	b := "strings"
	fmt.Printf("a type: %v, b type: %v\n", reflect.TypeOf(a), reflect.TypeOf(b))
	fmt.Printf("a value: %v, b value: %v\n", reflect.ValueOf(a), reflect.ValueOf(b))
}

输出结果
a type: int, b type: string
a value: 10, b value: strings

  • reflect.Type 可以通过命令 go doc reflect.Type 查看其接口定义。
type Type interface {
        Align() int
        FieldAlign() int
        Method(int) Method
        MethodByName(string) (Method, bool)
        NumMethod() int
        Name() string
        PkgPath() string
        Size() uintptr
        String() string
        Kind() Kind
        Implements(u Type) bool
        AssignableTo(u Type) bool
        ConvertibleTo(u Type) bool
        Comparable() bool
        Bits() int
        ChanDir() ChanDir
        IsVariadic() bool
        Elem() Type
        Field(i int) StructField
        FieldByIndex(index []int) StructField
        FieldByName(name string) (StructField, bool)
        FieldByNameFunc(match func(string) bool) (StructField, bool)
        In(i int) Type
        Key() Type
        Len() int
        NumField() int
        NumIn() int
        NumOut() int
        Out(i int) Type
}
  • 反射获取结构体详细信息。
package main

import (
	"fmt"
	"reflect"
)

// 定义结构体
type Cpu struct {
	name string
	id   int
}

func (c Cpu) CpuInfo() {
	fmt.Println("name: ", c.name, ", id: ", c.id)
}

// 继承
type Intel struct {
	Cpu
}

// 组合
type AMD struct {
	cpu   Cpu
	level float32
}

// 声明函数
func TestFunc(i int, s string) error {
	i = 10
	s = "str"
	return nil
}

func main() {
	// 声明结构体变量,打印类型
	cpu := Cpu{"CPU", 10000}
	fmt.Printf("cpu type: %v, kind: %v\n", reflect.TypeOf(cpu), reflect.TypeOf(cpu).Kind())
	intel := &Intel{Cpu{"INTEL", 10001}}
	fmt.Printf("intel type: %v, kind: %v\n", reflect.TypeOf(intel), reflect.TypeOf(intel).Kind())
	amd := AMD{Cpu{"AMD", 10002}, 12.35}
	fmt.Printf("amd type: %v, kind: %v\n", reflect.TypeOf(amd), reflect.TypeOf(amd).Kind())

	fmt.Println("====================================")
	// 打印属性字段与方法数量
	fmt.Printf("cpu field size: %v, method size: %v\n", reflect.TypeOf(cpu).NumField(), reflect.TypeOf(cpu).NumMethod())
	fmt.Printf("intel field size: %v, method size: %v\n", reflect.TypeOf(intel).Elem().NumField(), reflect.TypeOf(intel).NumMethod())
	fmt.Printf("amd field size: %v, method size: %v\n", reflect.TypeOf(amd).NumField(), reflect.TypeOf(amd).NumMethod())
	fmt.Println("====================================")
	// 遍历获取属性字段信息
	for i := 0; i < reflect.TypeOf(amd).NumField(); i++ {
		fmt.Printf("%v\t", reflect.TypeOf(amd).Field(i))
	}
	fmt.Println()
	fmt.Println("====================================")
	// 通过属性字段索引获取信息
	fmt.Println(reflect.TypeOf(amd).FieldByIndex([]int{1}))    // level float32
	fmt.Println(reflect.TypeOf(amd).FieldByIndex([]int{0, 1})) // id int
	fmt.Println("====================================")
	// 遍历获取方法信息
	for i := 0; i < reflect.TypeOf(intel).NumMethod(); i++ {
		n := reflect.TypeOf(intel).Method(i)
		fmt.Printf("Name: %v, Kind: %v, InputSize: %v, OutputSize: %v, Info: %v\t", n.Name, n.Type.Kind(), n.Type.NumIn(), n.Type.NumOut(), n)

		for i := 0; i < n.Type.NumIn(); i++ {
			fmt.Printf("第 %d 个输入参数类型: %s \n", i, n.Type.In(i))
		}

		for i := 0; i < n.Type.NumOut(); i++ {
			fmt.Printf("第 %d 个输出参数类型: %s \n", i, n.Type.Out(i))
		}
	}
	fmt.Println()
	fmt.Println("====================================")
	// 获取函数详细信息
	m := reflect.TypeOf(TestFunc)
	fmt.Printf("m Name: %v, Kind: %v, InputSize: %v, OutputSize: %v\n", m.Name(), m.Kind(), m.NumIn(), m.NumOut())
	for i := 0; i < m.NumIn(); i++ {
		fmt.Printf("第 %d 个输入参数类型: %s \n", i, m.In(i))
	}
	for i := 0; i < m.NumOut(); i++ {
		fmt.Printf("第 %d 个输出参数类型: %s \n", i, m.Out(i))
	}
}

输出结果
cpu type: main.Cpu, kind: struct
intel type: *main.Intel, kind: ptr
amd type: main.AMD, kind: struct
====================================
cpu field size: 2, method size: 1
intel field size: 1, method size: 1
amd field size: 2, method size: 0
====================================
{cpu main main.Cpu 0 [0] false} {level main float32 24 > [1] false}
====================================
{level main float32 24 [1] false}
{id main int 16 [1] false}
====================================
Name: CpuInfo, Kind: func, InputSize: 1, OutputSize: 0, Info: > {CpuInfo func(*main.Intel) <func(*main.Intel) Value> 0} 第 0 个> 输入参数类型: *main.Intel
====================================
m Name: , Kind: func, InputSize: 2, OutputSize: 1
第 0 个输入参数类型: int
第 1 个输入参数类型: string
第 0 个输出参数类型: error

Value
  • 使用 reflect.ValueOf 获取存储的具体值。
  • 使用指令 go doc reflect.Value 查看方法。
func Append(s Value, x ...Value) Value
func AppendSlice(s, t Value) Value
func Indirect(v Value) Value
func MakeChan(typ Type, buffer int) Value
func MakeFunc(typ Type, fn func(args []Value) (results []Value)) Value
func MakeMap(typ Type) Value
func MakeMapWithSize(typ Type, n int) Value
func MakeSlice(typ Type, len, cap int) Value
func New(typ Type) Value
func NewAt(typ Type, p unsafe.Pointer) Value
func ValueOf(i any) Value
func Zero(typ Type) Value
func (v Value) Addr() Value
func (v Value) Bool() bool
func (v Value) Bytes() []byte
func (v Value) Call(in []Value) []Value
func (v Value) CallSlice(in []Value) []Value
func (v Value) CanAddr() bool
func (v Value) CanComplex() bool
func (v Value) CanConvert(t Type) bool
func (v Value) CanFloat() bool
func (v Value) CanInt() bool
func (v Value) CanInterface() bool
func (v Value) CanSet() bool
func (v Value) CanUint() bool
func (v Value) Cap() int
func (v Value) Clear()
func (v Value) Close()
func (v Value) Comparable() bool
func (v Value) Complex() complex128
func (v Value) Convert(t Type) Value
func (v Value) Elem() Value
func (v Value) Equal(u Value) bool
func (v Value) Field(i int) Value
func (v Value) FieldByIndex(index []int) Value
func (v Value) FieldByIndexErr(index []int) (Value, error)
func (v Value) FieldByName(name string) Value
func (v Value) FieldByNameFunc(match func(string) bool) Value
func (v Value) Float() float64
func (v Value) Grow(n int)
func (v Value) Index(i int) Value
func (v Value) Int() int64
func (v Value) Interface() (i any)
func (v Value) InterfaceData() [2]uintptr
func (v Value) IsNil() bool
func (v Value) IsValid() bool
func (v Value) IsZero() bool
func (v Value) Kind() Kind
func (v Value) Len() int
func (v Value) MapIndex(key Value) Value
func (v Value) MapKeys() []Value
func (v Value) MapRange() *MapIter
func (v Value) Method(i int) Value
func (v Value) MethodByName(name string) Value
func (v Value) NumField() int
func (v Value) NumMethod() int
func (v Value) OverflowComplex(x complex128) bool
func (v Value) OverflowFloat(x float64) bool
func (v Value) OverflowInt(x int64) bool
func (v Value) OverflowUint(x uint64) bool
func (v Value) Pointer() uintptr
func (v Value) Recv() (x Value, ok bool)
func (v Value) Send(x Value)
func (v Value) Set(x Value)
func (v Value) SetBool(x bool)
func (v Value) SetBytes(x []byte)
func (v Value) SetCap(n int)
func (v Value) SetComplex(x complex128)
func (v Value) SetFloat(x float64)
func (v Value) SetInt(x int64)
func (v Value) SetIterKey(iter *MapIter)
func (v Value) SetIterValue(iter *MapIter)
func (v Value) SetLen(n int)
func (v Value) SetMapIndex(key, elem Value)
func (v Value) SetPointer(x unsafe.Pointer)
func (v Value) SetString(x string)
func (v Value) SetUint(x uint64)
func (v Value) SetZero()
func (v Value) Slice(i, j int) Value
func (v Value) Slice3(i, j, k int) Value
func (v Value) String() string
func (v Value) TryRecv() (x Value, ok bool)
func (v Value) TrySend(x Value) bool
func (v Value) Type() Type
func (v Value) Uint() uint64
func (v Value) UnsafeAddr() uintptr
func (v Value) UnsafePointer() unsafe.Pointer
  • 通过 reflect.ValueOf() 获取值。
package main

import (
	"fmt"
	"reflect"
)

// 定义结构体
type Cpu struct {
	name string
	id   int
}

func (c Cpu) CpuInfo() {
	fmt.Println("name: ", c.name, ", id: ", c.id)
}

// 继承
type Intel struct {
	Cpu
}

// 组合
type AMD struct {
	cpu   Cpu
	level float32
}

func main() {
	// 声明结构体变量,打印类型fmt.Printf("cpu type: %v, kind: %v\n", reflect.TypeOf(cpu), reflect.TypeOf(cpu).Kind())
	intel := &Intel{Cpu{"INTEL", 10001}}
	amd := AMD{Cpu{"AMD", 10002}, 12.35}

	ri := reflect.ValueOf(intel)
	ra := reflect.ValueOf(amd)

	fmt.Println("intel value: ", ri)
	fmt.Println("amd value: ", ra)
}

输出结果
intel value: &{{INTEL 10001}}
amd value: {{AMD 10002} 12.35}

  • reflect.Type、reflect.Value类型与变量之间的转换。
package main

import (
	"fmt"
	"reflect"
)

// 定义结构体
type Cpu struct {
	name string
	id   int
}

func (c Cpu) CpuInfo() {
	fmt.Println("name: ", c.name, ", id: ", c.id)
}

func Convert(v any) { // 使用 any 接收任意类型的反射变量
	val := reflect.ValueOf(v) // 将 any 类型转成 reflect.Value 类型
	fmt.Println("val: ", val)
	inter := val.Interface() // 将 reflect.Value 类型转成 any 类型
	switch v.(type) {        // 将 any 类型转换为原始变量类型
	case Cpu:
		cpu := inter.(Cpu)
		fmt.Printf("原类型为 %T\n", cpu)
	case *Cpu:
		cpu := inter.(*Cpu)
		fmt.Printf("原类型为 %T\n", cpu)
	}
}

func main() {
	// 声明指针变量、普通变量
	pcpu := &Cpu{"INTEL", 10001}
	cpu := Cpu{"AMD", 10002}

	// 执行转换函数
	Convert(pcpu)
	Convert(cpu)

}

输出结果
val: &{INTEL 10001}
原类型为 *main.Cpu
val: {AMD 10002}
原类型为 main.Cpu

  • 修改变量值,变量可修改的条件:对于基本数据类型变量可获取地址;对于结构体属性必须是可获取地址且字段属性为public(公开的)。
package main

import (
	"fmt"
	"reflect"
)

// 定义结构体
type Cpu struct {
	Name string
	Id   int
}

func (c Cpu) CpuInfo() {
	fmt.Println("名称: ", c.Name, ", 编号: ", c.Id)
}

// 修改字段值
func SetValue(val reflect.Value) {
	fmt.Println("kind: ", val.Kind())
	switch val.Kind() {
	// 此处只处理指针与结构体
	case reflect.Ptr, reflect.Struct:
		for i := 0; i < val.NumField(); i++ {
			kd := val.Field(i)
			switch kd.Kind() { // 判断结构体字段类型
			case reflect.String:
				if kd.CanSet() { // 判断字段值可以设置(改变)
					kd.SetString("change " + kd.String())
				}
			case reflect.Int:
				if kd.CanSet() {
					kd.SetInt(kd.Int() + 10)
				}
			}
		}
	}
}

func Convert(v any) { // 使用 any 接收任意类型的反射变量
	val := reflect.ValueOf(v) // 将 any 类型转成 reflect.Value 类型
	fmt.Println("val: ", val)
	inter := val.Interface() // 将 reflect.Value 类型转成 any 类型
	switch v.(type) {        // 判断传入变量原始类型
	case Cpu: // 结构体对象
		cpu := inter.(Cpu)
		fmt.Printf("原类型为 %T\n", cpu)
		SetValue(val)
		fmt.Println("convert cpu: ", val)
	case *Cpu: // 结构体指针
		cpu := inter.(*Cpu)
		fmt.Printf("原类型为 %T\n", cpu)
		SetValue(val.Elem())
		fmt.Println("convert cpu: ", val)
	}

}

func main() {
	// 声明指针变量、普通变量
	pcpu := &Cpu{"INTEL", 10001}
	cpu := Cpu{"AMD", 10002}

	// 打印原始结构体值
	fmt.Println("pcpu: ", pcpu)
	fmt.Println("cpu:  ", cpu)
	// 执行转换函数
	Convert(pcpu) // 指针传参
	Convert(cpu)  // 值传参

	// 打印转换后的结构体值
	fmt.Println("pcpu: ", pcpu)
	fmt.Println("cpu:  ", cpu)
}

pcpu: &{INTEL 10001}
cpu: {AMD 10002}
val: &{INTEL 10001}
原类型为 *main.Cpu
kind: struct
convert cpu: &{change INTEL 10011}
val: {AMD 10002}
原类型为 main.Cpu
kind: struct
convert cpu: {AMD 10002}
pcpu: &{change INTEL 10011}
cpu: {AMD 10002}

  • 通过反射调用结构体方法和函数。
package main

import (
	"fmt"
	"reflect"
)

// 定义结构体
type Cpu struct {
	Name string
	Id   int
}

func (c *Cpu) CpuInfo() {
	fmt.Println("名称: ", c.Name, ", 编号: ", c.Id)
}

func (c *Cpu) SetInfo(name string, id int) error {
	c.Name = name
	c.Id = id
	fmt.Println("设置名称和编号")
	return nil
}

func Test(a, b int) int {
	return a + b
}

func main() {
	// 声明变量
	cpu := &Cpu{"AMD", 10002}
	fmt.Println("cpu: ", cpu)
	cr := reflect.ValueOf(cpu)

	cr.MethodByName("CpuInfo").Call(nil)
	cr.MethodByName("SetInfo").Call([]reflect.Value{reflect.ValueOf("Intel"), reflect.ValueOf(10001)})
	cr.MethodByName("CpuInfo").Call(nil)
}

输出结果
cpu: &{AMD 10002}
名称: AMD , 编号: 10002
设置名称和编号
名称: Intel , 编号: 10001

动态创建结构体
  • 通过反射特性,可动态创建结构体。
package main

import (
	"fmt"
	"reflect"
)

func main() {
	cpu := []reflect.StructField{
		{
			Name: "Name",
			Type: reflect.TypeOf(""),
		},
		{
			Name: "Id",
			Type: reflect.TypeOf(int(0)),
		},
	}

	fmt.Printf("cpu type: %T, value: %v\n", cpu, cpu)

	StructType := reflect.StructOf(cpu)
	fmt.Printf("StructType type: %T, value: %v\n", StructType, StructType)

	var s1 reflect.Value = reflect.ValueOf(StructType)
	fmt.Printf("s1 type: %T, value: %v\n", s1, s1)
	s := reflect.New(StructType).Elem()
	fmt.Printf("s type: %T, value: %v\n", s, s)

	s.Field(0).SetString("Intel")
	s.Field(1).Set(reflect.ValueOf(10001))
	fmt.Printf("s type: %T, value: %v\n", s, s)
}

输出结果
cpu type: []reflect.StructField, value: [{Name string 0 [] false} {Id int 0 [] false}]
StructType type: *reflect.rtype, value: struct { Name string; Id int }
s1 type: reflect.Value, value: struct { Name string; Id int }
s type: reflect.Value, value: { 0}
s type: reflect.Value, value: {Intel 10001}

起始

Synopsys AXI VIP 从环境搭建到首个验证场景运行 本文详细介绍了Synopsys AXI VIP从环境搭建到首个验证场景运行的全过程,包括VIP安装、示例工程生成、验证环境解析、仿真调试技巧及进阶优化。特别针对AXI协议验证中的常见问题提供了实用解决方案,帮助工程师快速掌握这一SoC验证必备工具。 阅读详情

相关推荐

如何快速获取SAMM、SMIC等主流微表情数据集?完整申请指南(附避坑技巧)

本文提供了获取SAMM、SMIC等主流微表情数据集的完整申请指南,包括申请前的准备工作、分步申请流程、协议谈判技巧以及数据使用与维护策略。特别针对高分辨率动态捕捉和多模态同步数据等热词,帮助研究者高效获取高质量数据集,避免常见陷阱。

weixin_29057163的博客 421

视频教程-桫哥-GOlang-11Linux基础-Go语言

桫哥-GOlang-11Linux基础 多年互联网从业经验; 有丰富的的企业...

weixin_32215529的博客 285

深入解析Unity3D中PostLateUpdate突然占用大量时间的原因

在Unity3D的生命周期中,是一个在LateUpdate之后被调用的方法。它通常用于处理一些需要在所有更新(包括物理更新和动画更新)之后进行的逻辑。由于它在游戏循环的后期阶段被调用,因此它通常用于处理与渲染直接相关的任务,如相机调整、UI更新等。突然占用大量时间的问题可能由多种原因引起,包括复杂的逻辑处理、频繁的资源加载、不恰当的渲染优化、插件或第三方库的副作用以及内存泄漏或垃圾回收等。为了解决这个问题,开发者需要仔细审查和优化中的代码,同时利用Unity提供的工具来监控和分析游戏性能。

Yori_22的博客 979

100天精通Golang(基础入门篇)——第11天:深入解析Go语言中的切片(Slice)及常用函数应用

本文是《100天精通Golang(基础入门篇)——第11天:切片(Slice)》,将详细介绍切片的概念、语法、修改、以及len()、cap()、append()和copy()函数的使用。读者将通过学习本文深入了解Golang中切片的使用方法和常用函数的功能。切片(Slice)是Golang中非常重要的数据结构,它可以动态地调整大小,并且常用于处理集合的情况。在本文中,我们将系统地介绍切片的概念、语法和修改方式,并逐一讲解len()、cap()、append()和copy()函数的用法。

猫头虎技术团队:授渔优于赠鱼,兴趣引领智慧,探索之乐尤显珍贵。商务合作+:Libin9iOak ,万粉变现+:优快云WF,猫头虎承诺每年免费为100名C站创作者做账号流量诊断服务!全网搜:猫头虎技术团队,点击文章底部名片或直接私信我一切皆可谈,快找虎哥! 5万+

人形机器人电路板和算法分析

人形机器人电路板与算法深度剖析 电路板领域:人形机器人电子系统分为计算、驱动、感知、能源、通信五大模块。主控板采用高性能SoM(如NVIDIA Jetson AGX Orin),需满足严格电源完整性(PDN)与信号完整性(SI)要求;关节驱动板集成MCU、GaN/SiC功率器件及高精度编码器接口,采用刚柔结合PCB以适应狭小空间。挑战包括热-振可靠性(85°C/10G振动)、高密度互连(3mil线宽)及EMC兼容性。 算法领域:运动控制依赖MPC(模型预测控制)与强化学习(RL),实现实时动态平衡;感知算法

几十年资深高级架构师,技术专家的技术笔记。专注C、Java、Python、微服务、云原生、AI工程化及高并发系统分布式架构实战,分享源码剖析、性能调优与架构治理经验。 306

姿态传感器/陀螺仪之LSM6DSLTR应用驱动程序设计

* LSM6DSLTR I2C地址(SA0=1) *//* 初始化LSM6DSLTR传感器(加速度计±2g,陀螺仪±250°/s) *//* 加速度计灵敏度 *//* 角速度值(°/s) *//* I2C句柄 *//* 陀螺仪灵敏度 *//* 加速度值(g) *//* 温度值(°C) *//* 设备地址 *//* IF_INC=1: 自动增量地址 *//* 10Hz采样率 *//* 配置I2C1引脚:PB6->SCL, PB7->SDA *//* 转换为实际温度值(°C),参考手册中温度计算公式 */

corlin6688的博客 395

Go基础11-理解Go语言的包导入

Go语言是使用包(package)作为基本单元来组织源码的,可以说一个Go程序就是由一些包链接在一起构建而成的。虽然与Java、Python等语言相比这算不上什么创新,但与祖辈C语言的头文件包含机制相比则是“先进”了许多。编译速度快是这种“先进性”的一个突出表现,即便每次编译都是从零开始。Go语言的这种以包为基本构建单元的构建模型使依赖分析变得十分简单,避免了C语言那种通过头文件分析依赖的巨大开销。Go编译速度快的原因具体体现在以下三方面。

小海聊智造 669

基于STM32F103设计的智能门锁(支持多种开锁解锁方式)

这个智能锁模型是基于STM32平台开发的,支持多种开锁方式。其中,一种是使用RC522射频卡读卡器读取IC卡卡号和内部数据,并验证身份后开锁;另一种是通过连接蓝牙地址来确认业主身份,实现了蓝牙自动开锁功能;最后一种是通过ESP8266连接腾讯云物联网平台,并且用户可以通过微信小程序“腾讯连连”进行远程开锁和关锁。这样,用户就可以选择最方便的方式来进行开锁操作了。

3万+

11-Go基础:接口

go的接口与多态

qq23001186的博客 248

22h2版本的win10安装Docker Desktop时页面空白

摘要:Windows10 22H2系统重装Docker时出现安装界面卡死问题,通过管理员CMD执行静默安装命令解决。命令指定了WSL-2后端及多个自定义数据存储路径(安装目录、Hyper-V数据、Windows容器数据、WSL数据),安装需等待几分钟。最终验证安装成功。

猿小白的博客 659

coredump文件的原理是啥

Core Dump(核心转储)是操作系统在程序崩溃(如段错误、非法指令等)时自动生成的一个文件,它包含了程序崩溃瞬间的。通过 core dump,开发者可以像“时间回溯”一样检查程序崩溃瞬间的状态,是调试复杂问题的利器!终止时,Linux 内核会生成 core 文件。不会生成 core dump,因为它们是“优雅终止”信号。这样 core 文件会直接压缩存储,节省磁盘空间。的文件(类似可执行文件),可以用。Core 文件本质上是一个。

二进制君 383

golang 示例测试example_Golang基础入门11 | Testing

软件测试编写软件,在发布软件之前或之后都可能发现错误。 软件中发生的错误可能是错误,漏洞和其他类似的东西。 可以通过测试软件本身来发现软件中的许多潜在错误。 软件测试不仅要确保软件的正确性,而且还要确保软件符合用户的要求。Go中的测试在Go中测试软件可以通过创建扩展名为_test.go的文件来完成。 该文件必须与需要测试的对象位于同一程序包中。 要在测试文件中创建测试,请使用Test ..(t *...

weixin_36269709的博客 391

【WRF工具】WRF 模型输出可视化工具 RIP4

【WRF工具】WRF 模型输出可视化工具 RIP4

WW、forever的博客 1594

Golang基础_11-并发concurrency

目录 注意事项 计策一:给channel加buffer 计策二:引入sync包 select 例子:用goroutine实现发送接收数条消息 注意事项 goroutine只是官方的超级线程池 高并发性:占用内存小,创建销毁...

161

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

go语言基础11——接口

接口是一种类型,一种抽象的类型。 接口(interface)定义了一个对象的行为规范,只定义规范不实现,由具体的对象来实现规范的细节。 接口 本章学习目标 了解为什么需要接口以及接口的特点 掌握接口的声明和使用 掌握接口值的概念 掌握空接口的特点及其使用场景 在Go语言中接口(interface)是一种类型,一种抽象的类型。相较于之前章节中讲到的那些具体类型(字符串、切片、结构体等)更注重“我是谁”,接口类型更注重“我能做什么”的问题。接口类型就像是一种约定——概括了一种类型应该具备哪些方法,

一蓑烟雨任平生 1153

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

11.Go语言基础之包

Go语言中支持模块化的开发理念,在Go语言中使用包(package)来支持代码模块化和代码复用。一个包是由一个或多个Go源码文件(.go结尾的文件)组成,是一种高级的代码复用方案,Go语言为我们提供了很多内置包,如fmt、os、io等。例如,在之前的章节中我们频繁使用了fmt这个内置包。") }上面短短的几行代码就涉及到了如何定义包以及如何引入其它包两个内容,接下来我们依次介绍一下它们。我们可以根据自己的需要创建自定义包。一个包可以简单理解为一个存放.go文件的文件夹。该文件夹下面的所有.go。

鹿晓鹏的博客 657

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

一、Go基础知识11、切片详解

Go语言,切片,定义、初始化、数据访问、添加多个元素到切片、删除与拷贝,切片的基本原理

风不归的乐园 1347

go基础类型11——goto

package main import ( "fmt" ) func main() { fmt.Println("test1") goto End //可以用在任何地方 fmt.Println("test2") End: fmt.Println("test end") }

www_dong的博客 259

11Go语言基础之结构体

本文是李文周的博客go语言学习之路的目录提要版,方便复习查看使用,原文参见文章连接: https://www.liwenzhou.com/posts/Go/go_menu/ Go语言中没有“类”的概念,也不支持“类”的继承等面向对象的概念。Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性。 结构体总结 类型定义和类型别名的区别 //类型定义 type NewInt int ...

weixin_42426385的博客 259

go基础-11.接口

接口是一组仅包含方法名、参数、返回值的未具体实现的方法的集合接口本身不能绑定方法接口是值类型,保存的是:值+原始类型实现接口:一个类型实现了接口的所有方法即实现了该接口。

枫枫知道的个人博客 202

Golang基础--11--并发concurrency

目录 目录

ListentTome的博客 444

11golang基础-defer语句调用顺序

golang学习笔记-defer语句调用顺序

FISH 174

41_Go基础_1_11 switch

【代码】41_Go基础_1_11 switch。

学无止境 143

go语言学习资源

方式一:尚硅谷官网下载:www.atguigu.com/download.shtml。【视频及配套资料下载】

优快云_YJX的博客 455

【搞定Go语言】第2天11:Go语言基础之包

在工程化的Go语言开发项目中,Go语言的源码复用是建立在包(package)基础之上的。本文介绍了Go语言中如何定义包、如何导出包的内容及如何导入其他包。 Go语言的包(package) 包介绍 包(package)是多个Go源码的集合,是一种高级的代码复用方案,Go语言为我们提供了很多内置包,如fmt、os、io等。 定义包 我们还可以根据自己的需要创建自己的包。一个包可以简单理解为一个存放.go文件的文件夹。 该文件夹下面的所有go文件都要在代码的第一行添加如下代码,声明该文件归属的包。 package

就叫一片白纸的博客 263

Go基础编程 - 11 - 函数(func)

Go语言函数详解,匿名函数、闭包、递归、延迟调用、高阶函数等。

2013
上一篇: Golang基础-10
下一篇: Golang基础-12
无夜_
博客等级 码龄7年 2916粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值