一、strings和strconv使用

1、strings.HasPrefix(s string,prefix string) bool :判断字符串s是否以prefix开头

2、stings.HasSuffix(s string,suffix string) bool:判断字符串s是否以suffix结尾

3、strings.Index(s string,str string) int: 判断str在s中首次出现的位置,如果没有,返回-1

4、strings.LastIndex(s string,str string) int:判断str在s中最后出现的位置,如果没有,返回-1

5、strings.Replace(str string, old string, new string, n int):字符串替换

6、strings.Count(str string, substr string)int:字符串计数

7、strings.Repeat(str string, count int)string:重复count次str

8、strings.ToLower(str string)string:转为小写

9、strings.ToUpper(str string)string:转为大写

package main

import (
"fmt"
"strings"
) //判断字符串以xx开头
func judge_prefix(str string) string {
var str_change string
if strings.HasPrefix(str, "http://") == false {
str_change = "http://" + str
}
return str_change
} //判断字符串以xx结尾
func judge_suffix(str string) string {
var str_change string
if strings.HasSuffix(str, "/") == false {
str_change = str + "/"
}
return str_change
} //字符串中s首次出现的位置,没有返回-1
func str_index(str string, show_str string) int {
result := strings.Index(str, show_str)
return result
} //字符串替换,n代表字符串出现第一次,-1表示全部替换
func replace(str string, old string, new string, n int) string {
result := strings.Replace(str, old, new, n)
return result
} //字符串中出现某字符串的次数
func count(str string, substr string) int {
result := strings.Count(str, substr)
return result
} func main() {
url := judge_prefix("baidu.com")
path := judge_suffix("go_dev")
index := str_index("llohehe", "he")
replace := replace("hellohehe", "he", "wo", -1)
count := count("hellohehe", "he")
fmt.Println("url", url)
fmt.Println("path", path)
fmt.Println("index", index)
fmt.Println("replace", replace)
fmt.Println("count", count)
}

  

strings.TrimSpace(str string):去掉字符串首尾空白字符
strings.Trim(str string, cut string):去掉字符串首尾cut字符
strings.TrimLeft(str string, cut string):去掉字符串首cut字符
strings.TrimRight(str string, cut string):去掉字符串首cut字符
strings.Field(str string):返回str空格分隔的所有子串的slice
strings.Split(str string, split string):返回str split分隔的所有子串的slice
strings.Join(s1 []string, sep string):用sep把s1中的所有元素链接起来
strconv.Itoa(i int):把一个整数i转成字符串
strconv.Atoi(str string)(int, error):把一个字符串转成整数

package main

import (
"fmt"
"strings"
"strconv"
) //去空格
func removeSpace(str string) string {
result := strings.TrimSpace(str)
return result
} //字符串首尾remove某字符
func removeStr(str string, cut string) string {
result := strings.Trim(str, cut)
return result
} func removeLeft(str string, cut string) string {
result := strings.TrimLeft(str, cut)
return result
} func main() {
removeSpace := removeSpace(" xxx ")
removeStr := removeStr("abbaaaaaaacdab", "ab")
removeLeft := removeLeft("abbacdab", "ab")
strSplit("abc,def,ghi", ",")
fmt.Println(removeSpace)
fmt.Println(removeStr)
fmt.Println(removeLeft)
splitResult := strings.Split(str,"l")
str2 = strings.Join(splitResult,"l")
str2 = strconv.Itoa(1000)
number,err := strconv.Atoi(str2)
if err != nil{
fmt.Println("can not convert to int",err)
}
}

  

时间和日期类型

1、time包

2、time.Time类型,用来表示时间

3、获取当前时间,now  :=time.Now()

4、time.Now().Day(),time.Now().Minute(),time.Now().Month(),time.Now().Year()

5、格式化,fmt.Printf(“%02d/%02d%02d %02d:%02d:%02d”, now.Year()…)

example:获取当前时间,并格式化成2018/04/07 16:09:00格式

package main

import (
"fmt"
"time"
) func main() {
now := time.Now()
fmt.Println(now.Format("2006/01/02 15:04:05"))
}

 

example:获取程序执行时间

package main

import (
"fmt"
"time"
) func test() {
time.Sleep(time.Millisecond * 100)
}
func main() {
start := time.Now().UnixNano()
test()
end := time.Now().UnixNano()
fmt.Printf("cost:%d us\n", (end-start)/1000)
}

  

