首页 > 其他分享 >Go新手容易踩的坑(控制结构相关)

Go新手容易踩的坑(控制结构相关)

时间:2024-07-06 20:43:39浏览次数:14  
标签:Account val fmt testing 控制结构 accounts Go 新手 Balance

1、忽视在range循环中元素被复制的事实

修改结构体切片中的元素

错误的修改方式(要注意:在range循环中,值元素是一个拷贝!)

package tests

import (
    "fmt"
    "testing"
)

type Account struct {
    Balance int
}

func TestT1(t *testing.T) {

    accounts := []Account{
        {Balance: 10},
        {Balance: 20},
        {Balance: 30},
    }

    // 1、这样做不会修改
    for _, a := range accounts {
        // 只改变了临时变量a,并没有改变切片中的元素
        a.Balance += 100
    }

    fmt.Println("accounts: ", accounts) // accounts:  [{10} {20} {30}]

}

正确的修改方式1:使用切片的索引访问元素

package tests

import (
    "fmt"
    "testing"
)

type Account struct {
    Balance int
}

func TestT1(t *testing.T) {

    accounts := []Account{
        {Balance: 10},
        {Balance: 20},
        {Balance: 30},
    }
    
    for idx, _ := range accounts {
        accounts[idx].Balance += 100
    }

    fmt.Println("accounts: ", accounts) // accounts:  [{110} {120} {130}]

}

正确的修改方式2:传统的for循环实现,实际上也是通过索引的方式修改

package tests

import (
    "fmt"
    "testing"
)

type Account struct {
    Balance int
}

func TestT1(t *testing.T) {

    accounts := []Account{
        {Balance: 10},
        {Balance: 20},
        {Balance: 30},
    }

    for i := 0; i < len(accounts); i++ {
        accounts[i].Balance += 100
    }

    fmt.Println("accounts: ", accounts) // accounts:  [{110} {120} {130}]

}

正确的修改方式4:改成访问“切片结构体指针”

但是书中又提到了:“如果性能很重要,由于缺乏可预测性,CPU在指针上的迭代效率可能比较低(书中错误#91中会有讨论)”

package tests

import (
    "fmt"
    "testing"
)

type Account struct {
    Balance int
}

func TestT1(t *testing.T) {

    accounts := []*Account{
        {Balance: 10},
        {Balance: 20},
        {Balance: 30},
    }

    for _, val := range accounts {
        val.Balance += 200
    }

    for _, val := range accounts {
        fmt.Println("val.Balance: ", val.Balance)
    }
    /*
        val.Balance:  210
        val.Balance:  220
        val.Balance:  230
    */
    
}

23

123

123

123

123

参考

注意一下,个人建议还是买纸质版的书,下面的博客里面因为是机翻的,所以不可避免会有一些看起来很难理解的地方~

https://gomis100.flygon.net/#/docs/03

标签:Account,val,fmt,testing,控制结构,accounts,Go,新手,Balance
From: https://www.cnblogs.com/paulwhw/p/18287691

相关文章

  • Django权限系统如何使用?
    Django的权限系统是一个强大而灵活的特性,允许你控制不同用户对应用程序中资源的访问。以下是使用Django权限系统的几个基本步骤:1.定义模型权限在你的models.py文件中,你可以为每个模型定义自定义权限。这通过在模型的Meta类里设置permissions元组完成。fromdjango.dbim......
  • Kubernetes client-go源码走读
    Informer机制Kubernetes使用Informer代替Controller去访问APIServer,Controller的所有操作都和Informer进行交互,而Informer并不会每次都去访问APIServer。Informer使用ListAndWatch的机制,在Informer首次启动时,会调用LISTAPI获取所有最新版本的资源对象,然后再通过WATCH......
  • Linux 干货:新手村全攻略,老手也不容错过
    以下是一篇详细的关于Linux系统的文章,涵盖了基础概念、常用命令、系统管理、网络配置、安全措施等多个方面,旨在提供全面的Linux知识。希望这些干货能对你有所帮助。掌握Linux:从基础到进阶Linux是一种开源的操作系统,广泛应用于服务器、开发环境、嵌入式系统等多种场景。了解......
  • 蝙蝠优化算法(Bat Algorithm,BA)及其Python和MATLAB实现
    蝙蝠优化算法(BatAlgorithm,简称BA)是一种基于蝙蝠群体行为的启发式优化算法,由Xin-SheYang于2010年提出。该算法模拟了蝙蝠捕食时在探测目标、适应环境和调整自身位置等过程中的行为,通过改进搜索过程来实现优化问题的求解。蝙蝠群体中每一只蝙蝠代表一个潜在解,在搜索过程中,蝙蝠......
  • Golang channel底层是如何实现的?(深度好文)
    Hi你好,我是k哥。大厂搬砖6年的后端程序员。我们知道,Go语言为了方便使用者,提供了简单、安全的协程数据同步和通信机制,channel。那我们知道channel底层是如何实现的吗?今天k哥就来聊聊channel的底层实现原理。同时,为了验证我们是否掌握了channel的实现原理,本文也收集了channel的高......
  • ABC 335 F Hop Sugoroku
    题意https://atcoder.jp/contests/abc335/tasks/abc335_f题解显然想到dp,我们首先会产生一个最为朴实的想法,我们设dp[i]为以第i格作为结尾的方案数。那么考虑状态转移,有:dp[i]=∑dp[j](1≤j<i,i≡j(moda[j]))。这样的做法显然是N方的,不能通过。考虑优化,我们已知a[i]≤2e5的,那么......
  • 新手如何尽快入门性能测试?
    忙碌了一周,又到了愉快的周五了,懒洋洋躺在沙发上,玩两局游戏好好放松一下吧!今天浅谈软件性能测试! 在当今快节奏的科技环境中,软件性能测试变得尤为重要。无论是确保应用在高并发情况下的稳定性,还是优化响应时间,性能测试都是每个软件测试工程师的必备技能。那么,对于新手来说,如何快......
  • 一天快速入门Django:从0到1创建属于自己的Web应用
    DjangoWeb开发Day11.Django的安装pipinstalldjango2.创建项目2.1终端创建“python环境路径\scripts\django-admin.exe”startprojectdjango项目名#如果python环境路径配置了环境变量,可直接写django-adminstartprojectdjango项目名2.2pycharm创建2.3项目文......
  • opencv 编译报错: error: temporary of non-literal type 'google::protobuf::intern
    完整报错:C:\Users\MyName\MyProject\lib\include\google\protobuf\stubs\mutex.h:124:error:temporaryofnon-literaltype'google::protobuf::internal::CallOnceInitializedMutex<std::mutex>'inaconstantexpressionInfileincludedfrom......
  • Mongodb性能优化方法
    学习mongodb,体会mongodb的每一个使用细节,欢迎阅读威赞的文章。这是威赞发布的第82篇mongodb技术文章,欢迎浏览本专栏威赞发布的其他文章。如果您认为我的文章对您有帮助或者解决您的问题,欢迎在文章下面点个赞,或者关注威赞。谢谢。Mongodb与其他数据库类似,当面临大量数据查询时,......