每次学习并整理一个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爱月”。