三. Go基础:常量和变量、值类型和引用类型、变量的作用域、单引双引反引和字符串的翻转截断

目录

3.1 常量和变量

3.2 值类型和引用类型

3.3 变量的作用域

3.4 单引双引反引

3.5 字符串的翻转截断


在本篇中,总结了常量和变量、值类型和引用类型、变量的作用域、单引双引反引和字符串和翻转截断这些基础概念和操作

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)
}

              

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值