//把str字符串按空格进行分割,并返回一个slice
str := "string one two stree"
sl := strings.Fields(str)
//切分完成后进行for循环读取其中的数据
/**
for 循环示例
range为关键字 得到的是下标和值
因为下面代码不需要下标 所以用`_`进行了接收
如果需要使用下标 可以将 `_` 替换成 i
*/
for _, val := range sl {
fmt.Println(val)
}
/**
strings.TrimSpace(s) 来剔除字符串开头和结尾的空白符号
Join 用于将元素类型为 string 的 slice 使用分割符号来拼接组成一个字符串:
strings.Join(sl []string, sep string) string
strconv 是类型转换类 任何类型都可以转换成为 String 但是string转换成
其他参数不是一定可以的
返回的格式 :val, err = strconv.Atoi(s)
*/
int_str := strconv.IntSize
fmt.Println(int_str)
unicode 包含了一些针对测试字符的非常有用的函数(其中 ch 代表字符):
判断是否为字母:unicode.IsLetter(ch)
判断是否为数字:unicode.IsDigit(ch)
判断是否为空白符号:unicode.IsSpace(ch)
time.Now().Format(‘2018-12-07’)
把当前时间转换为format里面传入的格式
如果需要在应用程序在经过一定时间或周期执行某项任务(事件处理的特例),
则可以使用 time.After 或者 time.Ticker:
另外,time.Sleep(Duration d) 可以实现对某个进程(实质上是 goroutine)时长
为 d 的暂停。
t := time.Now()
fmt.Println(t) // e.g. Wed Dec 21 09:52:14 +0100 RST 2011
fmt.Printf("%02d.%02d.%4d\n", t.Day(), t.Month(), t.Year())
// 21.12.2011
t = time.Now().UTC()
fmt.Println(t) // Wed Dec 21 08:52:14 +0000 UTC 2011
fmt.Println(time.Now()) // Wed Dec 21 09:52:14 +0100 RST 2011
// calculating times:
week := 60 * 60 * 24 * 7 * 1e9 // must be in nanosec
week_from_now := t.Add(time.Duration(week))
fmt.Println(week_from_now) // Wed Dec 28 08:52:14 +0000 UTC 2011
// formatting times:
fmt.Println(t.Format(time.RFC822)) // 21 Dec 11 0852 UTC
fmt.Println(t.Format(time.ANSIC)) // Wed Dec 21 08:56:34 2011
fmt.Println(t.Format("02 Jan 2006 15:04")) // 21 Dec 2011 08:52
s := t.Format("20060102")
fmt.Println(t, "=>", s)
可以控制数据结构的指针 但是不能进行指针运算
go语言存取地址符是&
放到一个变量前使用就会返回相应变量的内存地址
地址可以存储在一个叫做指针的特殊数据类型中
(指针的格式化标识符为 %p)
一个指针变量可以指向任何一个值的内存地址 它指向那个值的内存地址
使用一个指针引用一个值被称为间接引用
一个指针变量通常缩写为 ptr。
对于任何一个变量 var, 如下表达式都是正确的:var == *(&var)。
改变指针中的值时 原对象的值也会改变 因为他们两个指向同一个地址
注意
不能得到一个文字或常量的地址
对一个空指针的反向引用是不合法的,并且会使程序崩溃
var i1 = 5
fmt.Printf("An integer: %d, it's location in memory: %p\n", i1, &i1)
var intP *int //声明指针变量 //
intP = &i1
fmt.Println( *intP) //获取指针中的类容
//改变指针中的值时 原对象的值也会改变 因为他们两个指向同一个地址
sts := "good bye"
var p *string = &sts
*p = "ciao"
fmt.Printf("Here is the pointer p: %p\n", p) // prints address
fmt.Printf("Here is the string *p: %s\n", *p) // prints string
fmt.Printf("Here is the string s: %s\n", sts) // prints same string
关键字 if 和 else 之后的左大括号 {
必须和关键字在同一行,如果你使用了 else-if 结构,则前段代码块的右大括号
} 必须和 else-if 关键字在同一行。
这两条规则都是被编译器强制规定的。
非法代码
if x{
}
else { // 无效的
}
当 if 结构内有 break、continue、goto 或者 return 语句时 Go 代码的常见写法是省略 else 部分
//判断语句 这里不需要使用 if bool1 == true 来判断,因为 bool1 本身已经是一个布尔类型的值
bool1 := true
if bool1 {
fmt.Printf("The value is true\n")
} else {
fmt.Printf("The value is false\n")
}
i,err := testStrToInt("aa")
if err != nil {
println(err)
}else {
println(i)
}
switch结构
变量 var1 可以是任何类型,而 val1 和 val2 则可以是同类型的任意值。
类型不被局限于常量或整数,但必须是相同的类型;或者最终结果为相同类型的表达式。前花括号 { 必须和 switch 关键字在同一行。
可以同时测试多个可能符合条件的值,使用逗号分割它们,例如:case val1, val2, val3
如果在执行完每个分支的代码后,还希望继续执行后续分支的代码,可以使用 fallthrough 关键字来达到目的。
var num1 int = 100
switch num1 {
case 98, 99:
fmt.Println("It's equal to 98")
case 100:
fmt.Println("It's equal to 100")
default:
fmt.Println("It's not equal to 98 or 100")
}
switch 语句的第二种形式是不提供任何被判断的值(实际上默认为判断是否为 true),
然后在每个 case 分支中进行测试不同的条件。当任一分支的测试结果为 true 时,
该分支的代码会被执行。这看起来非常像链式的 if-else 语句,但是在测试条件非常多的情况下,提供了可读性更好的书写方式。
switch {
case i < 0:
//代码块1
case i == 0:
//代码块2
case i > 0:
//代码块3
}