目录
在本篇中,总结了常量和变量、值类型和引用类型、变量的作用域、单引双引反引和字符串和翻转截断这些基础概念和操作
3.1 常量和变量
3.1.1 常量
常量只能用const修饰,表示仅只读而不能修改,其可修饰类型包括:bool类型、number (int、float、complex)和string,其语法为const identifier [type]=value。
package main
import(
"fmt"
"time"
)
const (
pi float64=3.1414926
b string="hello world"
Man int= 1
Female int= 2
)
func main() {
for {
second := time.Now().Unix()
if (second % Female == 0) {
fmt.Println("female")
} else {
fmt.Println("man")
}
time.Sleep(1000 * time.Millisecond)
}
}
3.1.2 变量
var(
a int //默认为0
b string //默认为“ ”
c bool //默认为false
d int =8(d:=8)
e :="hello world"
)
3.2 值类型和引用类型
1)值类型。变量直接存储,内存通常分配在栈中,其基本的数据类型有:int、float、bool、string、数组和struct。
2)引用类型。变量存储的为一个地址,这个地址存储值。内存在堆上分配,Go自动回收。其类型有:指针、slice(切片)、map和chan这些都为引用类型。
例:值类型和引用类型交换两个整数的值。代码如下,如下图所示,当modify()函数传递是值类型时,调用其不能修改全局变量a,因为其用的是值拷贝。而传递引用类型时,我们能修改其值,因为传递进去的是存储这个值得地址,我们改变了这个地址中的值。
package main
import (
"fmt"
)
func modify(a int) {
a = 10
return
}
func modify1(a *int) {
*a = 10
}
func main() {
a := 5
b := make(chan int, 1) //make初始化chaneel,返回值就为引用类型
fmt.Println("a=", a)
fmt.Println("b=", b)
modify(a)
fmt.Println("a=", a)
modify1(&a)
fmt.Println("a=", a)
}
3.3 变量的作用域
1)在函数内部声明的变量叫做局部变量,生命周期仅限于函数内部。
2)在函数外部声明的变量叫全局变量,生命周期作用域整个包,如果大写则作用于整个程序。(这儿提一句,在前面《Go的自建包的调用》一文中,在mian文件外声明的包中的函数,函数名开头必须大写!否则会报错)
一. 下面代码输出为“GOG”,局部变量生命周期仅在函数内部
package main
import "fmt"
var a = "G"
func n() {
fmt.Println(a)
}
func m() {
a := "O"
fmt.Println(a)
}
func main() {
n()
m()
n()
}
二. 而下面代码输出则为“GOO”
package main
import "fmt"
var a = "G"
func n() {
fmt.Println(a)
}
func m() {
a = "O"
fmt.Println(a)
}
func main() {
n()
m()
n()
}
3.4 单引双引反引
1)单引。在go中,单引号' ' 表示一个字符,使用一个特殊类型 rune 表示字符型(rune 为 int32 的别名,它完全等价于 int32,习惯上用它来区别字符值和整数值)。rune 表示字符的 Unicode 码值。
2)双引。创建可解析的字符串字面量,支持转义,但不能用来引用多行
3)反引。原生的字符串字面量 ,这些字符串可能由多行组成,不支持任何转义序列。原生的字符串字面量多用于书写多行消息、HTML 以及正则表达式。
package main
import "fmt"
func main() {
var str = "hello world" //字符串
var str1 = `
床前明月光,
疑是地上霜。
举头望明月,
我是郭德纲。
`
var b byte = 'c'
fmt.Println(str)
fmt.Println(str1)
fmt.Println(b)
fmt.Printf("%c\n", b)
}
3.5 字符串的翻转截断
1)这段代码,[]byte(str)相当于将字符串强转为byte型序列(数组)。
2)字符串相当于一个只读字节数组,虽不是切片,但支持切片操作。—>string的底层布局
package main
import (
"fmt"
)
func reverse(str string) string { //翻转
var result string
strLen := len(str)
for i := 0; i < strLen; i++ {
result = result + fmt.Sprintf("%c", str[strLen-i-1])
//字符串可直接加+,如“a”+"b"
}
return result
}
func reverse1(str string) string {
var result []byte
tmp := []byte(str) //此处引用了一个长度为len(str)、容量为len(str)的byte型数组
length := len(str) //发生了强转
for i := 0; i < length; i++ {
result = append(result, tmp[length-i-1])
}
return string(result)
}
func main() {
var str1 = "hello"
str2 := "world"
str3 := str1 + " " + str2
fmt.Println(str3)
str4 := fmt.Sprintf("%s %s", str1, str2)
fmt.Println(str4)
n := len(str3)
fmt.Printf("len(str3)=%d\n", n)
substr := str3[0:5] //字符串相当于一个只读字节数组,虽不是切片,但其
fmt.Println(substr) //支持切片操作
substr1 := str3[2:]
fmt.Println(substr1)
result := reverse(str3)
fmt.Println(result)
result1 := reverse1(result)
fmt.Println(result1)
}