指针类型

1、普通类型,变量存的就是值,也叫值类型

2、获取变量的地址,用&,比如: var a int, 获取a的地址:&a

3、指针类型,变量存的是一个地址,这个地址存的才是值

4、获取指针类型所指向的值,使用:*,比如:var *p int, 使用*p获取p指向的值

package main

import (
"fmt"
) func main() {
var a int = 10
fmt.Println(&a) var p *int //p是指针,存的是地址
p = &a // p=a的地址
*p = 100 //a的地址所指向的值赋值100
fmt.Println(a) //a输出100
}

  

流程控制

1、if / else分支判断

package main

import (
"fmt"
) func main() {
bool1 := true
if bool1 {
fmt.Printf("the value is true")
} else {
fmt.Printf("the value is false")
}
}

 

if的条件可以赋值,赋值的变量作用域就在这个if语句里

if contents, err := ioutil.ReadFile(filename); err != nil {
fmt.Println(err)
} else {
fmt.Printf("%s\n", contents)
}

example:从终端读取输入,并转成整数,如果转成整数出错,则输出错误,否则输出该整数

package main

import (
"fmt"
"strconv"
) func main() {
var str string
fmt.Scanf("%s", &str)
number, err := strconv.Atoi(str)
if err != nil {
fmt.Println("conver failed,err:", err)
return
}
fmt.Println(number)
}

  

2、switch case语法

switch var{

  case var1:

  case var2:

  case var3:

  default:

}

package main

import (
"fmt"
) func main() {
var a int = 10
switch a {
case 0:
fmt.Println("a is equal 0")
case 10:
fmt.Println("a is equal 10")
default:
fmt.Println("a is equal default")
}
}

  

fallthrough穿透执行

example:猜数字,写一个程序,随机生成一个0到100的整数n,然后用户在终端输入数字,如果和n相等,则提示用户猜对了。如果不相等,则提示用户,大于或小于n

package main

import (
"fmt"
"math/rand"
) func main() {
var n int
n = rand.Intn(100)
for {
var input int
fmt.Scanf("%d\n", &input)
flag := false
switch {
case input == n:
fmt.Println("you are right")
break
flag = true
case input > n:
fmt.Println("bigger")
case input < n:
fmt.Println("less")
}
if flag {
break
}
}
}

  

for

写法1 for 初始化语句;条件判断;变量修改

example:终端打印如下图形

A
AA
AAA
AAAA
AAAAA
package main

import (
"fmt"
) func Print(n int) {
for i := 1; i < n+1; i++ {
for j := 0; j < i; j++ {
fmt.Printf("A")
}
fmt.Println()
}
} func main() {
Print(10)
}

  

写法2:for 条件{

}

写法3:for range 语法

package main

import (
"fmt"
) func main() {
str := "hello,world,中国"
for i, v := range str {
if i > 2 {
continue
}
if i > 3 {
break
}
fmt.Printf("index[%d] val[%c] len[%d]\n", i, v, len([]byte(string(v))))
} }

  

goto和label语句

package main

import (
"fmt"
) func main() {
LABEL1:
for i := 0; i <= 5; i++ {
for j := 0; j <= 5; j++ {
if j == 4 {
continue LABEL1
}
fmt.Printf("i is:%d,and j is:%d\n", i, j)
}
}
}
package main

import (
"fmt"
) func main() {
i := 0
HERE:
fmt.Println(i)
i++
if i == 5 {
return
}
goto HERE
}

  

函数

申明语法

func 函数名  (参数列表) 返回值  { }

golang函数特点:

  不支持重载,一个包不能有两个名字一样的函数

  函数是一等公民,函数也是一种类型,一个函数可以赋值给变量

  匿名函数

  多返回值

example1:

package main

import (
"fmt"
) func add(a, b int) int {
return a + b
} func main() {
c := add //函数赋值给变量
fmt.Println(c)
sum := c(10, 20)
fmt.Println(sum)
}

  

example2:定义函数类型

package main

import (
"fmt"
) type add_func func(int, int) int func sub(a, b int) int {
return a - b
} func operator(op add_func, a, b int) int {
return op(a, b)
} func main() {
c := sub
fmt.Println(c)
sum := operator(c, 100, 200)
fmt.Println(sum)
}

  

函数参数传递方式:

  map、slice、chan、指针、interface默认引用方式传递

函数能对返回值命名

可变参数

