• 深白色
    2018-09-07
    1.分2种情况,若是修改数组中的切片的某个元素,会影响原数组。若是修改数组的某个元素即a[1]=[]string{"x"}就不会影响原数组。谨记Go中都是浅拷贝,值类型和引用类型的区别
    2.当函数返回指针类型时不会发生拷贝。当函数返回非指针类型并把结果赋值给其它变量肯定会发生拷贝
     2
     47
  • melon
    2018-09-07
    感觉go里通常写的函数的定义本质上就是一种语法糖形式,比如
    func test(int)int {
        ...
    }
    其实质就相当于定义了一个名为test,类型为func(int)int的变量,并给这个变量赋了值为{...}的初值,老师这样理解对吧。
     2
     11
  • Geek_牛逼的人
    2019-09-09
    1.如果是进行一层修改,即数组的某个完整元素进行修改(指针变化),那么原有数组不变;如果进行二层修改,即数组中某个元素切片内的某个元素再进行修改(指针未改变),那么原有数据也会跟着改变,传参可以理解是浅copy,参数本身的指针是不同,但是元素指针相同,对元素指针所指向目的的操作会影响传参过程中的原始数据;
    2.一般来说应该是复制的,传参和返回应该是一个对称的过程,本身对这一片内存数据的操作只发生在函数内部,脱离函数就应该脱离这块内存区域

    作者回复: 对的。

    
     9
  • yandongxiao
    2018-09-25
    go语法的一致性很完美。

    []int{}, map[int]int{} struct{}{} 它们都是由type + literal的形式构成。
    所以,func (x, y int) int {} 也是function type + function literal的形式。
    上面的表达式返回已声明并初始化的变量。所以foo := func (x, y int) int {} 就构成了所谓的匿名变量。
    func Foo(x, y int) int{} 更像是给定义的函数常量,因为Foo不能再被赋予其它值了。

    既然是一等公民,可以声明为变量,那么变量之间就可以比较。
    展开
    
     5
  • mumu
    2018-09-09
    闭包这里为啥不能这样实现呢
    func genCalculator(op operate) calculateFunc{
        return op
    }
     1
     4
  • 欢喜哥
    2018-09-07
    我在下面声明的函数printToStd的签名与Printer的是一致的,因此前者是后者的一个实现,即使它们的名称以及有的结果名称是不同的。

    这个地方是不是 后者是前者的实现? 也就是printToStd 是 Printer的实现?

    作者回复: 对,你可以把这看做是函数级别的接口和实现。

    
     4
  • TimLiu
    2018-09-27
    针对第一个问题,做了下实验,发现如果改变数组中的元素时是不会改变源数组的,当改变数组中的切片中的元素时是会改变源数组的,我猜是因为切片改变元素时底层数组会改变,所以源数组也跟着改变

    package main

    import "fmt"

    func main() {
        complexArray1 := [3][]string{
            []string{"d", "e", "f"},
            []string{"g", "h", "i"},
            []string{"j", "k", "l"},
        }

        fmt.Printf("The array: %v\n", complexArray1)
        array2 := modifyArray(complexArray1)
        fmt.Printf("The modified array: %v\n", array2)
        fmt.Printf("The original array: %v\n", complexArray1)
        array3 := modifyArray1(complexArray1)
        fmt.Printf("The modified array: %v\n", array3)
        fmt.Printf("The original array: %v\n", complexArray1)
    }

    func modifyArray(a [3][]string) [3][]string {
        a[1] = []string{"d", "e", "p"}
        return a
    }

    func modifyArray1(a [3][]string) [3][]string {
        a[1][1] = "v"
        return a
    }
    展开
    
     3
  • RyuGou
    2018-09-07
    第一道题,显然是不会造成原来内容的修改呀
    package main

    import "fmt"

    func main(){
        complexArray := [3][]string{
            []string{"d", "s", "f"},
            []string{"a", "b", "c"},
            []string{"e", "g", "h"},
        }
        tryTest(complexArray)
        fmt.Println(complexArray)
    }


    func tryTest(array [3][]string){
        array[1] = []string{"1", "2", "3"}
        return
    }
    输出:
    [[d s f] [a b c] [e g h]]
    展开

    作者回复: 因为数组的每个元素也会被复制,你这样赋值只会改变数组副本中的一个元素值而已。你直接改其中的切片的元素值就会影响到外边了。

    
     2
  • 兔子高
    2018-09-07
    哈喽老师你好,我学go的反射是学的最乱的,反射可以拿到您好好讲一讲吗?然后最近看到了go新出的法案里说go 2.0会出泛型有考虑讲一下go的泛型吗?

    作者回复: Go的泛型几年后才会推出,现在没必要讲啊。

    
     2
  • 李小锋
    2019-12-22
    总结
    函数不仅能够封装代码,分割功能,解耦逻辑;还可以化身为普通的值,在函数之间传递,赋予变量,判断转换等
    函数值可以成为能够被随意传播的独立逻辑组件(功能模块)
    只要两个函数的参数列表和结果列表元素顺序及类型是一致的,我们就说他们是一样的函数(实现了相同函数类型的函数)
    函数类型是引用类型
    高姐函数: 把函数作为参数值传递 或者 函数的返回值是一个函数
    展开

    作者回复: 嗯,总结得挺好的。严格来说不能算是化身,因为函数本来就是值。另外我鸡蛋里挑个骨头,是“高阶函数”。:)

    
     1
  • 🐶
    2019-08-11
    深白色说的很对!作为切片的话,将会影响原数组,毕竟我们知道切片的数据是通过指向地址取值,而函数进行对原数组修改,只是先拷贝一份,然后再修改,根本修改不到原数组。
    函数返回指针类型,的确不会发生拷贝,但是也是将指针值拷贝了,再返回,所以其实深究,还是有拷贝在里面的,若是返回非指针类型的结果,一定会发生拷贝。
    go没有引用传递,只有值传递,所以基本上都是值拷贝。
    
     1
  • 王腾飞
    2018-09-08
    关于闭包,函数内修改外部变量会有什么效果呢?假设一个高阶函数返回了两个闭包函数,其中一个函数修改了外部变量的值,那这个变化会传递到另一个函数中吗?
     1
     1
  • benben
    2018-09-07
    第一个问题应该会受影响,因为数组元素是切片
    第二问题我想应该是复制的
    
     1
  • benben
    2018-09-07
    第一个问题应该会受影响,因为切片是引用类型的
    第二个问题我想是复制的
    
     1
  • 疯琴
    2019-11-26
    闭包讲得太牛B了,毕生看过最透彻的讲解。
    
    
  • panda199393
    2019-09-07
    看到genCalculator那块的时候刚我想到了python里面的decorator,也是将某个函数作为参数,套到定义好的模板函数里

    作者回复: 差不多,都属于闭包。

    
    
  • 窝窝头
    2019-05-21
    1.如果修改complexArray1里面的元素不影响原值,如果对元素里面的元素进行修改会影响原值
    2.函数返回给调用方的结果值如果是指针不会拷贝,如果非指针应该会拷贝
    
    
  • Aliliin
    2019-03-13
    改变数组中切片的某个元素的话, 原来的数组值会影响原值 .代码如下

    func TestComplexAreray(t *testing.T) {

        complexArray := [3][]string{
            []string{"d", "e", "f"},
            []string{"g", "h", "i"},
            []string{"j", "k", "l"},
        }
        ComplexAreray(complexArray)
        t.Log(complexArray)
    }

    func ComplexAreray(array [3][]string) {
        for _, v := range array {
            v[0] = "aaa"
        }
        return
    }
    ‘
    输出为 : [[aaa e f] [aaa h i] [aaa k l]]
    展开
    
    
  • Aliliin
    2019-03-13
    genCalculator 的实现如下

    type operate func(x, y int) int
    type calculator func(x, y int) (int, error)

    func genCalculator(op operate) calculator {
        return func(x, y int) (int, error) {
            if op == nil {
                return 0, errors.New("Invalid operation")
            }
            return op(x, y), nil
        }

    }
    func TestFunc(t *testing.T) {
        op := func(x, y int) int {
            return x + y
        }
        add := genCalculator(op)
        x, y := 56, 78
        result, err := add(x, y)
        fmt.Printf("The result: %d (error: %v)\n", result, err)
    }
    展开
    
    
  • 轻装渐行
    2019-03-12
    老师好,请问下,Go一般用什么框架做单元测试呢?

    作者回复: 你可以看一下标准库中的testing包。后面会讲到这个。

    
    
我们在线,来聊聊吧