GO复习笔记--基础语法

212 阅读2分钟

笔记仅于自己复习

函数里的知识内容如下

  • base1()//变量、输入、打印
  • base2()//条件、循环、函数
  • base3()//数组、字典、结构体、类

最下面main函数可查看对应base函数输出的值

package main

import (
   "fmt"
   "math/rand"
   "time"
)

//import . "fmt"//导入所有包
//import otherName "fmt"//取别名
//import _ "fmt"//忽略此包

//变量、输入、打印
func base1() {
   //一个文件夹只能有一个main
   a := 78//临时变量
   a += 800
   var b, c int //初始值为0
   var d int = 100
   e, f, g := 2, 5, 8
   f, g = g, f
   const h string = "this_is_const_h"
   var (
      i int    = 45
      j string = "this_is_j"
   )

   const (
      //iota在const自动自动增长,如果是同一行,值都一样
      k = iota //0
      m = iota //1
   )
   o := 3 + 4i
   /*
      类型:bool(true,false)、byte、rune(4,储存unicode码,可储存中文字符)、
      int、uint、complex64/128(复数类型)、uintptr(4,指针类型)
   */
   n := '中'
   fmt.Printf("a=%d,c=%d\n\a", a, c)
   //%T操作变量所属类型
   // %v自动匹配格式输出
   fmt.Println(a, "556", b, c, d, e, f, g, h[1:3], i, j, n, o)
   fmt.Println(real(o), imag(o)) //复数的实部虚部
   var sa string
   fmt.Scanf("%s", &sa)
   println(sa)
   fmt.Scan(&sa)
   println(sa)

   fmt.Printf("%d", int('a')) //类型转换
   //bool不可以转int

   type newName int
}

//多返回值,匿名返回
func f3() (int, int, int) {
   return 1, 2, 5
}

func f2(a ...int) (result int) {
   //两种返回
   result = 7
   return 2
}

//e为不定参数
func f1(a, b int, c, d string, e ...int) int {
   f2(e...) //e里的所有值都传入f2
   f2(e[4:]...)
   return 1
}

//条件、循环、函数
func base2() {
   var a = 10
   //if语句写法1
   if a == 12 {
   } else {
   }

   //if语句写法2
   //第一个为赋值,第二个为条件
   if a = 10; a == 10 {
   }

   //第一个初始化,第二个条件
   switch a = 4; a {
   case 1: //默认不写break
      fallthrough //执行下面的
   case 2:
      fallthrough //执行下面的
   case 3, 4, 5:
   default:
   }

   //for1
   for i := 0; i < 100; i++ {
   }
   //for2
   str := "hello"
   for i, s := range str {
      fmt.Printf("【i=%v,s=%v】", i, s)
   }

   //for3
   for i := range str {
      fmt.Printf("【i=%v,s=%v】", i, str[i])
   }

   //for3默认为true
   for {
      break
   }

   goto laber1

laber1:

   //函数类型
   type TF1 func() (int, int, int)
   var tf TF1
   tf = f3
   tf()
   tf()
   tf()
   tf() //tf内的变量依然存在,不会被释放(可用来做自增)

   func() (int, int) { return 1, 2 }() //匿名函数并调用
   var ff2 = func() {}
   ff2()

   defer println("在函数结束前调用defer") //多个defer,先进后出,堆
   println("序号1")

}

type char byte

func (c char) disp() { //绑定函数
   fmt.Printf("%c", c)
}

//接口
type api interface {
   //只有声明,没有实现
   apiFunc()
}
type mint int

//接口绑定,只针对自定义数据类型
func (c char) apiFunc() {
   fmt.Print(c)
}
func (i mint) apiFunc() {
   fmt.Print(i)
}

type person struct {
   Name string
   age  int
}

//多重继承,嵌套多个结构体
type person2 struct {
   person //匿名继承
   int
}

func (p *person) GetAge() int    { return p.age }
func (p *person) SetAge(age int) { p.age = age }

// NewPerson 构造函数
func NewPerson(name string) *person { return &person{Name: name} }

//数组、字典、结构体、类
func base3() {
   var a = [40]int{8, 5, 9, 6, 15: -1, 20: -89} //部分初始化:下标:值
   b := [20][30]int{
      {1, 2, 5},
      5: {1, 2, 4, 8: -55},
   }
   fmt.Println(a)
   fmt.Println(b)
   //var b[n]int//不能用n
   for i := range a {
      a[i] = i
   }

   c := [5]int{1, 2, 3}
   d := [5]int{1, 0, 3}
   fmt.Println(c == d, c != d) //false true

   //随机数
   rand.Seed(time.Now().UnixNano()) //设置种子
   fmt.Println(rand.Intn(100))

   var e = []int{1, 2, 3, 4, 5}
   f := []int{1, 2, 3, 4, 5}
   g := e[1:3:4]           //内容[1,3)容量3
   h := make([]int, 5, 10) //len=5,cap=10,5个0
   fmt.Println(e, f, g)
   fmt.Println(len(g), cap(g)) //2 3
   h = append(h, 4)
   fmt.Println(h) //[0 0 0 0 0 4]
   copy(g, h)     //h->g

   m1 := map[byte]string{
      'a': "hello",
      'b': "world",
   }
   m1['c'] = "C++"

   fmt.Println(m1)

   for key, val := range m1 {
      fmt.Println(key, val)
   }

   val, ok := m1['d'] //是否存在键
   fmt.Println(val, ok)
   delete(m1, 'c')

   //首字母大写结构体(类)是public,小写private,属性方法也一样
   type ST1 struct {
      v1   string
      v2   int
      next *ST1
   }

   var st1 = ST1{"444", 8, new(ST1)}
   var st2 = &ST1{v1: "444", v2: 8}

   fmt.Println(st1, st2, st1.v2, st2.v1, (*st2).v1) //st2.v1与(*st2).v1等价
   fmt.Println(st1 == *st2, st1 != *st2)            //false true

   var st3 ST1
   st3 = st1
   fmt.Println(st3)

   type ST2 struct {
      v2  int
      ST1 //继承ST1中的属性
      v3  int
   }

   st21 := ST2{500, ST1{"sss", 44, new(ST1)}, 40}
   st21.v1 = "hello struck"
   st21.ST1 = ST1{"hej", 78, new(ST1)}
   st21.ST1.v2 = 45
   fmt.Printf("%+v", st21)

   ch1 := char('a')
   ch1.disp()     //方法绑定
   cf := ch1.disp //方法值
   cf()
   cf1 := (*char).disp //方法表达式1
   cf1(&ch1)
   cf2 := char.disp //方法表达式2
   cf2(ch1)

   var aa [4]interface{}
   aa[1] = 1234
   aa[2] = "asdfg"
   aa[3] = [5]int{1, 2, 5, 85}
   fmt.Println("\n\naa>>>", aa)

   var bb int
   bb = aa[1].(int) //断言,aa[]是空接口类型,不能直接赋值给bb,需要断言
   fmt.Println(bb)

   {
      a := NewPerson("hello")
      a.SetAge(58)
      var b person2
      b.person = *a
      b.int = 10 //直接访问匿名字段
      fmt.Println(a)
      fmt.Println(b)
   }

}

func base4() {

}

func main() {
   //base1()//变量、输入、打印
   //base2()//条件、循环、函数
   //base3()//数组、字典、结构体、类
   base4()
}