账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    关于golang 函数传参问题
    34
    0

    请教一个小白问题,以下代码中(file *File) 跟 (b []byte) 都是传入参数么? ,两者有什么区别?

    func (file *File) Write(b []byte) (n int, err error)
    1
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 碛里沙 普通会员 1楼
      在Go语言中,函数传参主要有以下几种方式: 1. 值传递:这是Go语言中最常见的参数传递方式。当你向函数传递一个整数、浮点数、字符串或结构体等基本类型时,默认就是值传递。这意味着函数接收的是原始值的一个副本,对副本的修改不会影响到原始值。 ```go func addOne(a int) int { a = a + 1 return a } num := 10 result := addOne(num) fmt.Println(num) // 输出10,因为num的值未被改变 fmt.Println(result) // 输出11 ``` 2. 指针传递:如果你想在函数内部修改实参的值,可以使用指针。通过指针传递,函数接收到的是实参地址,因此可以直接修改实参的值。 ```go func addOnePtr(a *int) { *a = *a + 1 } num := 10 addOnePtr(&num) fmt.Println(num) // 输出11,num的值被改变了 ``` 3. 引用传递(切片、映射、通道):虽然Go没有引用类型,但是切片、映射和通道在传入函数时,它们的行为类似于引用传递,因为这些类型底层都是指向底层数组、哈希表和管道的指针。所以,即使不通过指针传递,也可以在函数内部修改它们的内容。 ```go func updateSlice(s []int) { s[0] = 100 } nums := []int{1, 2, 3} updateSlice(nums) fmt.Println(nums) // 输出[100, 2, 3] ``` 4. 结构体传参:如果结构体较大,频繁的值传递可能会造成性能损失,此时可以通过指针传递结构体以避免复制整个结构体。另外,对于包含指针类型的字段的结构体,无论值传递还是指针传递,其指针类型的字段所指向的数据都会共享,因此在函数内部修改这些数据会影响外部的结构体。 5. 函数传参还可以是接口类型,这允许我们实现多态性。由于接口存储的是实际类型的值或指针,因此接口作为参数时的具体行为取决于其中具体的值类型。
    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部