上一章 Chapter001 Golang标准库API以及学习资料
下一章 Chapter003 Golang运算符速查表
本章纲要
一、变量
1.指定变量类型,申明后不是用默认值
(1)int 默认 0
(2)string默认 空串
(3)float默认 float64 0
(4)bool faulse
2.根据值判断类型
var num = 10.11
3.省略var
且‘=’左边的变量不应该是已经申明的,即不能重复申明,不然会报错。
name:="tom”
4.可多变量申明
① 直接法
var n1,n2,n3 int
② 对应法
var n1,n2,n3 = 100,"tom",888
③ 类型推导法
n1,n2,n3 := 100,"tom",888
④ 一次性申明全局变量
即在函数外声明变量
二、常量
(一)声明
1、一般写法
const 常量名 [类型] = value //类型可以不写,因为有类型推导
2、专业写法
const (
a = iota // a=0
b // b=1 后面依次加一
c // c=2
)
(二)注意事项
1、常量在申明时必须赋值
2、常量不能修改
3、只有基本数据类型
4、golang中没有常量名必须大写的规定
5、仍然可以通过首字母大小写来控制常量的访问范围
三、 “+” 的使用
(1)数值:数学加法
(2)字符串:拼接
四、数据类型介绍
(一)基本数据类型以及介绍
1.数值型
(1)整数型
- 有些有符号位eg: int8
- 定义变量下 保小不保大,节省空间,但是要溢出,结果可能不同,所以考虑范围。
- 1bite = 8bit
- 查看a变量的数据类型和占用 字节 大小
数据类型
fmt.Printf("%T",a)
字节(引包)
package main
import (
"unsafe"
)
func main(){
var a int64 = 60.23
fmt.Printf("%d",unsafe.Sizeof(a))
}
(2)浮点型 float32 float64(小数类型)
5. 浮点数都是有符号位
6. 尾数位可能精度损失
7. 科学计数法
num :=5.1234e2 //10^2
num :=5.1234E2 //10^2
num :=5.1234E-2 //10^(-2)
2.字符型(char)
- 无专门字符型,只能用byte,保存单个字符,所以汉字存不下一位,可以用rune保存(int32别名),表示一个unicode码点。
(go:utf-8)
var c1 byte = 'a'
- 直接输出字符,则输出码值
fmt.Printf("c1=",c1)
- 输出字符值,则格式化输出
fmt.Printf("c1=%c",c1)
- 汉字
var c3 byte = "北" //溢出
fmt.Printf("c1=%c",c1)
var c3 int = "北" //成功
fmt.Printf("c1=%c",c1)
如果保存的字符是在ASCII,直接保存到byte,若>225,则考虑int
注意输出值时,格式化输出
查看码值 http://www.mytju.com/classcode/tools/encode_utf8.asp
3.布尔bool
- 真假逻辑,只占一个字节
var b = false
- 应用:
if
for
4.字符串 string
- go的字符串由字节组成
var adress string = "中国 hello"
- golang字符串是不可变的,一旦赋值不可更改
eg: adress[0] = 'a' 是错的
- 双引号识别转义字符
- 反引号以字符原生形式输出,包括换行和特殊字符,例如输出源代码,防止攻击。
str:=`
package main
import (
"fmt"
"unsafe"
)
func main(){
var b =false
fmt.Println("b=",b)
}
`
fmt.Printfln(str)
- 当拼接很长时,可以分行写,但每一行必须以+结尾。
(二)数据结构
(1)指针
- 指针变量存的是一个地址,指针指向的空间存的才是值
var ptr *int = &num //ptr指针,指向num,类型为int型指针
- 值类型:都有对应的指针类型,形式为 *数据类型,指针类型要和所指的数据结构类型要一致
值类型包括:基本数据类型int系列、float系列、bool系列、string系列、数组和结构体struct - 练习 + 简单案例说明:
package main
import (
"fmt"
_ "fmt"
)
func main(){
//基本数据类型在内存之间的布局
var i int = 10
//i的地址
fmt.Println("i的地址",&i)
//ptr一个指针,类型为int, 指向i,ptr本身也有一个地址
var ptr *int = &i
fmt.Printf("ptr=%v\n",ptr)
fmt.Print("ptr 的地址是%v\n",&ptr)
fmt.Printf("ptr 指向的值=%v\n", *ptr)
fmt.Println("练习1:输出一个变量的地址\n")
var num2 int = 9
fmt.Printf("num2 adress = %v\n",&num2)
fmt.Printf("练习题2:将num3的地址赋给指针str2并通过ptr去修改num的值:\n")
var num3 int = 99
var str2 *int = &num3
*str2 = 100
fmt.Printf("修改后的值是%v\n",num3)
}
tips:
- 值类型和引用类型
1)值类型:
①基本数据类型int系列、float系列、bool系列、string系列、数组和结构体struct
②变量直接分配,内存在栈中分配
2)应用类型:
①指针、slice切片、map、管道chan、接口interface等
②变量存储一个地址,地址对应空间才是真正存储的值,内存通常在堆区分配,当没有任何变量引用这个地址时,则地址对应数据空间成为垃圾,由GC回收。 - 标识符的命名和规范
1)概念:凡是命名的地方就是标识符
2)规范:a到z A到Z 0到9 和下划线(是空标识符,用于占用,即不可单独使用)
3)数字不可开头
4)区分大小写
5)不可有空格
6)保留关键字不可作为标识符
预定义标识符
7)包名:保持package和所在文件夹目录一致,名字简短有意义,不要和标准库冲突
8)要使用其他包里面自定义函数或者其他变量时时 ,引包要写该函数存在的go文件的路径
package main
import(
"fmt"
"go_code/chapter1/demo/model"
)
9)驼峰命名法
(2)数组
https://blog.csdn.net/qq_43681877/article/details/104084507
(3)结构体
https://blog.csdn.net/qq_43681877/article/details/104095171
(4)管道
https://blog.csdn.net/qq_43681877/article/details/104168996
(5)函数
https://blog.csdn.net/qq_43681877/article/details/103074131
(6)切片
https://blog.csdn.net/qq_43681877/article/details/104084507
(7)接口
https://blog.csdn.net/qq_43681877/article/details/104106952
(8)map
https://blog.csdn.net/qq_43681877/article/details/104088927
(三)数据类型转换(基本数据类型)
var i int32 = 100 //赋值
var n1 float32 = float32(i) //转换
- 被变量转换的是变量存储的数据,变量本身的数据结构没有变
- int64->int8,不会报错,但是会按照溢出处理
- 基本数据类型与string的转换
①数据类型转string
(1)fmt.Sprintf("%参数",表达式) ————推荐
查看官方文档 https://studygolang.com/pkgdoc
//数据相互转换
package main
import (
"fmt"
_ "fmt"
_ "unsafe"
)
func main(){
var num1 int =90
var num2 float64 = 23.456
var b bool = true
var myChar byte = 'h'
var str string //空的字符串
//方法一
str = fmt.Sprintf("%d",num1)
fmt.Printf("str type %T str=%q\n" ,str,str)
str = fmt.Sprintf("%f",num2)
fmt.Printf("str type %T str=%q\n" ,str,str)
str = fmt.Sprintf("%t",b)
fmt.Printf("str type %T str=%q\n" ,str,str)
str = fmt.Sprintf("%c",myChar)
fmt.Printf("str type %T str=%q\n" ,str,str)
(2)strconv包的使用
//数据相互转换
package main
import (
"fmt"
_ "fmt"
"strconv"
_ "unsafe"
)
func main(){
var num1 int =90
var num2 float64 = 23.456
var b bool = true
var myChar byte = 'h'
var str string //空的字符串
//方法二 strconv函数
var num3 int =90
var num4 float64 = 23.456
var b2 bool = true
str = strconv.FormatInt(int64(num3),10)
fmt.Printf("str type %T str=%q\n" ,str,str)
str = strconv.FormatFloat(num4,'f',10,64)
fmt.Printf("str type %T str=%q\n" ,str,str)
str = strconv.FormatBool(b2)
fmt.Printf("str type %T str=%q\n" ,str,str)
}
②string转数据类型
https://blog.csdn.net/qq_43681877/article/details/104083633