美文网首页
Go 知识点

Go 知识点

作者: scpy | 来源:发表于2019-01-21 21:04 被阅读0次

    Go 知识点

    定义变量自动赋类型

    var v1 int
    var v2 string
    var v3 [10]int  // 数组
    var v4 []int // 数组切片
    var v5 struct {
    f  int
    }
    var v6 *int // 指针
    var v7 map[string]int  // map,key为string类型,value为int类型
    var v8 func(a int) int
    v_name := value
    name, age := "naveen", 29 // 简短声明
    

    字符串和数字相互转化

    //字符串转数字,要做错误处理
    start, err := strconv.Atoi(page)
    if err != nil {
      return
    }
    end, err := strconv.Atoi(size)
    if err != nil {
     return
    }
    //数字转字符串 
    //page_start := strconv.Itoa(start)
    //page_end := strconv.Itoa(end)
    

    循环

      numbers := [6]int{1, 2, 3, 5} 
    
       /* for 循环 */
       for a := 0; a < 10; a++ {
          fmt.Printf("a 的值为: %d\n", a)
       }
    
       for a < b {
          a++
          fmt.Printf("a 的值为: %d\n", a)
       }
    
       for i,x:= range numbers {
          fmt.Printf("第 %d 位 x 的值 = %d\n", i,x)
    

    函数

    func cal(price, num int) int {
       total := price * num
       return total
    }
    
    func rectProps(length, width float64)(area, perimeter float64) {  
        area = length * width
        perimeter = (length + width) * 2
        return // 不需要明确指定返回值,默认返回 area, perimeter 的值
    }
    

    空白符

    _ 代替未用到的变量
     area, _ := rectProps(10.8, 5.6) 
    
    if else
    if condition {  
    } else if condition {
    } else {
    }
    
    ### 常量 const
    switch case
     finger := 4
        switch finger {
        case 1:
            fmt.Println("Thumb")
    fallthrough   //继续执行case
        case finger >= 2:
            fmt.Println("Index")
    case finger >= 2:
            fmt.Println("Index")
    default:
    fmt.Println("Defalut")
    

    数组 [n]T

    Go 语言中不允许混合不同类型的元素
    interface{} 类型数组,可以包含任意类型
     var a [3]int
     a := [3]int{12, 78, 50}
     a := [3]int{12}
     num := [...]int{5, 6, 7, 8, 8}
     for i, v := range a {//range returns both the index and value  //_,v 
            fmt.Printf("%d the element of a is %.2f\n", i, v)
            sum += v
    

    多维数组

    a := [3][2]string{
       {"lion", "tiger"},
       {"cat", "dog"},
       {"pigeon", "peacock"}, // this comma is necessary. The compiler will complain if you omit this comma
    }
    

    切片

    fruitslice := fruitarray[1:3]
    //make切片  
    i := make([]int, 5, 5)
    //添加
    car = append(car,"Toyata")
    ### 长度和容量
    len(cars)   和  cap(cars)
    ### 数组相加
    veggies := []string{"potatoes", "tomatoes", "brinjal"}
    fruits := []string{"oranges", "apples"}
    food := append(veggies, fruits...)
    
    

    字典

    personSalary := make(map[string]int)
    

    指针

    b := 255
    var a *int = &b
    

    结构体

    type Employee struct {  
        firstName, lastName string
        age, salary         int
    }
    

    匿名结构体

    var employee struct {
        firstName, lastName string
        age int
    }
    

    方法

    func (e Employee) displaySalary() {       //e Employee 接收器 e
        fmt.Printf("Salary of %s is %s%d", e.name, e.currency, e.salary)
    }
    
    func main() {
        emp1 := Employee {
            name:     "Sam Adolf",
            salary:   5000,
            currency: "$",
        }
        emp1.displaySalary() // 调用 Employee 类型的 displaySalary() 方法
    }
    

    信道

    a := make(chan int)
    data := <- a // 读取信道 a  
    a <- data // 写入信道 
    

    类型断言与选择

    • 类型断言
    package main
    
    import "fmt"
    
    func assert(i interface{}) {
       v,ok := i.(int)
       fmt.Println(v,ok)
    }
    func main() {
       var s interface{} = "hello"
       assert(s)
       var i interface{}  = 56
       assert(i)
    }
    
    • 类型选择(Type Switch)
    package main
    
    import (
       "fmt"
    )
    
    func findType(i interface{}) {
       switch i.(type) {
       case string:
          fmt.Printf("I am a string and my value is %s\n", i.(string))
       case int:
          fmt.Printf("I am an int and my value is %d\n", i.(int))
       default:
          fmt.Printf("Unknown type\n")
       }
    }
    func main() {
       findType("Naveen")
       findType(77)
       findType(89.98)
    }
    

    接口与空接口

    • 接口
    package main
    
    import "fmt"
    
    //创建VowelsFinder的接口  该接口有一个 FindVowels 的 方法
    type VowelsFinder interface {
       FindVowels() []rune
    }
    
    type MyString string
    
    func (ms MyString) FindVowels() []rune  {
       var vowels []rune
       for _,rune :=range ms{
          if rune =='a' || rune == 'e' || rune == 'i' || rune == 'u'|| rune == 'o'{
             vowels =append(vowels,rune)
          }
       }
       return vowels
    }
    
    func main() {
       name := MyString("sam Anderson")
       var v VowelsFinder
       v = name
       fmt.Printf("Vowels are %c",v.FindVowels())
    }
    
    • 空接口
    package main
    
    import (
       "fmt"
    )
    
    func describe(i interface{}) {
       fmt.Printf("Type = %T, value = %v\n", i, i)
    }
    
    func main() {
       s := "Hello World"
       describe(s)
       i := 55
       describe(i)
       strt := struct {
          name string
       }{
          name: "Naveen R",
       }
       describe(strt)
    }
    }
    

    接口用途

    package main
    
    import "fmt"
    
    type SalaryCal interface {
       Cal() int
    }
    
    // 长期员工 薪资是 basicpay 与 pf 相加之和
    type Parmanent struct {
       empId int
       basicpay int
       pf int
    }
    
    //合同员工 只有基本工资 basicpay
    type Contract struct {
       empId int
       basicpay int
    }
    
    func (p Parmanent) Cal() int {
       return p.basicpay +  p.pf
    }
    
    func (c Contract) Cal() int {
       return c.basicpay
    }
    
    //接收一个 SalaryCalculator 接口的切片([]SalaryCalculator)作为参数
    func totalExpense(s []SalaryCal){
       expense := 0
       for _,v := range s{
          expense += v.Cal()
       }
       fmt.Printf("Total Expense Per Month $%d",expense)
    }
    
    func main() {
       pemp1 := Parmanent{1,5000,20}
       pemp2 := Parmanent{2,6000,30}
       cemp1 := Contract{3,3000}
       employees := []SalaryCal{pemp1,pemp2,cemp1}
       totalExpense(employees)
    }
    

    指针

    指针
    尽管 Go 语言没有提供继承机制,但可以通过嵌套其他的接口,创建一个新接口。
    和 & 可以互相抵消,同时注意,&可以抵消掉,但&是不可以抵消的 a和&a是一样的,都是a的值,值为1 (因为&互相抵消掉了) 同理,a和&&&&a是一样的,都是1 (因为4个&互相抵消掉了)

    相关文章

      网友评论

          本文标题:Go 知识点

          本文链接:https://www.haomeiwen.com/subject/lbvhjqtx.html