V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
justonelastdance
V2EX  ›  Go 编程语言

Go 语言没有引用类型,指针也与众不同

  •  
  •   justonelastdance · 2023-08-19 16:17:02 +08:00 · 1341 次点击
    这是一个创建于 458 天前的主题,其中的信息可能已经有所发展或是发生改变。
    兄弟们实锤了奥,go 就是值传递,可以确认的是 Go 语言中所有的传参都是值传递(传值),都是一个副本,一个拷贝。因为拷贝的内容有时候是非引用类型( int 、string 、struct 等这些),这样就在函数中就无法修改原内容数据;有的是引用类型(指针、map 、slice 、chan 等这些),这样就可以修改原内容数据。

    是否可以修改原内容数据,和传值、传引用没有必然的关系。在 C++中,传引用肯定是可以修改原内容数据的,在 Go 语言里,虽然只有传值,但是我们也可以修改原内容数据,因为参数是引用类型。

    有的小伙伴会在这里还是懵逼,因为你把引用类型和传引用当成一个概念了,这是两个概念,切记!!!
    SingeeKing
        1
    SingeeKing  
       2023-08-19 17:38:28 +08:00 via iPhone
    刚好相反的是 java ,一切都是传引用
    BeautifulSoap
        2
    BeautifulSoap  
       2023-08-19 18:19:24 +08:00 via Android   ❤️ 2
    。。。。。lz 这是没学过 c 语言吗
    LuckyPocketWatch
        3
    LuckyPocketWatch  
       2023-08-19 18:40:26 +08:00
    void print_info(const People& p);
    这个 C++函数,传引用,你看这个函数能不能修改 p 的值。。。
    geelaw
        4
    geelaw  
       2023-08-19 18:42:51 +08:00
    @LuckyPocketWatch #3 虽然楼主的理解问题比较大,不过

    struct People
    {
    mutable int mutable_field;
    int field;
    };

    void print_info(const People &p)
    {
    p.mutable_field = 1;
    const_cast<People &>(p).field = 2;
    }

    int main()
    {
    People inst;
    print_info(inst);
    }
    ke1e
        5
    ke1e  
       2023-08-19 19:43:22 +08:00 via iPhone
    @geelaw 这就是 c++恶心的地方 一个 const 都能玩出花来
    oldshensheep
        6
    oldshensheep  
       2023-08-19 20:04:25 +08:00
    @geelaw 又是 const 又是 mutable 再来个 const_cast ,C++太可怕了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3212 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 13:32 · PVG 21:32 · LAX 05:32 · JFK 08:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.