Fork me on GitHub

Go基础知识梳理(一)

Go基础知识梳理(一)

Go中package的用法及作用

package hello

用于分包,Go通过包来管理命名空间

import (
    "hello" //通过import关键字来使用包
)

Go中的25个关键字

break default func interface select case defer go map struct chan else goto package switch const fallthrough if range type continue for import return var

用法说明

package //定义包名的关键字
import //引入包名的关键字
const //常量声明关键字
var  //变量声明关键字
func //函数定义关键字
defer //延迟执行关键字
go //新起协程关键字
return //函数返回关键字
struct //结构体定义关键字
interface //接口定义关键字
map //声明或创建map类型关键字,key->value类型
chan //声明或创建通道关键字
if else //条件关键字
for range break continue //循环使用的关键字
switch select case default fallthrough 
package person 

//interface 用于定义接口
type Person interface {
    Say()
}

//type就是声明的意思,struct是用于定义结构体
type Man struct {
    Name string
}

//const 用于定义常量, var同理, var还可以用来定义变量
const (
    SEX_MAN = itoa
    SEX_WOMAN
)

内置类型

整型
 byte int int8 int16 int32 int64
 uint uint8 uint16 uint32 uint64 uintprt

浮点型
 float32 float64
 注意:b := 12.00 会自动被推断为float64类型

复数型
 complex64 complex128
 
字符串型
 string rune
 
布尔型
 bool
 
常量值标识符
 true false //bool返回的值
 iota //用于连续的枚举类型自动递增
 nil //引用类型的默认值

变量以及常量的定义

var name string = ""
var sex int //会默认赋值为int的初始值0

func main() {
    name := "" //简短声明,仅函数内可用
}

在ubr的开发规范中, 在函数内最好都使用简短声明

type Day int

const (
    Mon Day = iota
    Tue //自动为1
    Wes //自动为2
)

指针

* 用于获取指针的值
& 用于获取值的存放地址

func sum(a, b int) *int {
    sum := a + b
    return &sum //sum值将会逃逸到堆上
}

数组

a := [3]int{1,2,3} //指定长度的数组定义
a := [...]int{1,2} //让初始化列表来指定数组长度
//数组定义后不能改变长度,切片可以

数组的访问
num := a[0]
for idx, item := range a {
    fmt.Println(index, item)
}

切片

切片的底层结构
type slice struct {
    array unsafe.Pinter //指向底层数组的指针
    len int //当前元素数量
    cap int //最大容量
}
//切片的创建,推荐用make内置函数
sli := make([]int, 10, 15) //初始化10个为0的值,最大容量为15
fmt.Printf("%v\n", sli) //输出的值为[0 0 0 0 0 0 0 0 0 0]

a := []int{0, 1, 2, 3, 4, 5}
fmt.Println(len(a)) //6 
fmt.Println(cap(a)) //6

b := make([]int, 2, 4) //指定初始化长度为2,容量为4
fmt.Println(len(b)) //2
fmt.Println(cap(b)) //4
c := a[0:3] //获取a切片的前三个数据
fmt.Println(len(c)) //3
fmt.Println(cap(c)) //6 底层还是a切片,所以容量是a的容量6
b = append(b, c...)
fmt.Println(len(b)) //5
fmt.Println(cap(b)) //8 当前长度小于容量,不进行扩容
b = append(b, a...)
fmt.Println(len(b)) //11 
fmt.Println(cap(b)) //16 当前长度大于8,所以进行扩容

d := make([]int, 2) 
copy(d, c) //复制切片数据
fmt.Println(d)
fmt.Println(len(d))
fmt.Println(cap(d))

Map

//第一种定义方法
ma := map[int]string{}
for i := 0; i < 5; i++ {
	ma[i] = strconv.Itoa(i)
}
for k, v := range ma { //无序遍历,遍历顺序不固定
	fmt.Println("key", k, "value", v)
}
//第二种定义方法
m2 := make(map[int]Man, 10)
man1 := Man{
	Name: "man1",
}
m2[0] = man1
for k, v := range m2 {
	fmt.Println("key", k, "value", v)
}

if语句

写法介绍 条件语句不用加()
bo := true
if bo {
    return true
}
return false

switch语句

写法介绍
var i uint32 = 0
switch i {
    case 0:
        fmt.Println("0")
    case 1:
        fmt.Println("1")
    case 2:
        fmt.Println("2")
    default:
        fmt.Println(">2")
}
posted @ 2022-01-14 12:01  小傅啊  阅读(105)  评论(0)    收藏  举报