每次学习并整理一个Golang的知识点,每天进步一点点。今天学习下字符串连接和nil的知识点🤔。

代码片段

观察如下代码片段,写出你认为的正确答案?

  1. 关于字符串连接,下面语法正确的是:()

    • A. str := 'abc' + '123'
    • B. str := "abc" + "123"
    • C. str := '123' + "abc"
    • D. fmt.Sprintf("abc%d", 123)
  2. 下面赋值正确的是:()

    • A. var x = nil
    • B. var x interface{} = nil
    • C. var x string = nil
    • D. var x error = nil

思考后看答案…

思考后看答案


答疑解惑

参考答案:

1.BD
在Go中,用双引号来表示字符串。单引号、双引号和反引号的区别如下:

  • 单引号表示rune类型,rune 等同于int32;且单引号只能包含一个字符,例如’a’,程序会输出97表示字符a的ascii码。
  • 双引号用来表示字符串string,其实质是一个byte类型的数组;
  • 反引号用来创建原生的字符串字面量,它可以由多行组成,但不支持任何转义序列;

A选项中,单引号中包含多个字符,会提示报错:Invalid character literal (more than one character);

C选项中,把两个不同类型的变量进行拼接时,就会报错。

D选项,是正确的字符串连接。除了以上两种连接方式,还有strings.Join()、buffer.WriteString()等。

2.BD
知识点:nil 值。nil只能赋值给指针、chan、func、interface、map或slice 类型的变量。D选项的error类型,是一种内置接口类型,也是正确的。

你做对了吗?😊

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

拓展阅读

使用原始字符串字面值,避免转义

Go 支持使用原始字符串字面值,也就是**反引号(” ` “)*来表示原生字符串,在需要转义的场景下,我们可以使用这种方案来替换。

可以跨越多行并包含引号。使用这些字符串可以避免更难阅读的手工转义的字符串。例如下面示例2的写法优于示例1

示例1:

1
egStr := "hello world:\"golang\""

示例2:

1
egStr := `hello world:"golang"`

字符串拼接–builder 拼接

为了改进buffer拼接的性能,从go 1.10 版本开始,增加了一个builder类型,用于提升字符串拼接的性能。它的使用和buffer几乎一样。

1
2
3
4
5
6
7
8
var s = "abcd"
var s1 = "efgh"
b := strings.Builder{}
b.WriteString(s)
b.WriteString(",")
b.WriteString(s1)
s2 := b.String()
fmt.Println("s2是:", s2)

输出结果:s2是: abcd,efgh

下期提问

  1. (多选)关于init函数,下面说法正确的是()
  • A. 一个包中,可以包含多个 init 函数;
  • B. 程序编译时,先执行依赖包的 init 函数,再执行 main 包内的 init 函数;
  • C. main 包中,不能有 init 函数;
  • D. init 函数可以被其他函数调用;

2.观察下面代码片段,判断能否编译通过?如果可以,写出输出结果?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
package main

func getValue() int {
	return 1
}

func main() {
	i := getValue()
	switch i.(type) {
	case int:
		println("int")
	case string:
		println("string")
	case interface{}:
		println("interface")
	default:
		println("unknown")
	}
}

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


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

xujpxm_qrcode_gh