go中的结构体

杭电oj2023题题目详解(Java版) 杭电oj2023题详解 阅读详情

结构体的定义

以学生结构体为例,如下:

type Student struct {
    name string
    age  int
}

同类型的可以写在一行:

type Student struct {
    name,course string
    age  int
}

结构体初始化

方法1:使用var关键字

package main

import "fmt"

type Student struct {
    name string
    age  int
}

func main() {
    var s Student
    fmt.Printf("s=%#v\n", s) 
}

方法2:使用值或键值对初始化

方法2.1:使用值初始化写法

s:= Student{
    "cc",
    18,
}

如果{}在一行,逗号可以省略

s:=Student{"cc",18}

方法2.2:使用键值对初始化写法

s:=Student{
    name:"cc",
    age:18,
}

方法2.3:对结构体指针进行键值对初始化

s:=&Student{
    name:"cc",
    age:18,
}

demo:

package main

import "fmt"

type Student struct {
    name string
    age  int
}

func main() {
    //方法1
    var s=Student{
        name:"cc",
        age:18,
    }
    //方法2.1
    s:=Student{
        "cc",
        18,
    }
    
    //方法2.2
    s:=Student{
        name:"cc",
        age:18,
    }
    fmt.Printf("s=%#v\n", s) 
    //方法2.3:结构体指针
    s:=&Student{
        name:"cc",
        age:18,
    }
    fmt.Printf("s=%#v\n", s) 
    
}

方法3:给结构体成员赋值的方式进行初始化

demo

package main

import (
    "fmt"
)

type Student struct {
    name string
    age  int
}

func main() {
    var s Student
    fmt.Printf("s=%v\n", s)

    s.name = "cc"
    s.age = 18
    fmt.Printf("p1=%v\n", s)
    fmt.Printf("p1=%#v\n", s)
}

匿名结构体与结构体的匿名字段

在一些临时数据结构等场景下可以使用匿名结构体

import (
    "fmt"
)

func main() {
    var user struct {
        Name string
        Age  int
    }
    user.Name = "pprof.cn"
    user.Age = 18
    fmt.Printf("%#v\n", user)
}

输出结果:

struct { Name string; Age int }{Name:"pprof.cn", Age:18}

结构体的字段定义时可以没有字段名,这种字段被称为匿名字段

package main

import (
    "fmt"
)

//Person 结构体
type Person struct {
    string
    int
}

func main() {
    p1 := Person{
        "pprof.cn",
        18,
    }
    fmt.Printf("%#v\n", p1)        //main.Person{string:"pprof.cn", int:18}
    fmt.Println(p1.string, p1.int) //pprof.cn 18
}

匿名字段 默认采用类型名作为字段名,结构体要求字段名称必须唯一,因此一个结构体中 同种类型的匿名字段只能有一个 。

结构体指针

除了上面几种实例化结构体方式,还可以通过new实例化结构体,返回指向结构体的指针

package main

import (
    "fmt"
)

type person struct {
    name string
    city string
    age  int8
}

func main() {
    var p2 = new(person)
    fmt.Printf("%T\n", p2)     
    fmt.Printf("p2=%#v\n", p2) 
}

输出结果:

*main.person
p2=&main.person{name:"", city:"", age:0}

Go语言中支持对结构体指针直接使用.来访问结构体的成员

package main

import (
    "fmt"
)

type person struct {
    name string
    city string
    age  int8
}

func main() {
    var p2 = new(person)  //p2 是一个结构体指针
    p2.name = "测试"      //对结构体指针直接使用`.`来访问结构体的成员
    p2.age = 18
    p2.city = "北京"
    fmt.Printf("p2=%#v\n", p2)
}

输出结果:

p2=&main.person{name:"测试", city:"北京", age:18}

p2.name = "测试"其实在底层是(*p2).name = "测试",这是Go语言帮我们实现的语法糖。

取结构体的地址实例化

使用&对结构体变量进行取地址操作相当于对该结构体类型进行了一次 new 实例化操作。

