首页 > 编程语言 >go 高级编程中一些注意点

go 高级编程中一些注意点

时间:2023-02-21 18:56:12浏览次数:26  
标签:wg int 编程 高级 类型 数组 go 长度

  1. 数组、字符串和切片三者是密切相关的数据结构,因底层都是相同的结构。
  2. go中除了闭包函数以引用的方式对外部变量访问之外,其它赋值和函数传参数都是以传值的方式处理。
  3. 数组,需要指定固定长度,特殊类型,值类型,元素可修改,赋值和函数调用实质是以整体复制处理。不同长度或不同类型的数据组成的数组都是不同的类型,所以无法直接赋值。数组len和cap返回的数据是一样的。指针指向数组,和数组值,都可以用下标和range访问数组的值。
    var a [ 3 ] int // 定义一个长度为3的int类 型数组, 元素全部为0 
    var b = [...] int { 1 , 2 , 3 } // 定义一个长度为3的 int类型数组, 元素为 1, 2, 3 
    var c = [...] int { 2 : 3 , 1 : 2 } // 定义一个长度为3 的int类型数组, 元素为 0, 2, 3 
    var d = [...] int { 1 , 2 , 4 : 5 , 6 } // 定义一个长度为 6的int类型数组, 元素为 1, 2, 0, 0, 5, 6

     特殊:长度为0的数组在内存不会占用空间,可以用于强调某种特有类型的操作时避免分配额外的内存空间,比如用于管道的同步操作,chan上无需传输数据。

    c1 := make ( chan [ 0 ] int ) 
    go func () { 
    fmt.Println( "c1" ) 
    c1 <- [ 0 ] int {} 
    }()
    <- c1
    // 必须用key来初始化结构体,原因:结构体初始化有两种:1.指定字段名称。2.按顺序列出所有字段,不指定名称。如果使用2的方式进行初始化,假如别人重新定义了这个结构,中间加了字段,就会出现初始化不对的问题。protobuf也是这样做的。
    type NoUnkeyedLiterals struct{}
     
    // 不允许结构体比较,只能针对到 ==,!=,>=,<=,>,<;如果使用反射relect.DeepEqual还是可以比较的。原理对于struct,只有全部字段是compareable才可以比较Slice、Map、Function均是不可比较的,只能判断是否为nil
    type DoNotCompare [0]func()
     
    // 不允许结构体拷贝、值传递,本质是 WaitGroup 内部维护了计数,不允许 copy 变量,内嵌 noCopy 字段,防止 Cond 变量被复制,还有sync.Mutex锁也是不允许copy的。
    type DoNotCopy [0]sync.Mutex
     
    type User struct {
        Age     int
        Address string
    
        //放在定义尾部更能节省空间padding
        // 必须用key来初始化结构体
        NoUnkeyedLiterals
        // 不允许结构体比较
        DoNotCompare
        // 不允许结构体拷贝、值传递
        DoNotCopy
    }
     
    func main() {
        _ = &User{Age: 21, Address: "beijing"}
     
        fmt.Println(unsafe.Sizeof(NoUnkeyedLiterals{}))
        fmt.Printf("%p\n", &DoNotCopy{})
        fmt.Printf("%p\n", &NoUnkeyedLiterals{})
        fmt.Printf("%p\n", &DoNotCompare{})
    }
    package main
    
    import (
        "sync"
    )
    
    func test(wg sync.WaitGroup) {
        defer wg.Done()
        wg.Add(1)
    }
    // 经典WaitGroup变量死锁
    func main() {
        var wg sync.WaitGroup
        wg.Add(1)
        go test(wg)
        wg.Wait()
    }

     

    拓展:与零长度类似,空结构体也是可以用来节省内存,具体场景有:

    1. 将map作为Set使用时,可以将值类型定义为空结构体,仅作为占位符使用;
    2. channel不需要发送数据,只用来通知子协程执行任务等时,可使用空结构体作为占位符;
    3. 结构体只包含方法,不包含任何的字段时,可声明空结构体,以节省资源。
  4. 字符串,底层为byte数组,只读禁止了对底层字节数组的修改。字符串赋值只是复制了数据地址和对应的长度,而不会导致底层数据的复制。赋值操作也就是 reflect.StringHeader 结构体的复制过程,reflect.StringHeader包含两个类型。
    type StringHeader struct {
        Data uintptr
        Len  int
    }

     

  5. 字符串是支持转为[]rune和[]byte,rune是int32的别称。 字符串相关的强制类型转换主要涉及到 []byte 和 []rune 两 种类型。每个转换都可能隐含重新分配内存的代价,最坏的情 况下它们的运算时间复杂度都是 O(n)。因为 []byte 和 []int32 类型是完全不同的内部布局,所以并不知道一个字符串的底层到底是什么数组实现,就会存在重新分配内存的问题。
  6. 切片

标签:wg,int,编程,高级,类型,数组,go,长度
From: https://www.cnblogs.com/klm-kain/p/17141020.html

相关文章

  • Django3.2知识点
    Django3.2前言之前我们介绍过web应用程序和http协议,简单了解过web开发的概念。Web应用程序的本质接收并解析HTTP请求,获取具体的请求信息处理本次HTTP请求,即完成本次......
  • Django框架课-创建游戏界面 (1)
    创建游戏界面(1)最后的结构:playground/|--ac_game_object|`--zbase.js|--game_map|`--zbase.js|--particle|`--zbase.js|--player|`--zbas......
  • Django重点
    Django简述python三大主流web框架"""django 大而全,类似于航空母舰 但是有时候过于笨重flask 小而精,类似于游骑兵(单行代码就可以起一个flask服务) 第三方组件很多,......
  • Ubuntu22.04 安装Mongodb6.X
    Ubuntu22.04安装Mongodb6.X1、Mongodb简介1.1什么是MongoDB?Mongodb是一个跨平台的面向文档的NoSQL数据库。它使用带有可选模式的类似JSON的BSON来存储数据。应用程......
  • DJango-ORM根据primary_value获取对应的类对象
    @classmethoddefget_obj_by_primary_value(cls,primary_value=None):primary_key=Nonefields=cls._meta.get_fields()forobjinfields:ifob......
  • Django之form表单相关操作
    目录摘要form表单form表单的action参数form表单的method参数request.method方法简介get请求传递数据post请求传递数据GET/POST实际应用,简单登录方式实现摘要本章讲述了fo......
  • (转)goquery库的使用
    原文:https://www.jianshu.com/p/d8dae9669769简介goquery为Go语言带来了类似于jQuery的语法和一组特性。它基于Go的net/html包和CSSSelector库cascadia。由于net/......
  • 闲逛Django Framework
    昨天看了一通R语言后,找不到合适的需要用R语言。先暂时放到一边,等有需求了再继续试用。今天闲逛到Python的Web开发框架DjangoFramework.写了一个最基本的HellowordWe......
  • golang入门(十一)并发groutine
    并发与并行一直两个容易搞混的概念:并发:同一个时间段,共同运行的任务。任务的在这个时间段内,启动和结束的时间有先后之分的。举例来说:公司的食堂在中午12点-13点之间,可以容纳1......
  • 零编程基础学习无代码管理系统应用开发
    前言代码是软件和应用程序的核心。每行代码都是一条逐步指令的机制,与计算机、服务器和其他计算机共同执行操作逻辑。要创建这些指示,必须知道如何编写代码,而这项技能极为短缺......