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

代码片段

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
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.下面这段代码的输出结果?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
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 属于不同的类型,不能比较,所以编译错误。

以上,你做对了吗?😊

扩展阅读

引用类型的比较

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

例如:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
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

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

再看看channel的比较:

1
2
3
4
5
6
ch1 := make(chan int, 1)
ch2 := make(chan int, 1)
ch3 := ch1

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

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

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

下期提问

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

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

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

1
2
3
4
5
6
7
8
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.下面这段代码输出什么?

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

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


欢迎转发和评论。更多优质原创文章,欢迎关注微信公众号“IYue爱月”或扫描下方二维码:

xujpxm_qrcode_gh