package main

import (
    "fmt"
)

type person struct {
    name string
    city string
    age  int8
}

func main() {
    p3 := &person{}
    fmt.Printf("%T\n", p3)     //*main.person
    fmt.Printf("p3=%#v\n", p3) //p3=&main.person{name:"", city:"", age:0}
    p3.name = "博客"
    p3.age = 30
    p3.city = "成都"
    fmt.Printf("p3=%#v\n", p3) //p3=&main.person{name:"博客", city:"成都", age:30}
}

输出结果:

*main.person
p3=&main.person{name:"", city:"", age:0}
p3=&main.person{name:"博客", city:"成都", age:30}

结构体作为函数参数

  1. 实例1:将结构体作为函数参数
package main

import "fmt"

type Books struct {
    title   string
    author  string
    subject string
    book_id int
}

func main() {
    var Book1 Books /* 声明 Book1 为 Books 类型 */
    var Book2 Books /* 声明 Book2 为 Books 类型 */

    /* book 1 描述 */
    Book1.title = "Go 语言"
    Book1.author = "www.runoob.com"
    Book1.subject = "Go 语言教程"
    Book1.book_id = 6495407

    /* book 2 描述 */
    Book2.title = "Python 教程"
    Book2.author = "www.runoob.com"
    Book2.subject = "Python 语言教程"
    Book2.book_id = 6495700

    /* 打印 Book1 信息 */
    printBook(Book1)

    /* 打印 Book2 信息 */
    printBook(Book2)
}

func printBook(book Books) {
    fmt.Printf("Book title : %s\n", book.title)
    fmt.Printf("Book author : %s\n", book.author)
    fmt.Printf("Book subject : %s\n", book.subject)
    fmt.Printf("Book book_id : %d\n", book.book_id)
}

输出结果:

Book title : Go 语言
Book author : www.runoob.com
Book subject : Go 语言教程
Book book_id : 6495407
Book title : Python 教程
Book author : www.runoob.com
Book subject : Python 语言教程
Book book_id : 6495700

实例2:将结构体指针作为函数参数

package main

import "fmt"

type Books struct {
    title   string
    author  string
    subject string
    book_id int
}

func main() {
    var Book1 Books /* 声明 Book1 为 Books 类型 */
    var Book2 Books /* 声明 Book2 为 Books 类型 */

    /* book 1 描述 */
    Book1.title = "Go 语言"
    Book1.author = "www.runoob.com"
    Book1.subject = "Go 语言教程"
    Book1.book_id = 6495407

    /* book 2 描述 */
    Book2.title = "Python 教程"
    Book2.author = "www.runoob.com"
    Book2.subject = "Python 语言教程"
    Book2.book_id = 6495700

    /* 打印 Book1 信息 */
    //地址就是一个指针,指针的实质就是一个地址
    printBook(&Book1)

    /* 打印 Book2 信息 */
    printBook(&Book2)
}
func printBook(book *Books) {
    fmt.Printf("Book title : %s\n", book.title)
    fmt.Printf("Book author : %s\n", book.author)
    fmt.Printf("Book subject : %s\n", book.subject)
    fmt.Printf("Book book_id : %d\n", book.book_id)
}

结构体内存布局

结构体内存布局是连续的

package main

import "fmt"

type test struct {
    a int8
    b int8
    c int8
    d int8
}

func main() {
    n := test{
        1, 2, 3, 4,
    }
    fmt.Printf("n.a %p\n", &n.a)
    fmt.Printf("n.b %p\n", &n.b)
    fmt.Printf("n.c %p\n", &n.c)
    fmt.Printf("n.d %p\n", &n.d)
}

输出结果:

n.a 0xc00000a198
n.b 0xc00000a199
n.c 0xc00000a19a
n.d 0xc00000a19b

构造函数

构造函数是一种特殊的函数,用来在对象实例化的时候初始化对象的成员变量。

package main

import "fmt"

type person struct {
    name string
    city string
    age  int8
}

