Go语言 入门

配环境

GoLand下载地址
sdk地址
然后激活码网上找找就可以了

Hello World

Go程序都是包形式的,头文件就是导入包,注意单文件编程包名必须是 main

package main

import "fmt"

func main() {
	fmt.Println("Hello World")

导出名

导入的包里的函数只有开头大写才是导出的,否则都是未导出的,所以注意大小写

package main

import "fmt"

func main() {
	fmt.println("Hello World") //报错
}

变量,函数,类型的声明

声明变量go 和 c 不一样,具体的数据类型是写在后面的,变量名前加一个 var ,表示你要声明一个变量
var a int = 1
也可以简写,把 var 和 int 都去掉,= 改为 :=,a 的具体类型会由编译器自行判断
a:=1
函数的声明也差不多,返回值放到最后,前面加上 func 表示要声明函数

func f (a int) int{
	return a+1
}

类型的声明可以看作是 C++ 的typedef,可变量函数也差不多,前面加上type
type FLOAT float32

多值返回

go 相比 C 有个很方便的地方在于可以返回多个值

func f(a int) (int,int) {
	return a+1,a+2
}

返回值命名

go 这个函数的结构让返回值看起来像是形参列表,所以甚至可以给他们命名

func f(a int) (c int, d int) { //效果跟上面的是一样的
	c=a+1
	d=a+2
	return
}

循环

go 中 for 的用法和 c 是一样的

for i:=1;i<=10;i++ {
	fmt.Println(i)
}

除此之外 for 也可以实现跟 c 中 while 一样的功能,用法跟 while 是一样的

a:=10
for a!=0{
	a--
}

死循环就是光一个 for

for {
		break
	}

if

用法跟 c 中一样,不同的是它可以像 for 一样赋个初值

if a:=1;a==1{
		fmt.Println("true")
	}

另外关于 else ,要注意必须跟 if 函数体最后一行在同一行,换行会报错

if a := 1; a == 1 {
		fmt.Println("true")
	} else {
		fmt.Println("false")
	}

指针

没错,go 也是有指针的,初始化解引用啥的都跟 c 一样,但注意 go 没有指针运算

var a *int
b:=1
a=&b
fmt.Println(*a)
a++ //报错

结构体

跟 C 没什么区别,初始化的时候加上 key 就可以不按顺序

type node struct {
	x, y int
}

func main() {
	a := node{1, 2}
	b := node{y: 1, x: 2}
	fmt.Println(a.x, a.y, b.x, b.y)
}

值得注意的时候 go 里面如果是指针指向结构体,不用像 C 一样解引用或者用 -> ,go可以隐式解引用

a := node{1, 2}
b := &a
fmt.Println((*b).x,(*b).y)
fmt.Println(b.x, b.y) //隐式解引用

数组

和 c 一样,声明完后就不能改大小了,但是 go 提供了更灵活的切片

var a [2]int
a[0] = 1
a[1] = 2
b := [3]int{1, 2, 3}
fmt.Println(b)

切片

可以看作是指像数组的某一段子数组,但不同的是切片是可以扩张或缩小的,如果扩张到比底层数组还打了,那么底层的大小也会变化,这个可以用 cap 查看

var a [2]int
a[0] = 1
a[1] = 2
b := a[0:2]
fmt.Println(b, cap(b))
for i := 1; i <= 10; i++ {
	b = append(b, i)
}
fmt.Println(b, cap(b))
//输出是
//[1 2] 2
//[1 2 1 2 3 4 5 6 7 8 9 10] 16

当然了,想建前片也没必要每次都先建个数组,再建切片,本身切片底层的数组就可以是匿名的,以下是直接声明切片的文法,相比数组就是少了个声明大小

a := []int{1, 2, 3}
a = append(a, 4)
fmt.Println(a, cap(a))

也可以用内置函数 make 得到一个切片,其中第二个参数是切片的大小,第三个是底层的容量,有点像 C++ 的 vector

a := make([]int, 3, 5)
a = append(a, 4)
fmt.Println(a, cap(a))

切片也支持切片的切片,但要是制定行列的大小可能有点麻烦,可能有简单的声明方法,但我还没学到

a := [][]int{
	[]int{1, 2, 3},
	[]int{3, 4, 5},
	[]int{6, 7, 8},
}
fmt.Println(a)
n := 2
m := 3 //指定长宽
b := make([][]int, n)
for i := 0; i < n; i++ {
	b[i] = make([]int, m)
}
fmt.Println(b)

range

用于遍历切片或者映射,用法跟别的语言遍历也差不多,区别是 go 可以返回两个值,第一个是索引,第二个是那个值的拷贝,也可以用 _ 表示省略,但要注意的是如果只有一个值那代表的是索引,这跟别的语言不一样

a := []int{1, 2, 3}
for i, v := range a {
	fmt.Println(i, v)
}
for _, v := range a {
	fmt.Println(v)
}

映射

跟 C++ 的 map 也差不多,文法记住就行

mp := map[string]int{
	"name": 1,
	"age":  2,
}
fmt.Println(mp)

这是一些 go 的基础语法,其它的之后有空再更把

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值