七叶笔记 » golang编程 » Go学习每日一问(11)-slice的比较

Go学习每日一问(11)-slice的比较

每次学习并整理一个Golang的知识点,每天进步一点点。今天学习下数组切片的比较等知识点。

代码片段

1.下面这段代码的输出结果?

 package main

import (  
    "fmt"
)

func main() {  
    l := [5]int{1, 2, 3, 4, 5}
    l2 := l[3:4:3]
    fmt.Println(l2[0])
}  
  • A.3
  • B.4
  • C.compilation error

2.下面这段代码的输出结果?

 func main() {
a := [3]int{7, 8, 9}
b := [4]int{7, 8, 9}

if a == b {
fmt.Println("equal")
} else {
fmt.Println("not equal")
}
}  
  • A. equal
  • B. not equal
  • C. compilation error

要有自己的思考哦

思考后看下方答案…


答疑解惑

参考答案:

1. C
invalid slice index: 4 > 3

基于数组切片,可以使用操作符创建新的切片,形如s[n:l:c],n是偏移的起始位置,l是偏移的长度结束,c是偏移的容量结束位置;l-n 就是新切片的长度, c-n 就是新切片的容量;题中偏移的容量起始和容量结束均为3,那么新切片容量为零是不允许的;

有意思的是,n、l和c并不是当前切片的索引,所以 l是可以超出当前切片的长度的,但不能超出当前切片的容量 ;比如假设oldSlice只有5个元素,但容量是10;newSlice却可以基于oldSlice的前7个元素创建,newSlice中超出oldSlice的部分都会填上0;

2. C
invalid operation: a == b (mismatched types [3]int and [4]int)

==操作最重要的一个前提是:两个操作数类型必须相同!类型必须相同!类型必须相同! ;如果类型不同,那么编译时就会报错。

数组的长度视为类型的一部分,长度不同的两个数组是不同的类型,不能直接比较 。所以 a 和 b 属于不同的类型,不能比较,所以编译错误。

以上,你做对了吗?

扩展阅读

引用类型的比较

引用类型是间接指向它所引用的数据的,保存的是数据的地址。引用类型的比较实际判断的是两个变量是不是指向同一份数据,它不会去比较实际指向的数据。

例如:

 type A struct {
    a int
    b string
}

aa := &A { a : 1, b : "test1" }
bb := &A { a : 1, b : "test1" }
cc := aa
fmt.Println(aa == bb)  // false
fmt.Println(aa == cc)  // true  

因为 aa bb 指向的两个不同的结构体,虽然它们指向的值是相等的,但是它们不等。 aa cc 指向相同的结构体,所以它们相等。

再看看channel的比较:

 ch1 := make(chan int, 1)
ch2 := make(chan int, 1)
ch3 := ch1

fmt.Println(ch1 == ch2)
fmt.Println(ch1 == ch3)  

ch1 ch2 虽然类型相同,但是指向不同的channel,所以它们不等。 ch1 ch3 指向相同的channel,所以它们相等。

其他相关答案或补充知识点,欢迎在评论区留言补充!

下期提问

1.关于 cap() 函数的适用类型,下面说法正确的是()

  • A. array
  • B. slice
  • C. map
  • D. channel

2.下面这段代码的输出结果?

 func main() {  
    var i interface{}
    if i == nil {
        fmt.Println("nil")
        return
    }
    fmt.Println("not nil")
}  
  • A. nil
  • B. not nil
  • C. compilation error

3.下面这段代码输出什么?

 func main() {  
    s := make(map[string]int)
    delete(s, "h")
    fmt.Println(s["h"])
}  
  • A. runtime panic
  • B. 0
  • C. compilation error

答案及解析将在下期文章中给出,欢迎大家在评论区留言,独乐乐不如众乐乐,交流学习,互相进步。


欢迎转发和评论。更多优质原创文章,欢迎关注微信公众号“IYue爱月”。

相关文章