func main() {
    p9 := newPerson("pprof.cn", "测试", 90)
    fmt.Printf("%#v\n", p9)

}

//构造函数,用于初始化结构体person
func newPerson(name, city string, age int8) *person {
    return &person{
        name: name,
        city: city,
        age:  age,
    }
}

输出结果:

&main.person{name:"pprof.cn", city:"测试", age:90}

方法和接收器

1、为结构体添加方法

package main

type Bag struct {
    items []int
}

//定义在背包结构体上的名为Insert的方法
func (b *Bag) Insert(itemid int) {
    b.items = append(b.items, itemid)
}
func main() {
    b := new(Bag)
    //在结构体b上调用方法
    b.Insert(1001)
}

2、接收器——方法作用的对象

2、1指针类型的接收器

指针类型的接收器由一个结构体的指针组成,更接近于面向对象中的 this 或者 self。

由于指针的特性,调用方法时,修改接收器指针的任意成员变量,在方法结束后,修改都是有效的。

在下面的例子,使用定义一个 Property 结构体,为 Property 添加 SetValue() 方法以封装设置属性的过程,通过属性的 Value() 方法可以重新获得属性的数值,使用属性时,通过 SetValue() 方法的调用,可以达成修改属性值的效果。

package main
import "fmt"
// 定义结构体 Property 
type Property struct {
    value int  // 属性值
}
// 设置 Property 值
func (p *Property) SetValue(v int) {
    // 修改p的成员变量
    p.value = v
}
// 取 Property 值
func (p *Property) Value() int {
    return p.value
}
func main() {
    // 实例化 Property 
    p := new(Property)
    // 设置值
    p.SetValue(100)
    // 打印值
    fmt.Println(p.Value())
}

2、2 非指针类型的接收器

当方法作用于值类型接收者时,Go语言会在代码运行时将接收者的值复制一份。在值类型接收者的方法中可以获取接收者的成员值,但修改操作只是针对副本,无法修改接收者变量本身。需要辅以 return+赋值 实现真正的修改。

package main
import (
    "fmt"
)
// 定义点结构
type Point struct {
    X int
    Y int
}
// 非指针接收器的加方法
func (p Point) Add(other Point) Point {
    // 成员值与参数相加后返回新的结构体
    return Point{p.X + other.X, p.Y + other.Y}
}
func main() {
    // 初始化点
    p1 := Point{1, 1}
    p2 := Point{2, 2}
    // 与另外一个点相加
    result := p1.Add(p2)
    // 输出结果
    fmt.Println(result)
}

输出结果:

{3 3}

由于例子中使用了非指针接收器,Add() 方法变得类似于只读的方法,Add() 方法内部不会对成员进行任何修改。

指针和非指针接收器的使用场景

在计算机中,小对象由于值复制时的速度较快,所以适合使用非指针接收器。大对象因为复制性能较低,适合使用指针接收器,在接收器和参数间传递时不进行复制,只是传递指针。

什么时候应该使用指针类型接收者?

需要修改接收者中的值接收者是拷贝代价比较大的大对象保证一致性,如果有某个方法使用了指针接收者,那么其他的方法也应该使用指针接收者。

嵌套结构体

一个结构体中可以嵌套包含另一个结构体或结构体指针

package main

import (
    "fmt"
)

//Address 地址结构体
type Address struct {
    Province string
    City     string
}

//User 用户结构体
type User struct {
    Name    string
    Gender  string
    Address Address
}

func main() {
    user1 := User{
        Name:   "pprof",
        Gender: "女",
        Address: Address{
            Province: "黑龙江",
            City:     "哈尔滨",
        },
    }
    fmt.Printf("user1=%#v\n", user1) //user1=main.User{Name:"pprof", Gender:"女", Address:main.Address{Province:"黑龙江", City:"哈尔滨"}}
}

输出结果:

user1=main.User{Name:"pprof", Gender:"女", Address:main.Address{Province:"黑龙江", City:"哈尔滨"}}

