之前我学过C、Java、Python语言时总结的经验:
- 先建立整体框架,然后再去抠细节。
- 先Know how,然后know why。
- 先做出来,然后再去一点点研究,才会事半功倍。
- 适当的囫囵吞枣。因为死抠某个知识点很浪费时间的。
- 对于GO语言,切记遵守语法格式规则。(例如python语言、例如SpringBoot框架等)
解释:某些知识点,就是很难了解,那么先做出来,然后继续向前学习,可能在某个时间点我们就会恍然大悟。
基本语法: var 变量名 数据类型
var a int
在声明变量的时候,就给值
var a int = 1
var b = 300
var a int
a = 100
例如下面的a/b/c都是变量
package main
import "fmt"
func main() {
var a int //声明变量
a = 10 //变量赋值
b := 20 //变量赋值
c := a + b //使用变量
fmt.Println(a) // 10
fmt.Println(b) // 20
fmt.Println(c) // 30
}
所有代码会用磁盘中读取到内存中,进行运行。
那么变量,例如a = 10 。那么就会存储到内存中。
Golang变量使用的三种方式
int类型默认为0
String类型默认为空
如果不指定类型,那么就会go语言类型推导。
var a = “abc” 在打印的时候就会输出string类型
两种方式:(方式一的两句话,等价于方式二)
> var name1 string
name1 = “zhangsan1” //方式一
name2 := “zhangsan2” //方式二
多变量声明
在编程中,有时我们需要一次性声明多个变量,Golang也提供这样的语法
形式一:
var a, a1, a2, a3 int
a = 10
a1 = 20
a2 = 30
a3 = 40
形式二:
var a1, a2, a3, name = 1, 2, 3, "zhangsan"
fmt.Println(a1,a12,a23,a4)
形式三:
a, b, c, d, name := 1, 2, 3, 4, "zhangsan"
fmt.Println(a,b,c,d,name)
关于全局变量:
var (
a = 1
b = 2
c = 3
d = 4
name = "zhangsan"
)
func main() {
fmt.Println(a, b, c, d, name)
}
参考的官网地址是:https://studygolang.com/pkgdoc
通用:
%v 值的默认格式表示
%+v 类似%v,但输出结构体时会添加字段名
%#v 值的Go语法表示
%T 值的类型的Go语法表示
%% 百分号
布尔值:
%t 单词true或false
整数:
%b 表示为二进制
%c 该值对应的unicode码值
%d 表示为十进制
%o 表示为八进制
%q 该值对应的单引号括起来的go语法字符字面值,必要时会采用安全的转义表示
%x 表示为十六进制,使用a-f
%X 表示为十六进制,使用A-F
%U 表示为Unicode格式:U+1234,等价于"U+%04X"
浮点数与复数的两个组分:
%b 无小数部分、二进制指数的科学计数法,如-123456p-78;参见strconv.FormatFloat
%e 科学计数法,如-1234.456e+78
%E 科学计数法,如-1234.456E+78
%f 有小数部分但无指数部分,如123.456
%F 等价于%f
%g 根据实际情况采用%e或%f格式(以获得更简洁、准确的输出)
%G 根据实际情况采用%E或%F格式(以获得更简洁、准确的输出)
字符串和[]byte:
%s 直接输出字符串或者[]byte
%q 该值对应的双引号括起来的go语法字符串字面值,必要时会采用安全的转义表示
%x 每个字节用两字符十六进制数表示(使用a-f)
%X 每个字节用两字符十六进制数表示(使用A-F)
指针:
%p 表示为十六进制,并加上前导的0x
简单的说,就是用于存放整数值的,比如 0,-1,2345 等等。
import (
"fmt"
unsafe "unsafe"
)
var n1 = 100
fmt.Printf("n1 的类型是 %T ", n1) //n1 的类型是 int
var n2 int64 = 1
fmt.Printf("n1 的数据类型是 %T, n2 占用的字节数是%d", n2, unsafe.Sizeof(n2))
// n1 的数据类型是 int64, n2 占用的字节数是8
Golang的浮点类型可以表示一个小数,比如1.2 / 3333.11 / 3232.324等等
开发过程中,推荐使用float64。 并且默认也是float64 .
Golang浮点类型有固定的范围和字段类型,不受具体操作系统的影响。
Golang 中没有专门的字符类型,如果要存储单个字符(字母),一般使用 byte 来保存。
字符串就是一串固定长度的字符连接起来的字符序列。Go 的字符串是由单个字节连接起来的。也就是说对于传统的字符串是由字符组成的,而 Go 的字符串不同,它是由字节组成的。
var n2 int = '你'
fmt.Printf("n2 的数据类型是 %T, n2 占用的字节数是%d. \n", n2, unsafe.Sizeof(n2))
// n2 的数据类型是 int, n2 占用的字节数是8.
var c3 int = '你'
fmt.Printf("c3 = %c \n", c3) //c3 = 你
fmt.Printf("%c", c3) //你
seg := true
fmt.Printf("%T \n", seg) //bool
fmt.Println("seg=", seg) //seg= true
if seg {
fmt.Println("如果是true, 我就打印")
} else {
fmt.Println("如果是false, 我就打印")
}
字符串就是一串固定长度的字符连接起来的字符序列。Go 的字符串是由单个字节连接起来的。Go语言的字符串的字节使用 UTF-8 编码标识 Unicode 文本。
var name string = "今年张三,英文ZhangSan,23岁了。"
fmt.Println(name)
var str = "hello"
str[0] = 'b' //这里就会报错了。字符串单个字符是不可变的。
可以直接从新赋值:
str ="word"
3. 字符串的两种表示方式
1. 双引号,会识别转义字符
2. 反引号,以字符串的原生形式输出,包括换行和特殊字符,可以实现防止攻击、输出源代码等效果。
4. 字符串拼接方式
str := "hello "
name := "zhangsan"
strName := str + name
fmt.Println(strName) //hello zhangsan
str := "lisi " + "wangwu " + " zhaoliu " + " a" +
" b" + "c " +
"D"
fmt.Println(str) //lisi wangwu zhaoliu a bc D
在Go中,数据类型都有一个默认值,当没有赋值时,就会保留默认值,在Go中,默认值又叫“零值”
Golang和java、C不同,在Go语言中,不同类型的变量之间赋值时需要显式转换。 也就是说Golang中数据类型不能自动转换。
基本语法:
var n1 int = 100
var n2 float64 = float64(n1)
n2 += 0.905
var n3 int = int(n2)
fmt.Printf("n1=%v, n2=%v, n3=%v", n1, n2, n3)
// n1=100, n2=100.905, n3=100
例如:
我们将 n1 float =1.23 转换成 n2 int = 100
那么分别打印 n1 =1.23. 打印n2 =100
var n1 float64 = 1.23
var n2 int = int(n1)
fmt.Printf(“n1=%v, n2=%v”, n1, n2)
// 打印结果:n1=1.23, n2=1
var n1 int64 = 999999
var n2 int8 = int8(n1)
fmt.Printf("n1=%v, n2=%v", n1, n2)
// n1=999999, n2=63
在程序开发中,我们经常需要将基本数据类型转成String类型。
或者String类型转换成基本数据类型。
方式一: fmt.Sprintf(“%参数", 表达式)
package main
import "fmt"
func main() {
var n1 int = 123
var n2 float64 = 1.23
var n3 byte = 'a'
var n4 bool = true
var str string
// %T 的意思是:该变量的类型
// %q 的意思是:打印变量的类型,并且用双引号,引起来。
str = fmt.Sprintf("%d", n1)
fmt.Printf("str的类型是:%T, Str等于%q\n", str, str)
str = fmt.Sprintf("%f", n2)
fmt.Printf("str的类型是%T,str等于:%q \n", str, str)
str = fmt.Sprintf("%c", n3)
fmt.Printf("str的类型是:%T,str等于%q \n", str, str)
str = fmt.Sprintf("%t", n4)
fmt.Printf("str的类型是%T,str等于%q \n", str, str)
}
str的类型是string, Str等于"123"
str的类型是string, str等于:"1.230000"
str的类型是:string str等于"a"
str的类型是string, str等于"true"
方式二:使用strconv包的函数
3. func FomatBool(b lool) String
4. func FomatInt(i int64, base int ) String
var num1 int = 123
var num2 float64 = 1.234
var num3 bool = true
var str string
fmt.Printf("num1的类型是:%T \n", num1)
str = strconv.FormatInt(int64(num1), 10)
fmt.Printf("str的类型是:%T,str的值是:%q \n", str, str)
//要转换的变量,
//'f':格式是:ddd.dddd。 一般使用的比较多
//精度(小数点后面几位),该float的位数,例如64/32
str = strconv.FormatFloat(num2, 'f', 2, 64)
fmt.Printf("str的类型是:%T,str的值是%q \n", str, str)
str = strconv.FormatBool(num3)
fmt.Sprintf("str的类型是:%T,str的值是%q", str, str)
num1的类型是:int
str的类型是:string,str的值是:"123"
str的类型是:string,str的值是"1.23"
Itoa 将int类型转为String类型:
var num1 int = 100
var str string = strconv.Itoa(num1)
fmt.Printf(str)
func ParseBool
func ParseBool(str string) (value bool, err error)
返回字符串表示的bool值。它接受1、0、t、f、T、F、true、false、True、False、TRUE、FALSE;否则返回错误。
var str string = "true"
var err error
var b bool
b, err = strconv.ParseBool(str)
fmt.Printf("b的类型是 %T,b的值是%v,b的错误结果是:%v \n", b, b, err)
func ParseInt
func ParseInt(s string, base int, bitSize int) (i int64, err error)
返回字符串表示的整数值,接受正负号。
base指定进制(2到36),如果base为0,则会从字符串前置判断,"0x"是16进制,"0"是8进制,否则是10进制;
bitSize指定结果必须能无溢出赋值的整数类型,0、8、16、32、64 分别代表 int、int8、int16、int32、int64;返回的err是*NumErr类型的,如果语法有误,err.Error = ErrSyntax;如果结果超出类型范围err.Error = ErrRange。
var str string = "123"
var i int64
// 要转的字符串,base:转成10进制,bitSize:转成64位
i, _ = strconv.ParseInt(str, 10, 0)
fmt.Printf("i的格式是:%T, i的值是:%v", i, i)
// i的格式是:int64, i的值是:123
解析一个表示浮点数的字符串并返回其值。
如果s合乎语法规则,函数会返回最为接近s表示值的一个浮点数(使用IEEE754规范舍入)。bitSize指定了期望的接收类型,32是float32(返回值可以不改变精确值的赋值给float32),64是float64;返回值err是*NumErr类型的,语法有误的,err.Error=ErrSyntax;结果超出表示范围的,返回值f为±Inf,err.Error= ErrRange。
var str string = "1.2345"
var f float64
f, _ = strconv.ParseFloat(str, 64)
fmt.Printf("f的类型是%T, f的值是:%v", f, f)
// f的类型是float64, f的值是:1.2345