example:支持一个或多个int相加或string拼接

func add(a int, arg ...int) int {
var sum int
sum += a
for i := 0; i < len(arg); i++ {
sum += arg[i]
}
return sum
} func content(a string, arg ...string) string {
var result string = a
for i := 0; i < len(arg); i++ {
result += arg[i]
}
return result
} func main() {
// result := add(10, 3, 4)
result := content("hello", " ", "world")
fmt.Println(result)
}

  

defer用途:

  当函数返回时,执行defer语句,用来资源清理

  多个defer,先进后出方式执行(栈)

defer在函数结束时才被执行,不合理的使用方式会浪费更多资源

案例:循环处理多个日志文件时,导致文件关闭时间延长

package main

import (
"log"
"os"
"fmt"
) func main(){
for i:=0;i<1000;i++{
path := fmt.Sprintf("./log/%d.txt",i) f,err :=os.Open(path)
if err != nil {
log.Println(err)
continue
}
defer f.Close()
}
}

关闭操作只有在main函数结束后才会执行,并不是每一次循环结束后执行

将循环和处理分离

package main

import (
"fmt"
"log"
"os"
) func main() {
do := func(n int) {
path := fmt.Sprintf("./log/%d.txt", n) f, err := os.Open(path)
if err != nil {
log.Println(err)
}
defer f.Close()
} for i := 0; i < 1000; i++ {
do(i)
}
}

  

example:关闭文件句柄

func read() {
file :=open(filename)
defer file.close()
}

  

package main

import (
"fmt"
) func test() []func() {
var s []func()
for i := 0; i < 2; i++ {
s = append(s, func() { //将多个匿名函数添加到列表
fmt.Println(i)
})
}
return s //返回匿名函数列表
} func main() {
for _, f := range test() { //迭代执行所有的匿名函数
f()
}
}

  

上述代码输出

2
2

  

添加匿名函数到列表时并未执行,当main执行这些函数时,读取得是环境变量i最后一次循环的值,i=2,内存地址一样

package main

import (
"fmt"
) func test() []func() {
var s []func()
for i := 0; i < 2; i++ {
x := i  //x每次循环都重新定义,并不是重新赋值
s = append(s, func() { //将多个匿名函数添加到列表
fmt.Println(x)
})
}
return s //返回匿名函数列表
} func main() {
for _, f := range test() { //迭代执行所有的匿名函数
f()
}
}

  

输出

0
1

  

内存地址不一样

错误处理

package main

import (
"errors"
"fmt"
"log"
) var errDivByZero = errors.New("division by zero") func div(x, y int) (n int, err error) {
if y == 0 {
return 0, errDivByZero
}
return x / y, nil
}
func main() {
z, err := div(5, 2)
if err == errDivByZero {
log.Fatalln(err)
}
fmt.Println(z)
}

  

go 学习之路(三)的更多相关文章

  1. 学习之路三十九:新手学习 - Windows API

    来到了新公司,一开始就要做个程序去获取另外一个程序里的数据,哇,挑战性很大. 经过两周的学习,终于搞定,主要还是对Windows API有了更多的了解. 文中所有的消息常量,API,结构体都整理出来了 ...

  2. Redis——学习之路三(初识redis config配置)

    我们先看看config 默认情况下系统是怎么配置的.在命令行中输入 config get *(如图) 默认情况下有61配置信息,每一个命令占两行,第一行为配置名称信息,第二行为配置的具体信息.     ...

  3. zigbee学习之路(三):按键的控制

    一.前言 通过前一次的实验,相信大家都已经对cc2530程序的编写有了一定的认识,这次我们来操作和实验的是cc2530上的按键模块. 二.原理分析 我们先来看一下按键的原理图: 根据原理图我们可以得出 ...

  4. 学习之路三十二:VS调试的简单技巧

    这段时间园子里讲了一些关于VS的快捷键以及一些配置技巧,挺好的,大家一起学习,一起进步. 这段时间重点看了一下关于VS调试技巧方面的书,在此记录一下学习的内容吧,主要还是一些比较浅显的知识. 1. 调 ...

  5. 交互原型设计软件axure rp学习之路(三)

    (三)Axure rp元件的触发事件 l  OnClick(点击时): 鼠标点击事件,除了动态面板的所有的其他元件的点击时触发.比如点击按钮. l  OnMouseEnter(鼠标移入时): 鼠标进入 ...

  6. 学习之路三十五:Android和WCF通信 - 大数据压缩后传输

    最近一直在优化项目的性能,就在前几天找到了一些资料,终于有方案了,那就是压缩数据. 一丶前端和后端的压缩和解压缩流程 二丶优点和缺点 优点:①字符串的压缩率能够达到70%-80%左右 ②字符串数量更少 ...

  7. IOS7学习之路三(UISpriteKit游戏开发SKNode)

    ios7新添加了自己的游戏开发框架UISpriteKit ,可以用此做一些2D的小游戏, 今天学习了一下SKNode的知识做一下笔记,以便以后查阅. 1.SKNode继承自UIResponder. 2 ...

  8. python学习之路 三:字符编码

    本节重点 彻底掌握字符编码之前的转换关系 掌握 python2 vs python3 上编码的区别 掌握 python2 和python3 上bytes,str 的区别 补充知识点:三元运算 ​三元运 ...

  9. react.js学习之路三

    学习react.js,知识点整理: 1.props和state: props是相对于父级来说,固定的不会改变的内容.一般会先定义一个变量,则在父级中进行引用, var user = "liu ...

  10. go语言学习之路三:切片

    前面讲了变量的有关知识,这里对于其他的数据类型就不多作介绍,(和C差不多),因此重点来讨论下切片. 一.切片是引用类型,这里要稍微介绍两个概念:值类型,构造类型和引用类型 1.值类型:是一种由类型的实 ...