嵌套匿名结构体

package main

import (
    "fmt"
)

//Address 地址结构体
type Address struct {
    Province string
    City     string
}

//User 用户结构体
type User struct {
    Name    string
    Gender  string
    Address //匿名结构体
}

func main() {
    var user2 User
    user2.Name = "pprof"
    user2.Gender = "女"
    user2.Address.Province = "黑龙江"   //通过匿名结构体.字段名访问
    user2.City = "哈尔滨"               //可以直接访问匿名结构体的字段名
    fmt.Printf("user2=%#v\n", user2) //user2=main.User{Name:"pprof", Gender:"女", Address:main.Address{Province:"黑龙江", City:"哈尔滨"}}
}

输出结果:

user2=main.User{Name:"pprof", Gender:"女", Address:main.Address{Province:"黑龙江", City:"哈尔滨"}}

当访问结构体成员时会先在结构体中查找该字段,找不到再去匿名结构体中查找。

嵌套结构体的字段名冲突

嵌套结构体内部可能存在相同的字段名。这个时候为了避免歧义需要指定具体的内嵌结构体的字段。

package main

import (
    "fmt"
)

//Address 地址结构体
type Address struct {
    Province   string
    City       string
    CreateTime string
}

//Email 邮箱结构体
type Email struct {
    Account    string
    CreateTime string
}

//User 用户结构体
type User struct {
    Name   string
    Gender string
    Address
    Email
}

func main() {
    var user3 User
    user3.Name = "pprof"
    user3.Gender = "女"
    // user3.CreateTime = "2019" //ambiguous selector user3.CreateTime
    user3.Address.CreateTime = "2000" //指定Address结构体中的CreateTime
    user3.Email.CreateTime = "2000"   //指定Email结构体中的CreateTime
    fmt.Printf("user3=%#v\n", user3)
}

输出结果:

user3=main.User{Name:"pprof", Gender:"女", Address:main.Address{Province:"", City:"", CreateTime:"2000"}, Email:main.Email{Account:"", CreateTime:"2000"}}

如果直接使用user3.CreateTime = "2000"会报错:ambiguous selector user3.CreateTime

结构体的继承

package main

import (
    "fmt"
)

//动物结构体
type Animal struct {
    name string
}


//动物结构体的move方法
func (a *Animal) move() {
    fmt.Printf("%s会动!\n", a.name)
}

//狗结构体
type Dog struct {
    Feet    int8
    *Animal //通过嵌套匿名结构体实现继承
}

func (d *Dog) wang() {
    fmt.Printf("%s会汪汪汪~\n", d.name)
}

func main() {
    d1 := &Dog{
        Feet: 4,
        Animal: &Animal{ //注意嵌套的是结构体指针
            name: "乐乐",
        },
    }
    d1.wang() 
    d1.move() 
}

输出结果:

乐乐会汪汪汪~
乐乐会动!

结构体与JSON序列化

什么是对象序列化呢?

序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。

通俗讲呢:对象序列化就是指将对象的状态转换为字符串。

Json语法规则:

  • 数据在键值对中
  • 数据由逗号分隔
  • 花括号保存对象
  • 方括号保存数组

json格式1:

{ "firstName":"John" , "lastName":"Doe" }

json格式2:

{
    "employees": [
        { "firstName":"John" , "lastName":"Doe" },
        { "firstName":"Anna" , "lastName":"Smith" },
        { "firstName":"Peter" , "lastName":"Jones" }
    ]
}

json格式3:

var employees = [
    { "firstName":"Bill" , "lastName":"Gates" },
    { "firstName":"George" , "lastName":"Bush" },
    { "firstName":"Thomas" , "lastName": "Carter" }
];

demo:

package main

import (
    "encoding/json"
    "fmt"
)

//Student 学生
type Student struct {
    ID     int
    Gender string
    Name   string
}

//Class 班级
type Class struct {
    Title    string
    Students []*Student
}

