Go语言学习|青训营笔记

37 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天

go语句不用分号隔开,除非一行要写多个语句,用户自己加分号,不过不建议这么做

go声明变量的类型一致都是放在后面

c:int a=10; go: var a int =10 “var name type的格式”

go中上面的语句可以写成

    四种方式:推荐后两种
    var a int =10

    var b int
    b=10
    
    var c="hello"  自动推导了c的类型
    
    **如果变量已经使用 var 声明过了,再使用 := 声明变量,就产生编译错误**
    d:="byebye" 等于var d string ="byebye"
    所以可以用:=直接声明初始化,不过:=只能用于函数体内,不能用于声明全局变量
    :=叫做初始化声明
多个变量声明
//类型相同多个变量, 非全局变量
var vname1, vname2, vname3 type
vname1, vname2, vname3 = v1, v2, v3

var vname1, vname2, vname3 = v1, v2, v3 // 和 python 很像,不需要显示声明类型,自动推断

vname1, vname2, vname3 := v1, v2, v3 // 出现在 := 左侧的变量不应该是已经被声明过的,否则会导致编译错误


// 这种因式分解关键字的写法一般用于声明全局变量
var (
    vname1 v_type1
    vname2 v_type2
)
var c, d int = 12  
var e, f = 123"hello"  
  
//这种不带声明格式的只能在函数体中出现  
//g, h := 123, "hello"


var a, b int
var c string
a, b, c = 5, 7, "abc"

go中if for不写括号

switch不用break,走到了相应的case自动会退出

go只有for

函数的声明 func add(a,b int) int{ }类型都后置了

go的函数可以返回多个值,有指针和引用传递

func swap(x, y string) (stringstring) {  
   return y, x  
}

go 语言程序中全局变量与局部变量名称可以相同,但是函数内的局部变量会被优先考虑

go声明数组:var arr[10] int

go数组初始化:

var arr=[5] int{1,2,3,4,5}
brr:=[3] int{1,2,3}

数组长度不确定了[]可以写... 根据后面数据去推导
长度确定了可以根据索引去初始化
//  将索引为 1 和 3 的元素初始化
balance := [5]float32{1:2.0, 3:7.0}

go的结构体,像c++一样也可以有自己的成员函数,go的结构体对象或者结构体指针访问成员都是用点.没有->

type Books struct {  
   title string  
   author string  
   subject string  
   book_id int  
}  
 
func main() {  
  
    // 创建一个新的结构体  
    fmt.Println(Books{"Go 语言""www""Go "6495407})  
  
    // 也可以使用 key => value 格式  
    fmt.Println(Books{title"Go 语言", author"www", subject"Go", book_id6495407})  
  
    // 忽略的字段为 0 或 空  
   fmt.Println(Books{title"Go", author"www"})  
}

go切片(动态数组),

 var slice1 []int = make([]int, 3)
	 slice2 := make([]int, 4)
	 //可以指定容量cap可选参数
	 make([]type, length, capacity)
         //初始化
         xx := []int{0,1,2,3,4,5,6,7,8}
         var pow = []int{1248163264128}
         
func main() {  
   var numbers []int  
  
   printSlice(numbers)  
  
   if(numbers == nil){  
      fmt.Printf("切片是空的")  
   }  
}  
  
func printSlice(x []int){  
   fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)  
}

len=0 cap=0 slice=[]
切片是空的

go范围循环range

for 循环的 range 格式可以对 slice、map、数组、字符串等进行迭代循环。格式如下:

for key, value := range oldMap {
    newMap[key] = value
}

以上代码中的 key 和 value 是可以省略。

如果只想读取 key,格式如下:

for key := range oldMap

或者这样:

for key, _ := range oldMap

如果只想读取 value,格式如下:

for _, value := range oldMap

go的map集合 无序

定义 Map

可以使用内建函数 make 也可以使用 map 关键字来定义 Map:

/* 声明变量,默认 map 是 nil */
var map_variable map[key_data_type]value_data_type

/* 使用 make 函数 */
map_variable := make(map[key_data_type]value_data_type)

如果不初始化 map,那么就会创建一个 nil map。nil map 不能用来存放键值对

var countryCapitalMap map[string]string /*创建集合 */  
    countryCapitalMap = make(map[string]string)

go中的类型转换是这样的

        括号把表达式包起来
         var z int=10
	var v int=20
	var m float32
	m=float32(z)/float32(v)
	fmt.Println(z,v,m)