随机推荐

  1. 【朝花夕拾】Android自定义View篇之(一)View绘制流程

    前言 转载请申明转自[https://www.cnblogs.com/andy-songwei/p/10955062.html]谢谢! 自定义View.多线程.网络,被认为是Android开发者必须牢 ...

  2. C语言:正负数之间取模运算(转载)

    如果 % 两边的操作数都为正数,则结果为正数或零:如果 % 两边的操作数都是负数,则结果为负数或零.C99 以前,并没有规定如果操作数中有一方为负数,模除的结果会是什么.C99 规定,如果 % 左边的 ...

  3. 【Linux】一步一步学Linux——VMware虚拟机三种网络模式详解(07)

    目录 00. 目录 01. 虚拟网络连接组件 02. 常见网络连接配置 03. 桥接模式 04. NAT 模式 05. 仅主机模式 06. 自定义模式 07. 附录 00. 目录 @ 01. 虚拟网络 ...

  4. Spring3 springMVC添加注解式WebSocket

    Spring3添加注解式WebSocket 推荐升级成spring4以后,spring4已经集成WebSocket. 由于种种原因,项目开发处于快结束的阶段了,升级成spring4不想那么麻烦,但是又 ...

  5. HDU 5527:Too Rich(DFS+贪心)***

    题目链接 题意 给出p块钱,现在要用十种硬币凑出,每种硬币有c[i]个,问最多能用多少个硬币. 思路 首先确定,对于每个硬币就是能用小的替换就不用大的. 所以,可以先把硬币尽量用小的替换,如果小的不够 ...

  6. hihoCoder 1308:搜索二·骑士问题(BFS预处理)

    题目链接 题意 中文题意. 思路 对于每一个骑士,可以先预处理出到达地图上某个点的需要走的步数,然后最后暴力枚举地图上每一个点,让三个骑士走过的距离之和最小即可. #include <bits/ ...

  7. Django项目的创建和管理

    1.主题 这部分教程主要介绍如何通过Pycharm创建.管理.运行一个Django工程.对于Django模块的相关知识大家可以参考Python社区. 2.准备环境 Django版本为2.0或更高 Py ...

  8. ajax 的简单请求,get的加法运算,post加法运算,用户登录认证

    视图函数部分 from django.shortcuts import render, HttpResponse import time from app01.models import User i ...

  9. java LineNumberReader的使用

    前段时间需要读报表打印,需求是可以从第N行读到第N行,发现百度出来的LineNumberReader方法都不怎么理想 然后就找到一篇和众百度里脱颖而出的好文章,所以分享之:   从类 的命名来看,貌似 ...

  10. 数字IC后端布局阶段对Tie-high和Tie-low Net的处理

    本文转自:自己的微信公众号<集成电路设计及EDA教程> 里面主要讲解数字IC前端.后端.DFT.低功耗设计以及验证等相关知识,并且讲解了其中用到的各种EDA工具的教程. 考虑到微信公众平台 ...