func main() {
    c := &Class{
        Title:    "101",
        Students: make([]*Student, 0, 200),
    }
    for i := 0; i < 10; i++ {
        stu := &Student{
            Name:   fmt.Sprintf("stu%02d", i),
            Gender: "男",
            ID:     i,
        }
        c.Students = append(c.Students, stu)
    }
    //JSON序列化:结构体-->JSON格式的字符串
    data, err := json.Marshal(c)
    if err != nil {
        fmt.Println("json marshal failed")
        return
    }
    fmt.Printf("json:%s\n", data)
    //JSON反序列化:JSON格式的字符串-->结构体
    str := `{"Title":"101","Students":[{"ID":0,"Gender":"男","Name":"stu00"},            {"ID":1,"Gender":"男","Name":"stu01"},{"ID":2,"Gender":"男","Name":"stu02"},{"ID":3,"Gender":"男","Name":"stu03"},{"ID":4,"Gender":"男","Name":"stu04"},{"ID":5,"Gender":"男","Name":"stu05"},{"ID":6,"Gender":"男","Name":"stu06"},{"ID":7,"Gender":"男","Name":"stu07"},{"ID":8,"Gender":"男","Name":"stu08"},{"ID":9,"Gender":"男","Name":"stu09"}]}`
    c1 := &Class{}
    err = json.Unmarshal([]byte(str), c1)
    if err != nil {
        fmt.Println("json unmarshal failed!")
        return
    }
    fmt.Printf("%#v\n", c1)
}

输出结果:

json:{"Title":"101","Students":[{"ID":0,"Gender":"男","Name":"stu00"},{"ID":1,"Gender":"男","Name":"stu01"},{"ID":2,"Gender":"男","Name":"stu02"},{"ID":3,"Gender":"男","Name":"stu03"},{"ID":4,"Gender":"男","Name":"stu04"},{"ID":5,"Gender":"男","Name":"stu05"},{"ID":6,"Gender":"男","Name":"stu06"},{"ID":7,"Gender":"男","Name":"stu07"},{"ID":8,"Gender":"男","Name":"stu08"},{"ID":9,"Gender":"男","Name":"stu09"}]}
&main.Class{Title:"101", Students:[]*main.Student{(*main.Student)(0xc0000749c0), (*main.Student)(0xc0000749f0), (*main.Student)(0xc000074a20), (*main.Student)(0xc000074a50), (*main.Student)(0xc000074ab0), (*main.Student)(0xc000074ae0), (*main.Student)(0xc000074b10), (*main.Student)(0xc000074b40), (*main.Student)(0xc000074b70), (*main.Student)(0xc000074ba0)}}

结构体标签(Tag)

Tag是结构体的元信息,可以在运行的时候通过反射的机制读取出来。

Tag在结构体字段的后方定义,由一对反引号包裹起来,具体的格式如下:

`key1:"value1" key2:"value2"`

结构体标签由一个或多个键值对组成。键与值使用冒号分隔,值用双引号括起来。键值对之间使用一个空格分隔。 注意事项: 为结构体编写Tag时,必须严格遵守键值对的规则。结构体标签的解析代码的容错能力很差,一旦格式写错,编译和运行时都不会提示任何错误,通过反射也无法正确取值。例如不要在key和value之间添加空格。

例如我们为Student结构体的每个字段定义json序列化时使用的Tag:

package main

import (
    "encoding/json"
    "fmt"
)

//Student 学生
type Student struct {
    ID     int    `json:"id"` //通过指定tag实现json序列化该字段时的key
    Gender string //json序列化是默认使用字段名作为key
    name   string //私有不能被json包访问
}

func main() {
    s1 := Student{
        ID:     1,
        Gender: "女",
        name:   "pprof",
    }
    data, err := json.Marshal(s1)
    if err != nil {
        fmt.Println("json marshal failed!")
        return
    }
    fmt.Printf("json str:%s\n", data) 
}

输出结果:

json str:{"id":1,"Gender":"女"}

