go语言基础语法(上) | 青训营笔记

91 阅读3分钟

go语法

导包

import(
    "fmt"
)

Printf

格式化字符串并输出

func main() {
   // %d 表示整型数字,%s 表示字符串
    var stockcode=123
    var enddate="2020-12-31"
    var url="Code=%d&endDate=%s"
    fmt.Printf(url,stockcode,enddate)
}

Go 语言中使用 fmt.Sprintf 格式化字符串并赋值给新串:

func main() {
   // %d 表示整型数字,%s 表示字符串
    var stockcode=123
    var enddate="2020-12-31"
    var url="Code=%d&endDate=%s"
    var target_url=fmt.Sprintf(url,stockcode,enddate)
    fmt.Println(target_url)
}

以上两段代码输出结果为

Code=123&endDate=2020-12-31
  • %v

用%v可以输出任意类型的变量

fmt.Println("a=%v, b=%v\n", 1, 2)

可以用%+v来获取详细结果,用%#v获取更详细结果

变量与常量

  • 变量

var a string = "Runoob" //声明并初始化
var a1 = "RUNOOB"
var b, c int = 1, 2
var c bool //bool的默认值为false
var e []int{1, 2, 3} //数组的声明并初始化    
var a *int //go有指针
var a []int
var a map[string] int  //[key] value
var a chan int //
var a func(string) int
var a error // error 是接口

简写:

intVal := 1 
e := []int{1, 2, 3}

等于

var intVal int 
intVal =1 
var e []int{1, 2, 3}
  • 常量

多个相同类型的声明可以简写为:

const c_name1, c_name2 = value1, value2

多重赋值

const a, b, c = 1, false, "str" 

常量还可以用作枚举:

const (
    Unknown = 0
    Female = 1
    Male = 2
)
  • iota

iota,特殊常量,可以认为是一个可以被编译器修改的常量。

iota 在 const关键字出现时将被重置为 0(const 内部的第一行之前),const 中每新增一行常量声明将使 iota 计数一次(iota 可理解为 const 语句块中的行索引)。

第一个 iota 等于 0,每当 iota 在新的一行被使用时,它的值都会自动加 1;所以 a=0, b=1, c=2 可以简写为如下形式:

const (//枚举
    a = iota
    b
    c
)
  • 类型转换
string(a)

条件判断

  • if

golang的if后面不用加小括号 ,且必须加大括号

if a < 20 {...}
  • switch

两种写法

switch marks {
    case 90: 
        fmt.Printf("good")
}
switch {
      case marks == 90 :
        fmt.Printf("good" )  
}

切片

切片:可变长度的数组,类似于java的List

切片建立于数组之上,包含三个部分:指向的数组的地址、切片的长度、切片的容量

func main(){
    s := make([]string, 3)//用make创建切片
    s[0] = "a" //访问方式和数组一致
    s.append(s,"d")//切片用append追加元素并赋值给原来的s
    
    fmt.Printf(s[2:5]) //表示输出[2到5)
    fmt.Printf(s[:5])
}
func main(){
    s1 := make([]string, 3)//用make创建空切片
    
    var arr [6]int = [6]int{1,2,3,4,5,6}
    s2 := arr[1:3]//通过引用创建好的数组来创建切片
    //切片可以被继续切片
    
    s3 := []int{1,2,3}//在切片底层直接创建数组来创建切片
}

append发现s的容量不够会创建一个新切片,需要再赋值给原来的切片

可以用cap()函数来获取切片容量

可以使用copy()函数对切片进行复制,copy(a,b)是将b切片里下标对应的内容复制给a下标中的内容

map

  • map[key]value

例:

m := make(map[string]int)
  • 初始化:
m := make(map[string]int){"one":1,"two":2}
  • 访问:
m["one"] = 1//写入
fmt.Println(m)  // >>map[one:1 two:2]
fmt.Println(m[one])
  • 删除
delete(m,"one")

访问时增加一个”ok“来判断是否

  • range

    使用range遍历map(类似于java的Entry)

for k,v := range m {
    fmt.Println(k, v) // >>one 1; two 2
}
for k := range m{
    fmt.Println(k) // >>one; two
}

使用range遍历普通数组

nums := []int{2,3,4}
for i,num := range nums{
    //i是下标
    //num是内容
}

不需要索引时可以用下划线替代