我要开始学Golang了
开发环境的搭建
下载,到官网下载(下载地址可以是国内资源,go国内下载地址。)选择相应版本,点点点,指定bin地址,home and path环境变量会自动配置,在cmd执行 go versio可以查看是否正确下载。
如上图显示,则go语言开发环境搭建完成。
当然,开发工具最好是不要用记事本,什么编辑器顺手用什么,我就用idea吧。
HelloWorld
package main
import(
"fmt"
)
func main(){
fmt.Println("hello world!")
}
运行结果
hello world!
定义变量
//初始声明的变量在未赋值的情况下,是有初始值的
func variable1(){
var i int
var s string
//fmt.Print(i, s)
//格式化输出方式
fmt.Printf("%d %q\n", i, s)//0 ""
}
go语言声明变量使用var关键字,并且对于声明未赋值变量都拥有一个默认的零值。让NullPointerException见鬼去吧。
当然,我们可以给变量赋初值
//为变量赋初始值
func variable2(){
var i int = 3
var s string = "Jefflikie"
fmt.Printf("%d %q\n", i, s)// 3 "Jefflikie"
}
//为多个变量赋初始值
func variable3(){
var i, j int = 3, 8
var s string = "Jefflikie"
fmt.Printf("%d %d %q\n", i, j, s)// 3 8 "Jefflikie"
}
//声明多个变量
func variable4(){
var i, j int
var s string = "Jefflikie"
fmt.Printf("%d %d %q\n", i, j, s)// 0 0 "Jefflikie"
}
func variable5(){
var i int
var s string
// var 括号里声明可以自动类型识别
var(
a = 3
b = 4.1
c = '丁'
)
//fmt.Print(i, s)
//格式化输出方式
fmt.Printf("%d %q\n", i, s)//0 ""
fmt.Printf("%d %f %c\n", a, b, c)//3 4.100000 丁
}
当然,我觉得这不够方便,go是和Python写起来一样很方便的语言,我们这里可以自动识别变量的类型。
//赋值时可不必加上变量的具体类型,go会自行判断
func variable5(){
var i, j = 3, 9
var s = "Jefflikie"
fmt.Println(i, j, s)// 3 9 "Jefflikie"
}
// 可以达到类似的赋值效果
func variable6(){
var i, j, k, l = 3, 9, true, "frank"
var s = "Jefflikie"
fmt.Println(i, j, s, k, l)// 3 9 Jefflikie true frank
}
我们最常使用的变量赋值方式还是
// 省去var关键字,:=的意思就是,定义并声明变量
func variable7(){
i, j, k, l := 3, 9, true, "frank"
// 既然:=是定义并赋值,那么我们后面再进行定义赋值就是重复定义了,所以会报错
//i := 5
i = 5
s := "Jefflikie"
fmt.Println(i, j, s, k, l)// 5 9 Jefflikie true frank
}
- 注意这种方式的变量定义只能用在func函数里,在包内,函数外的变量还是需要使用var关键字来定义变量;
- printf和println打印的区别,printf 是格式化打印;
// printf与println的区别
func variable8(){
m, d := "jefflike", 100
// 可以格式化打印
fmt.Printf("name is %s and age is %d", m, d)
// 可以换行
fmt.Println("neme is ", m, "age is ", d)
}
- 匿名函数的使用
// 匿名变量的使用
func NoName() {
// go语言定义的变量都要使用到,否则就会编译不通过
a, _ := NBFunc()
fmt.Printf("返回的有用的结果是%s", a)
}
// 假设这是一个第三方的API,会返回多个结果
func NBFunc() (string, string) {
return "能用到的结果", "没啥卵用的结果"
}
内建变量
bool,string
string类型每种编程语言里都有,go语言的string类型与其他语言基本上使用也没什么差别,就不多说了,默认零值是空字符串。
func main() {
a := "我爱你北京"
fmt.Println(len(a))//15
}
bool类型在Python里是可以和0,1等价的,但是在Golang里,bool和0,1无法等价,只能代表真假默认零值是false。
float32, float64
go语言里没有double的类型,float32, float64作为浮点数类型
与其他语言一样,浮点型会丢失精度,float64类型比float32精确度高一些。
int
每一种int的类型都可以分为有无符号的整形,加u就是无符号整型
int8-64,规定了长度,int不规定长度,那么在32位系统的长度就是32位,64位系统为64位
uintptr(指针)
(u)int, int8, ingt16, int32, int64, uintptr
byte,rune
rune是go语言的字符型,但是不同于其它语言的char,rune长度是32位的(4个字节),其实在现在的全球化(汉字单个字utf8是三个字节(24位),Unicode都是两个字节(16位))
一个字符的char类型已经是一个坑了,所以rune更加好用。
byte就是一个字节长度的8位
complex64,complex128
complex64,complex128 很少见的把复数类型作为了内建的变量类型.
complex的类型是complex64与128,他的实部与虚部分别是32位和64位的float,float浮点型都是不够精准的.
强制类型转换
go语言里只有强制类型转换,没有隐式类型转换,如变量提升这种,所以类型需要显示的强制类型转换。但是一定要是可以互相转换的类型,才可以进行这样的数据型转换。像bool和int就不能够转换。
// 强制类型转换的小例子,勾股定理
func trianagle(){
a, b := 3, 4
var c int
// math.Sqrt要求参数是一个浮点类型,但是我们的a与b都是整型,不能进行自动的类型转换
//需要我们手动进行类型转换
//同理我们math.Sqrt的结果也是浮点型,我们定义了int型的c接收就必须强制类型转换
//c = int(math.Sqrt(a * a + b * b))
c = int(math.Sqrt(float64(a * a + b * b)))
fmt.Println(c)
}
Golang中scan的两种方式
// 键盘输入的两种方式
func input1 () {
var a int // 声明变量a
fmt.Println("请输入:")
fmt.Scanf("%d", &a)
fmt.Println("a is ", a)
}
func input2 () {
var b int // 声明变量a
fmt.Println("请输入:")
fmt.Scan(&b)
fmt.Println("b is ", b)
}