FDTD Solutions-入射波长模式 经常在文献中看到仿真光源使用TM/TE模式,这个确定是十分必要的,决定了仿真结果。 但是也不能局限于选择TM/TE,因为不同领域、不同软件之间的使用习惯和命名可能不同。并且在现代光波导器件中,几乎全部 都是混合模式,或者称之为quasi-TE(准TE模式)和quasi-TM(准TM模式),多数情况下都简称为TE模式和TM模式。要知道 到底是TE模式还是TM模式,需要查看其电场的主分量(即振幅... 阅读详情

相关推荐

单细胞分析进阶:sctransform标准化在Seurat中的实战解析

本文深入解析了sctransform标准化方法在Seurat单细胞分析中的实战应用。通过对比传统对数标准化,sctransform能更有效地建模并剔除技术噪音,提升数据质量。文章提供了从环境配置、数据准备、核心参数解析到完整流程整合的详细指南,并针对常见问题给出解决方案,帮助研究者获得更清晰的细胞分群和更可靠的差异表达结果。

weixin_29248313的博客 149

Go 函数名之前的括号中的内容的作用

Go语言函数声明语法:函数名之前括号中的内容_冰雪满天的博客-优快云博客_go函数名前的参数

是鲤鱼啊 1105

国科大 雁栖湖校区 研一上 课程避坑与生存指南

本文为国科大雁栖湖校区研一新生提供全面的课程避坑与生存指南,涵盖选课策略、核心课程学习技巧、校园生活攻略及心态管理。重点解析算法设计与分析、人工智能原理等硬核课程的学习方法,并分享食堂、住宿、自习室等实用生存技巧,帮助新生高效适应研究生生活。

weixin_29304985的博客 299

Go语言-结构体详解

go语言结构体详细解析,详细讲解定义,访问,使用结构体,以及结构体指针。

玄衣手记 486

[cryoEM] cryoSPARC简介

cryoSPARC系统结构概述 cryoSPARC是一个后端和前端高性能计算软件系统,为单颗粒冷冻电镜提供数据处理和图像分析能力,以及丰富的基于浏览器的用户截面和命令行工具。 Master-worker模式 系统基于主用户模式。 主进程(web应用,核心应用程序和MongoDB数据库)一起在主节点上运行。主节点需要相对轻量级的资源(2+ CPU< 16GB+ RAM)。 工作程序进程可以在具有GPU的任何可用节点上生成,负责所有实际计算和数据处理,并由主节点调度。注意:同一节点可以同时充当主节点和辅

进阶中的程序员吃吃的博客 7795

CarPlay无线连接开发实战:从蓝牙EIR查询到iAP2认证的完整代码逻辑梳理

本文详细解析了无线CarPlay连接开发的完整流程,从蓝牙EIR查询到iAP2认证的代码实现。重点介绍了蓝牙握手、WiFi Beacon帧配置、热点信息准备等关键环节的实战技巧,帮助开发者快速搭建稳定可靠的无线CarPlay连接系统。

weixin_31534091的博客 318

Go学习笔记(5)Go编程基础

文章目录写在前面Go标识符Go关键字Go注释方法Go大括号使用规则Go程序一般结构Go的package(包)导入用法可见性规则 写在前面      本文主要介绍关于Go语言编程的一些基础知识,包括Go编程的一些规则、格式、标识符、关键字、包导入、一般结构等内容。 Go标识符     在Go中,几乎所有的东西(变量、常量、函数…)都会有一个标识符,关于Go中标识符的命名规则,要注意以下几点: 区分大小写 有效的标识符必须以字母(可以适用任何UTF-8编码的字符)或者下划线开头 以下是无效的标识符 1ab(

D调的第七章博客 1011

用Zotero+B站Kimi,我如何把一篇顶会论文快速做成组会PPT(含完整提示词)

本文介绍如何利用Zotero和Kimi快速将顶会论文转化为组会PPT,提升学术汇报效率。通过Zotero的文献管理插件和Kimi的AI提炼技术,实现从论文阅读到PPT生成的全流程自动化,帮助研究者在90分钟内完成高质量汇报准备。

weixin_30955617的博客 499

Go语言基础(八)—— Go语言变量作用域、Go语言数组、Go语言指针

Go语言变量作用域 作用域为已声明标识符所表示的常量、类型、变量、函数或包在源代码中的作用范围。  Go 语言中变量可以在三个地方声明: • 函数内定义的变量称为局部变量  • 函数外定义的变量称为全局变量  • 函数定义中的变量称为形式参数  接下来让我们具体了解局部变量、全局变量和形式参数。  局部变量 在函数体内声明的变量称之为局部变量,它们的作用域只在函数体内,参数和返回值变...

The_Reader的博客 507

robomimic实验复现全流程:从数据集下载到训练视频生成

本文详细介绍了机器人模仿学习项目RoboMimic的完整实验复现流程。内容涵盖从使用Conda创建Python 3.8隔离环境、安装RoboSuite仿真器和MuJoCo物理引擎,到下载并探索数据集、配置与启动模型训练,最后进行模型评估和生成策略执行视频。该指南旨在帮助研究者和开发者高效搭建实战环境,规避常见问题,快速验证算法或应用于实际场景。

weixin_29089057的博客 517

基于SOLIDWORKS API的工业级插件开发指南

SOLIDWORKS API是基于COM技术的一套开发接口,支持C#、VB.NET等语言,用于自动化建模、属性管理、界面定制等功能。

举世誉之而不加劝,举世非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。 2744

go基础之函数使用小技巧(函数调用时加括号与不加括号的区别)

go基础之函数使用小技巧(函数调用时加括号与不加括号的区别)

qq_43227733的博客 2874

基于 YOLO26 的车辆实时检测与计数系统

本文提出了一种基于YOLO26的车辆实时检测与计数系统。系统采用CSPDarknet53作为主干网络,结合特征金字塔和多尺度预测实现高精度车辆检测。通过DeepSORT算法进行目标跟踪,并统计车辆数量、行驶方向和交通流量。实验表明,该系统在保持实时性能的同时,检测精度达到92.3%,可有效应用于智能交通管理。系统采用Python实现,支持GPU加速,适用于多种交通场景下的车辆监测需求。

一键难忘的博客 907

golang中的结构体

在go语言中有一些基本的数据类型,比如string、int、bool等数据类型,可以用type关键字自定义类型。语法: type comstomInt int将comstomInt 定义为int类型,通过type关键字的定义,comstomInt就是一种新的类型,comstomInt和int不是同一类型,它具有int的特性。类型别名与自定类型表面上看只有一个等号的差异,我们通过下面的这段代码来理解他们之间的却别。结果显示a的类型时int类型。

u012941592的博客 1149

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

100天精通Golang(基础入门篇)——第18天:深入解析Go语言中的结构体

在第18天的学习中,我们将深入探索Go语言中的结构体,这是Go语言中一个非常核心的概念。结构体为我们提供了一种封装多个不同类型数据的方法,是构建复杂数据类型的基础。Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型。结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。...一旦定义了结构体类型,它就能用于变量的声明初始化结构体// 1.按照顺序提供初始化值// 2.通过field:value的方式初始化,这样可以任意顺序。

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

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

go在方法中修改结构体的值_golang修改结构体中的切片值方法

golang 空结构体 struct{} 可以用来节省内存a := struct{}{}println(unsafe.Sizeof(a))// Output: 0理由如下: 如果使用的是map,而且map又很长,通常会节省不少资源 空struct{2021-01-15 20:08:13golang修改结构体中的切片值,直接传结构体地址就可以package main import "fmt" t...

weixin_31185473的博客 642

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

下划线字段在golang结构体中的应用

上面列举的只是一些最常见的下划线字段的应用,你完全可以因地制宜创造出新的用法。但别忘了代码可读性是第一位的,不要为了炫技而滥用下划线字段。同时也要小心不要踩到注意事项里说的坑。apocelipes下划线字段在golang结构体中的应用 - apocelipes - 博客园JNPF快速开发平台。

sdgfafg_25的博客 1235

golang获取结构体中的tag_26. Go 语言中结构体的 Tag 用法

大家好,我是明哥。由于某些不可抗力,之前该专栏的所有内容都被删除了。因此之后的一段时间内,我会重新发布这些文章,先给已经看过的关注者提个醒。本文原文:http://golang.iswbm.comGithub:http://github.com/iswbm/GolangCodingTime1. 抛砖引玉:什么是 Tag?正常情况下,你定义的结构体是这样子的,每个字段都由名字和字段类型组成type ...

weixin_39678304的博客 835

go 修改结构体方法_利用golang怎么对结构体中的切片值进行修改

利用golang怎么对结构体中的切片值进行修改发布时间:2021-01-15 17:16:48来源:亿速云阅读:90作者:Leah利用golang怎么对结构体中的切片值进行修改?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。golang修改结构体中的切片值,直接传结构体地址就可以packagemainimport"fmt"typ...

weixin_35705450的博客 1654

Go中的结构体

前面我们或多或少的都使用了结构体这种数据结构,本身结构体也有很多特性,我们一一来看。 结构体的作用是将一个或者多个任一类型的变量组合在一起的数据类型,类似于我们在Java中class的作用。在结构体重也可以嵌套结构体。结构体还可以有自己的方法。 1.定义结...

a2225791的博客 1256

golang 结构体断言_Golang中的reflect原理

反射(reflect)是在计算机程序运行时,访问,检查,修改它自身的一种能力,是元编程的一种形式。在Java等语言中都很好地支持了反射。Golang也实现了反射,主要核心位于reflect包,官方文档为:https://golang.org/pkg/reflect/​golang.org本文将主要介绍Golang中的反射原理和支持的反射操作。1. reflect原理:结构体与关系Golang是强类...

weixin_39800387的博客 516

golang修改结构体中的切片值

golang修改结构体中的切片值,直接传结构体地址就可以 package main import "fmt" type rspInfo struct { KeyWords string `json:"key_words"` Value []string `json:"value"` } func setSlice(te *[]string){ str := "12" *te = append(*te,str) } //结构提传指针 func setStruc(rsp *rsp...

1万+

Go语言中的结构体类型

介绍Golang中结构体的定义、初始化、匿名字段、内嵌结构体以及方法的定义

阿星的博客 2027

Go中的管道,结构体

的通讯方式,是不支持跨进程通信的,如果需要进程间通讯的话,可以使用Socket等网络方式。这是因为目前只有一个线程去管道里读取数据,多了的没办法拿走,此时会产生一个死锁出来;如果管道中没有数据,那么从管道中读取数据会导致程序阻塞,直到有数据–管道是Go语言在语言级别上提供的goroutine间的。go中的结构体是面向对象编程的一个关键点;1,使用range的方式,需要先关闭管道。管道一旦关闭,就不能再往里面添加数据了。管道底层是一个环形队列(先进先出);在运行阶段,go会直接抛一个异常。......

Gavin 641

31_33-Golang中的结构体详解

go

huan 1202

11. Go中的结构体

在Go语言中有一些基本的数据类型,如string、整型、浮点型、布尔等数据类型,Go语言中可以使用type关键字来定义自定义类型。上面代码表示:将mylnt定义为int类型,通过type关键字的定义,mylnt就是一种新的类型,它具有int的特性。示例:如下所示,我们定义了一个myInt类型}输出查看它的值以及类型,能够发现该类型就是myInt类型除此之外,我们还可以定义一个方法类型然后调用并输出3/**定义一个人结构体// 实例化结构体 var person Person。

Oracle/MySQL 到 国产信创数据库|迁移 · 调优 · 信创替换 1078
上一篇: go中的切片
下一篇: 错误与异常处理
Cc_sec
博客等级 码龄8年 6粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值