.go
为后缀名存储在计算机中,这些文件名均由小写字母组成,如 scanner.go
。如果文件名由多个部分组成,则使用下划线 _
对它们进行分隔,如 scanner_test.go
。文件名不包含空格或其他特殊字符。//需要先导入Strings包,官方推荐的这种方法
s1 := "字符串"
s2 := "拼接"
var build strings.Builder
build.WriteString(s1)
build.WriteString(s2)
s3 := build.String()
strings 包的 Replace 函数被广泛用于简单的替换。最后一个 integer 参数定义将执行多少次替换(在-1情况下,替换所有字符串)
const refString = "Mary had a little lamb"
out := strings.Replace(refString, "lamb", "wolf", -1)
fmt.Println(out)
Mary had a little wolf
除了 Replace 函数外, Replacer 结构体还具有 WriteString 方法。 此方法将写入给定的编写器,并在 Replacer 中定义所有替换。这种类型的主要目的是可重用性。它可以同时替换多个字符串,并发使用安全;参见步骤2。
onst refString = "Mary had a little lamb"
replacer := strings.NewReplacer("lamb", "wolf", "Mary", "Jack")
out := replacer.Replace(refString)
Jack had a little wolf
替换子字符串甚至匹配模式的更复杂的方法自然是使用正则表达式。 可以利用 Regex 类型指针方法 ReplaceAllString 来实现此目的。 步骤3说明了 regexp 包的使用。
const refString = "Mary had a little lamb"
regex := regexp.MustCompile("l[a-z]+")
out := regex.ReplaceAllString(refString, "replacement")
fmt.Println(out)
Mary had a replacement replacement
func main() {
wg := sync.WaitGroup{}
wg.Add(100)
for i := 0; i < 100; i++ {
go func(i int) {
fmt.Println(i)
wg.Done()
}(i)
}
wg.Wait()
}
计数器不能为负值
WaitGroup对象不是一个引用类型
//WaitGroup对象不是一个引用类型,在通过函数传值的时候需要使用地址:
func main() {
wg := sync.WaitGroup{}
wg.Add(100)
for i := 0; i < 100; i++ {
go f(i, &wg)
}
wg.Wait()
}
// 一定要通过指针传值,不然进程会进入死锁状态
func f(i int, wg *sync.WaitGroup) {
fmt.Println(i)
wg.Done()
}
byte类型或rune类型,对应 uint8和int32类型
,默认是 rune 类型。byte用来强调数据是raw data,而不是数字;而rune用来表示Unicode的code point。是字符串,实际上是字符数组。
可以用索引号访问某字节,也可以用len()函数来获取字符串所占的字节长度。字符串字面量,但不支持任何转义序列
。字面量 raw literal string 的意思是,你定义时写的啥样,它就啥样,你有换行,它就换行。你写转义字符,它也就展示转义字符。