go语言学习笔记(二)

一、if
if的条件里不需要括号
if的条件里可以赋值
if的条件里赋值的变量作用域就在这个if语句里

package main
 
import (
   "io/ioutil"
   "fmt"
)
 
func main() {
   const filename = "abc.txt"
   if contents, err := ioutil.ReadFile(filename); err != nil {
      fmt.Println(err)
   } else {
      fmt.Printf("%s\n", contents)
   }
/* if err != nil {
      fmt.Println(err)
   } else {
      fmt.Printf("%s\n", contents)
   }*/
}

二、strconv.Itoa(lsb) 转成字符串
三、函数
返回值类型写在最后面
可返回多个值
函数作为参数
没有默认参数,可选参数

package main
 
import (
   "fmt"
   "reflect"
   "runtime"
   "math"
)
 
func eval(a, b int, op string) (int, error) {
   switch op {
   case "+":
      return a + b, nil
   case "-":
      return a - b, nil
   case "*":
      return a * b, nil
   case "/":
      q, _ := div(a, b)
      return q, nil
   default:
      return 0, fmt.Errorf(
         "unsupported operation: %s", op)
   }
}
 
// 13 / 3 = 4 ... 1
func div(a, b int) (q, r int) {
   return a / b, a % b
}
//函数式编程
func apply(op func(int, int) int, a, b int) int {
   p := reflect.ValueOf(op).Pointer()
   opName := runtime.FuncForPC(p).Name()
   fmt.Printf("Calling function %s with args " +
      "(%d, %d)\n", opName, a, b)
   return op(a, b)
}
 
/*func pow(a, b int) int {
   return int(math.Pow(float64(a), float64(b)))
}*/
 
 
 
//可变参数列表
func sum(numbers ...int) int {
   s := 0
   for i := range numbers {
      s += numbers[i]
   }
   return s
}
 
 
func main() {
   if result, err := eval(3, 4, "x"); err!= nil{
      fmt.Println("Error:", err)
   } else {
      fmt.Println(result)
   }
   q, r := div(13, 3)
   fmt.Println(q, r)
 
   fmt.Println(apply(
      func(a int, b int) int {
         return int(math.Pow(
            float64(a), float64(b)))
      }, 3, 4))
 
fmt.Println(sum(1, 2, 3, 4, 5))
 
 
}

四、数组
数组是值类型
[10]int和[20]int是不同类型
调用func f(arr [10]int)会拷贝数组
在go语言中一般不直接使用数组,用切片。
五、切片slice
Slice(切片)不是值类型
arr := […]int{0, 1, 2, 3, 4, 5, 6, 7}
s := arr[2:6]
s的值为[2 3 4 5]//左闭右开区间

slice可以向后扩展,不可以向前扩展
s[i]不可以超越len(s),向后扩展不可以超越底层数组cap(s)
六、map
创建:make(map[string]int)

获取元素:m[key]

key不存在时,获取Value类型的初始值

用value, ok := m[key]来判断是否存在key

Map的遍历

使用range遍历key,或者遍历key, value对

不保证遍历顺序,如需顺序,需手动对key排序

使用len获取元素个数

map的key

map使用哈希表,必须可以比较相等

除了slice,map,function的内建类型都可以作为key

Struct类型不包含上述字段,也可作为key
七、
针对包来说
名字一般使用CamelCase
首字母大写:public 公有
首字母小写:private 私有

包:
每个目录一个包
main包包含可执行入口(main 函数)
为结构定义的方法必须放在同一个包内
可以是不同的文件

八、所有库和第三方库都放在同一GOPATH下。

go bulid 编译
go install 产生pkg文件和可执行文件
go run 直接编译运行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

phpstory

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值