strings和strconv使用

  1. . strings.HasPrefix(s string, prefix string) bool // 判断字符串s是否以prefix开头 。
  2.  
  3. . strings.HasSuffix(s string, suffix string) bool // 判断字符串s是否以suffix结尾。
  4.  
  5. . strings.Index(s string, str string) int // 判断str在s中首次出现的位置,如果没有出现,则返回-1
  6.  
  7. . strings.LastIndex(s string, str string) int // 判断str在s中最后出现的位置,如果没有出现,则返回-1
  8.  
  9. . strings.Replace(str string, old string, new string, n int): // 字符串替换; 如果 n<0,表示全部替换
  10.  
  11. . strings.Count(str string, substr string)int // 字符串计数
  12.  
  13. . strings.Repeat(str string, count int)string // 重复count次str
  14.  
  15. . strings.ToLower(str string)string // 转为小写
  16.  
  17. . strings.ToUpper(str string)string // 转为大写
  18.  
  19. . strings.TrimSpace(str string): // 去掉字符串首尾空白字符;\n 也会去掉
  20. strings.Trim(str string, cut string): // 去掉字符串首尾cut字符
  21. func Trim(s string, cutset string) string
  22. ---> 去掉字符串s中首部以及尾部与字符串cutset中每个相匹配的字符,如:
  23. ---> s="hello yes",cutset="he",那么s的结果为:"ello yes"
  24. strings.TrimLeft(str string, cut string): // 去掉字符串首cut字符
  25. strings.TrimRight(str string, cut string): // 去掉字符串首cut字符
  26.  
  27. . strings.Field(str string): // 返回str空格分隔的所有子串的slice
  28. strings.Split(str string, split string): // 返回str split分隔的所有子串的slice
  29.  
  30. . strings.Join(s1 []string, sep string): // 用sep把s1中的所有元素链接起来
  31.  
  32. . strconv.Itoa(i int): // 把一个整数i转成字符串 <---> fmt.Sprintf("%d",str)
  33.  
  34. . strconv.Atoi(str string)(int, error): // 把一个字符串转成整数

示例代码1:

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "strings"
  6. )
  7.  
  8. func urlProcess(url string) string {
  9. result := strings.HasPrefix(url,"http://") // strings.HasPrefix(变量,匹配内容) 返回一个 bool 值
  10. if !result{
  11. url = fmt.Sprintf("http://%s",url)
  12. }
  13. return url
  14. }
  15.  
  16. func pathProcess(path string) string {
  17. result := strings.HasSuffix(path,"/") // strings.HasSuffix(变量,匹配内容) 返回一个 bool 值
  18. if !result{
  19. path = fmt.Sprintf("%s/",path)
  20. }
  21. return path
  22. }
  23.  
  24. func main (){
  25. var (
  26. url string
  27. path string
  28. )
  29.  
  30. fmt.Scanf("%s%s",&url,&path)
  31. url = urlProcess(url)
  32. path = pathProcess(path)
  33.  
  34. fmt.Println(url)
  35. fmt.Println(path)
  36.  
  37. }
  38.  
  39. // 运行结果:
  40. [root@NEO example01_string01]# go run main/main.go
  41. 10.0.0.8/login f:/learning
  42. http://10.0.0.8/login
  43. f:/learning/
  44. [root@NEO example01_string01]#

# 示例代码2:

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "strings"
  6. "strconv"
  7. )
  8.  
  9. func main(){
  10. str := " hello world abc \n"
  11.  
  12. result := strings.Replace(str,"abc","neo",) // 字符串替换
  13. fmt.Println("Replace:",result)
  14.  
  15. count := strings.Count(str,"o") // 字符串计数
  16. fmt.Println("Count:",count)
  17.  
  18. result = strings.Repeat(str,) // 把字符串重复几次、拼接到一起
  19. fmt.Println("Repeat:",result)
  20.  
  21. result = strings.ToLower(str) // 变成小写
  22. fmt.Println("ToLower:",result)
  23.  
  24. result = strings.ToUpper(str) // 变成大写
  25. fmt.Println("ToUpper:",result)
  26.  
  27. result = strings.TrimSpace(str) // 去掉字符串首尾空白字符;\n 也会去掉
  28. fmt.Println("TrimSpace:",result)
  29.  
  30. result = strings.Trim(str," \n\r") // 去掉字符串首尾 cutset 字符
  31. fmt.Println("Trim:",result)
  32.  
  33. result = strings.TrimLeft(str," \n\r") // 去掉左侧
  34. fmt.Println("TrimLeft:",result)
  35.  
  36. result = strings.TrimRight(str," \n\r") // 去掉右侧
  37. fmt.Println("TrimRight:",result)
  38.  
  39. splitResult := strings.Fields(str) // 以空格为分隔符切割字符串,返回数组
  40. for i := ; i<len(splitResult);i++ {
  41. fmt.Printf("fieldsResult[%d]=%s\n",i,splitResult[i])
  42. }
  43.  
  44. splitResult = strings.Split(str,"o") // 以"o"为分隔符切割字符串,返回数组
  45. for i := ; i<len(splitResult);i++ {
  46. fmt.Printf("splitResult[%d]=%s\n",i,splitResult[i])
  47. }
  48.  
  49. str2 := strings.Join(splitResult,"o") // 拼接字符串
  50. fmt.Println("Join:",str2)
  51.  
  52. str2 = strconv.Itoa() // 数字转字符串
  53. fmt.Println("Itoa:",str2)
  54.  
  55. num,err := strconv.Atoi(str2) // 字符串转数字;有两个返回值
  56.  
  57. if err != nil {
  58. fmt.Println("can not convert to int",err)
  59. return
  60. }
  61. fmt.Println("Atoi:",num)
  62.  
  63. }
  64.  
  65. // 编译后执行结果如下:
  66. [root@NEO project]# go build -o bin/example01_string02 go_dev/day03/example01_string02/main
  67. [root@NEO project]# bin/example01_string02
  68. Replace: hello world neo
  69.  
  70. Count:
  71. Repeat: hello world abc
  72. hello world abc
  73. hello world abc
  74.  
  75. ToLower: hello world abc
  76.  
  77. ToUpper: HELLO WORLD ABC
  78.  
  79. TrimSpace: hello world abc
  80. Trim: hello world abc
  81. TrimLeft: hello world abc
  82.  
  83. TrimRight: hello world abc
  84. fieldsResult[]=hello
  85. fieldsResult[]=world
  86. fieldsResult[]=abc
  87. splitResult[]= hell
  88. splitResult[]= w
  89. splitResult[]=rld abc
  90.  
  91. Join: hello world abc
  92.  
  93. Itoa:
  94. Atoi:
  95. [root@NEO project]#

Go中的时间和日期类型

  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()…)
  6. . time.Duration用来表示纳秒
  7. . 一些常量:
  8. const (
  9. Nanosecond Duration = * Nanosecond
  10. Microsecond = * Nanosecond
  11. Millisecond = * Microsecond
  12. Second = * Millisecond
  13. Minute = * Second
  14. Hour = * Minute
  15. )
  16. . 格式化:
  17. now := time.Now()
  18. fmt.Println(now.Format(“// ::”))
  19. fmt.Println(now.Format(“// :”))
  20. fmt.Println(now.Format(“//”))

示例3:
写一个程序,获取当前时间,并格式化成 2017/06/15 08:05:00 形式
写一个程序,统计一段代码的执行耗时,单位精确到微秒。

  1. // 示例代码如下:
  2. package main
  3.  
  4. import (
  5. "fmt"
  6. "time"
  7. )
  8.  
  9. func test_runtime(){
  10. time.Sleep(time.Millisecond * ) // 停 100 毫秒
  11. }
  12.  
  13. func main (){
  14. now := time.Now()
  15. // 方式一
  16. fmt.Printf("%02d/%02d/%02d %02d/%02d/%02d\n",now.Year(),now.Month(),now.Day(),now.Hour(),now.Minute(),now.Second())
  17.  
  18. // 方式二: time 自带一个 Format() 函数
  19. fmt.Println(now.Format("2006-01-02 15:04:05"))
  20.  
  21. start := time.Now().UnixNano() // 获取当前时间戳(纳秒级)
  22. test_runtime()
  23. end := time.Now().UnixNano()
  24.  
  25. fmt.Printf("runtime:%d us\n",(end-start)/)
  26. }
  27.  
  28. // 运行结果如下:
  29. [root@NEO example01_string03]# go run main/main.go
  30. // //
  31. -- ::
  32. runtime: us
  33. [root@NEO example01_string03]#

指针类型

  1. . 普通类型,变量存的就是值,也叫值类型
  2. . 获取变量的地址,用&,比如: var a int, 获取a的地址:&a
  3. . 指针类型,变量存的是一个地址,这个地址存的才是值
  4. . 获取指针类型所指向的值,使用:*,比如:var *p int, 使用*p获取p指向的值

示例4:
写一个程序,获取一个变量的地址,并打印到终端。
写一个函数,传入一个int类型的指针,并在函数中修改所指向的值。在main函数中调用这个函数,并把修改前后的值打印到终端,观察结果

  1. // 示例代码如下:
  2. package main
  3.  
  4. import (
  5. "fmt"
  6. )
  7.  
  8. func pointer_val(p *int){ // 该函数的参数p需要传入一个地址
  9. *p = // 修改 指针p 指向的值
  10. }
  11.  
  12. func main(){
  13. str := "hello world"
  14. fmt.Println("addr=",&str)
  15.  
  16. num :=
  17. var p *int // 声明一个 int 类型的指针;p 里面存的是地址
  18. p = &num // 给指针类型的变量赋值时,需要赋值一个地址(&变量);取出指针 p 所指向的值 ---> *p
  19. fmt.Println("p=",p)
  20. fmt.Println("pointer_val_before=",*p)
  21. pointer_val(p) // p 参数是一个地址
  22. fmt.Println("pointer_val_after=",*p)
  23. }
  24.  
  25. // 运行结果如下:
  26. [root@NEO example03_pointer01]# go run main/main.go
  27. addr= 0xc0000101e0
  28. p= 0xc0000120b0
  29. pointer_val_before=
  30. pointer_val_after=
  31. [root@NEO example03_pointer01]#

流程控制

  1. # if语句:
  2. // 1、
  3. if condition1 {
  4. }
  5.  
  6. // 2、
  7. if condition1 {
  8.  
  9. } else {
  10.  
  11. }
  12.  
  13. // 3、
  14. if condition1 {
  15.  
  16. } else if condition2 {
  17.  
  18. } else if condition3 {
  19. } else {
  20. }
  21.  
  22. # switch case 语句
  23. // 语法:
  24. switch var { // var 就变量
  25. case var1:
  26. case var2:
  27. case var3:
  28. default:
  29. }
  30.  
  31. // 形式1:
  32. var i =
  33. switch i {
  34. case :
  35. fallthrough // fallthrough 具有 穿透 的作用
  36. case :
  37. fmt.Println(“”) // go switch 的 case 后不需要加 break
  38. case ,,,:
  39. fmt.Println(“”)
  40. default:
  41. fmt.Println(“def”)
  42. }
  43.  
  44. // 形式2:
  45. var i =
  46. switch {
  47. case i > && i < :
  48. fmt.Println(“i > and i < ”)
  49. case i > && i < :
  50. fmt.Println(“i > and i < ”)
  51. default:
  52. fmt.Println(“def”)
  53. }

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

  1. // 示例代码:
  2. package main
  3.  
  4. import (
  5. "fmt"
  6. "math/rand"
  7. )
  8.  
  9. func main(){
  10. var n int
  11. n = rand.Intn() // 生成随机数
  12.  
  13. for {
  14. flag := false
  15. var input int
  16. fmt.Scanf("%d\n",&input) // %d\n --> 以 换行作为分隔符
  17.  
  18. switch {
  19. case input == n:
  20. fmt.Println("you are right")
  21. flag = true
  22. case input > n:
  23. fmt.Println("bigger")
  24. default:
  25. fmt.Println("smaller")
  26. }
  27. if flag {
  28. break
  29. }
  30. }
  31.  
  32. }

for 语句

  1. // 方式一:
  2. for 初始化语句; 条件判断; 变量修改 {
  3.  
  4. }
  5.  
  6. // 方式二:
  7. for 条件 {
  8. }
  9.  
  10. // 方式三:for range 语句 --> 用来遍历数组、slice、map、chan
  11. str := "hello world,中国"
  12. for i, v := range str { // i表示下标, v 表示值
  13. fmt.Printf("index[%d] val[%c] len[%d]\n", i, v, len([]byte(string(v)))) // len([]byte(string(v))) --> 表示字符的长度
  14. }
  15.  
  16. // 方式四:
  17. str := hello world,中国”
  18. for i, v := range str {
  19. if i > {
  20. continue
  21. }
  22. if (i > ) {
  23. break
  24. }
  25. fmt.Printf(“index[%d] val[%c] len[%d]\n”, i, v, len([]byte(string(v))))
  26. }
  27.  
  28. // 方式五:goto 和 label 语句
  29. // label语句1:
  30. package main
  31. import "fmt"
  32. func main() {
  33. LABEL1: // label语法 ---> 字符:
  34. for i := ; i <= ; i++ {
  35. for j := ; j <= ; j++ {
  36. if j == {
  37. continue LABEL1 // 会跳转到 LABEL1 处继续执行
  38. }
  39. fmt.Printf("i is: %d, and j is: %d\n", i, j)
  40. }
  41. }
  42. }
  43.  
  44. // goto label 语句2:
  45. package main
  46.  
  47. func main() {
  48. i :=
  49. HERE:
  50. print(i)
  51. i++
  52. if i == {
  53. return
  54. }
  55. goto HERE // 会跳转到 HERE 处继续执行 ; 此 goto label 实现了一个 for 循环 (只能在同一个函数中跳转)
  56. }

示例5:写一个程序,在终端打印如下图形
A
AA
AAA
AAAA
AAAAA

  1. // 示例代码如下:
  2. package main
  3.  
  4. import (
  5. "fmt"
  6. )
  7.  
  8. func print(n int) {
  9.  
  10. for i := ; i < n; i++ {
  11. for j := ; j < i; j++ {
  12. fmt.Printf("A")
  13. }
  14. fmt.Println()
  15. }
  16. }
  17.  
  18. func main() {
  19. print()
  20. }

示例6:(上述的方式三)

  1. // 示例代码:
  2. package main
  3.  
  4. import "fmt"
  5.  
  6. func main() {
  7. str := "hello world,中国"
  8. for i, v := range str { // i表示下标, v 表示值
  9. fmt.Printf("index[%d] val[%c] len[%d]\n", i, v, len([]byte(string(v)))) // len([]byte(string(v))) --> 表示字符的度
  10. }
  11. }
  12.  
  13. // 运行结果如下:
  14. [root@NEO example04_for01]# go run main/main.go
  15. index[] val[h] len[]
  16. index[] val[e] len[]
  17. index[] val[l] len[]
  18. index[] val[l] len[]
  19. index[] val[o] len[]
  20. index[] val[ ] len[]
  21. index[] val[w] len[]
  22. index[] val[o] len[]
  23. index[] val[r] len[]
  24. index[] val[l] len[]
  25. index[] val[d] len[]
  26. index[] val[,] len[]
  27. index[] val[中] len[]
  28. index[] val[国] len[]
  29. [root@NEO example04_for01]#

函数

  1. golang函数特点:
  2. // a. 不支持重载,一个包不能有两个名字一样的函数
  3. // b. 函数是一等公民,函数也是一种类型,一个函数可以赋值给变量
  4. // c. 匿名函数
  5. // d. 多返回值

示例7:自定义一种函数类型,作为参数传入另一个函数的参数

  1. package main
  2.  
  3. import "fmt"
  4.  
  5. type calc_func func(int, int) int // type --> 自定义一种类型 calc_func:calc_func 是函数类型,该类型有两个参数均为 int,返回值也是 int
  6.  
  7. func add(a int, b int) int {
  8. return a + b
  9. }
  10.  
  11. func operator(op calc_func,a int, b int) int { // op 参数为自定义的 函数类型;函数当作参数传给另一个函数
  12. return op(a,b)
  13. }
  14.  
  15. func main(){
  16. c := add
  17. fmt.Println(c) // c 是函数 add 的内存地址
  18. sum := operator(c,,)
  19. fmt.Println(sum)
  20. }
  21.  
  22. // 运行结果如下:
  23. [root@NEO example05_func01]# go run main/main.go
  24. 0x487170
  25.  
  26. [root@NEO example05_func01]#

函数参数传递方式:

  1. 1). 值传递
  2. 2). 引用传递
  3. 注意1:无论是值传递,还是引用传递,传递给函数的都是变量的副本,不过,值传递是值的拷贝。引用传递是地址的拷贝,一般来说,地址拷贝更为高效。而值拷贝取决于拷贝的对象大小,对象越大,则性能越低。
  4. 注意2mapslicechan、指针、interface默认以引用的方式传递

函数命名返回值的名字,如下:

  1. func add(a, b int) (c int) { // c 就是返回值
  2. c = a + b
  3. return
  4. }
  5.  
  6. func calc(a, b int) (sum int, avg int) {
  7. sum = a + b
  8. avg = (a +b)/
  9. return
  10. }

_ 标识符,用来忽略返回值,如下:

  1. func calc(a, b int) (sum int, avg int) {
  2. sum = a + b
  3. avg = (a +b)/
  4. return
  5. }
  6. func main() {
  7. sum, _ := calc(, )
  8. }

函数的可变参数,如下:

  1. func add(argint) int { // 0个或多个参数
  2. }
  3.  
  4. func add(a int, argint) int { // 1个或多个参数
  5. }
  6.  
  7. func add(a int, b int, argint) int { // 2个或多个参数
  8. }
  9.  
  10. // 注意:其中arg是一个slice(切片,可理解成数组/列表),我们可以通过arg[index]依次访问所有参数,通过len(arg)来判断传递参数的个数

示例8:
写一个函数add,支持1个或多个int相加,并返回相加结果
写一个函数concat,支持1个或多个string相拼接,并返回结果

  1. // 示例代码如下:
  2. package main
  3.  
  4. import "fmt"
  5.  
  6. func add(a int,arg...int) (sum int){
  7. sum += a
  8. for i := ; i < len(arg); i++{
  9. sum += arg[i]
  10. }
  11. return
  12. }
  13.  
  14. func concat(s string,arg...string)(result string){
  15. result += s
  16. for i := ; i < len(arg); i++{
  17. result += arg[i]
  18. }
  19. return
  20. }
  21.  
  22. func main(){
  23. sum := add(,)
  24. fmt.Println(sum)
  25. sum = add(,,)
  26. fmt.Println(sum)
  27.  
  28. result := concat("hello"," world")
  29. fmt.Println(result)
  30. result = concat("hello"," world"," neo")
  31. fmt.Println(result)
  32. }
  33.  
  34. // 运行结果如下:
  35. [root@NEO example05_func02]# go run main/main.go
  36.  
  37. hello world
  38. hello world neo
  39. [root@NEO example05_func02]#

函数 defer:

  1. // 1. 当函数返回时,执行defer语句。因此,可以用来做资源清理
  2. // 2. 多个defer语句,按先进后出的方式执行 (栈)
  3. // 3. defer语句中的变量,在defer声明时就决定了。

示例代码:

  1. package main
  2.  
  3. import "fmt"
  4.  
  5. func a(){
  6. i :=
  7. defer fmt.Println("func a defer",i) // 执行这个声明的时候,i 的值已经确实为0,此时语句还没有执行,该语句是在函数返的时候才执行
  8. i++
  9. fmt.Println("func a",i) // 先执行这行代码的 Println,再执行 defer 中的 Println
  10. }
  11.  
  12. func f(){
  13. for i := ; i < ; i++ {
  14. defer fmt.Println("func f defer",i) // 先执行后面的 defer 语句
  15. }
  16. }
  17.  
  18. func main(){
  19. a()
  20. f()
  21. }
  22.  
  23. // 运行结果如下:
  24. [root@NEO example05_defer]# go run main/main.go
  25. func a
  26. func a defer
  27. func f defer
  28. func f defer
  29. func f defer
  30. [root@NEO example05_defer]#
  31.  
  32. // defer用途(伪代码):
  33. // 1. 关闭文件句柄
  34.  
  35. func read() {
  36. //文件操作
  37. file := open(filename)
  38. defer file.Close()
  39. }
  40.  
  41. // 2. 锁资源释放
  42. func read() {
  43. mc.Lock()
  44. defer mc.Unlock()
  45. }
  46.  
  47. // 3. 数据库连接释放
  48. func read() {
  49. conn := openDatabase()
  50. defer conn.Close()
  51. }

示例题:

1. 编写程序,在终端输出九九乘法表。

  1. // 示例代码:
  2. package main
  3.  
  4. import "fmt"
  5.  
  6. func multi() {
  7. for i := ; i <= ; i++{
  8. for j :=; j<=i; j++ {
  9. fmt.Printf("%d*%d=%d ",j,i,i*j)
  10. }
  11. fmt.Println()
  12. }
  13. }
  14.  
  15. func main(){
  16. multi()
  17. }

2. 一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3。编程找出1000以内的所有完数。

  1. package main
  2.  
  3. import "fmt"
  4.  
  5. func perfect(n int) bool {
  6. var sum int
  7. for i :=; i < n; i++{
  8. if n%i == {
  9. sum += i // 把该数的所有因子加起来
  10. }
  11. }
  12. return n == sum
  13. }
  14.  
  15. func process(n int){
  16. for i := ; i <= n; i++{
  17. if perfect(i){
  18. fmt.Println(i)
  19. }
  20. }
  21. }
  22.  
  23. func main(){
  24. var n int
  25. fmt.Scanf("%d",&n)
  26.  
  27. process(n)
  28. }

3. 输入一个字符串,判断其是否为回文。回文字符串是指从左到右读和从右到左读完全相同的字符串。

  1. // 示例代码:
  2. package main
  3.  
  4. import "fmt"
  5.  
  6. func process(s string) bool {
  7. for i := ; i < len(s)/; i++{ // 从字符串的两边向中间靠拢
  8. if s[i] != s[len(s)--i]{
  9. return false
  10. }
  11. }
  12. return true
  13. }
  14.  
  15. func main(){
  16. var s string
  17. fmt.Scanf("%s\n",&s)
  18.  
  19. result := process(s)
  20. if result {
  21. fmt.Printf("%s is huiwen\n",s)
  22. } else {
  23. fmt.Printf("%s not huiwen\n",s)
  24. }
  25. }

4. 输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "bufio"
  6. "os"
  7. )
  8.  
  9. func count(s string) (charCount, spaceCount, numCount, otherCount int){
  10. t := []rune(s) // 转换类型
  11.  
  12. for _,v := range t {
  13. switch {
  14. case v >= 'A' && v <= 'z': // 比较是在 ASCII 中的位置数字; byte 型的只能用单引号
  15. charCount++
  16. case v == ' ':
  17. spaceCount++
  18. case v >= '' && v <= '':
  19. numCount++
  20. default:
  21. otherCount++
  22. }
  23. }
  24. return
  25. }
  26.  
  27. func main (){
  28. reader := bufio.NewReader(os.Stdin) // bufio.NewReader() 实例化一个对象;os.Stdin 标准输入
  29. result, _, err := reader.ReadLine() // 从终端读取输入;返回的第一个参数 (result) 是 []byte
  30. if err != nil {
  31. fmt.Println("Read from console err:",err)
  32. return
  33. }
  34.  
  35. fmt.Println(result)
  36.  
  37. cc, sc, nc, oc := count(string(result)) // 先把 result 转换成 string 类型
  38. fmt.Printf("word count:%d\n space count:%d\n number count:%d\n others count:%d\n",cc,sc,nc,oc)
  39. }
  40.  
  41. // byte 等同于int8,常用来处理ascii字符
  42. // rune 等同于int32,常用来处理unicode或utf-8字符
  43.  
  44. // 运行结果如下:
  45. [root@NEO example06_count]# go run main/main.go
  46. hello -=
  47. [ ]
  48. word count:
  49. space count:
  50. number count:
  51. others count:
  52. [root@NEO example06_count]#

5. 计算两个大数相加的和,这两个大数会超过int64的表示范围.

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. )
  6.  
  7. func fillZero(s string, n int)string{
  8. var res string = s
  9. for i:=; i<=n; i++{
  10. res = fmt.Sprintf("%c%s",'',res)
  11. }
  12. return res
  13. }
  14.  
  15. func plus(a string, b string) string {
  16. var index,carry,length int // index 表示从右开始的个数; carry 表示进位(相加满十进一);length 表示两个数字字符长度
  17. var str_plus string
  18.  
  19. // 长度小的在前面填充 0
  20. len1 := len(a)
  21. len2 := len(b)
  22.  
  23. if (len1== && len2==){
  24. return ""
  25. }
  26.  
  27. switch {
  28. case len1 > len2:
  29. n := len1 - len2
  30. res := fillZero(b,n)
  31. b = res
  32. length = len1
  33. case len1 < len2:
  34. n := len2 - len1
  35. res := fillZero(a,n)
  36. a = res
  37. length = len2
  38. default:
  39. length = len1
  40. }
  41.  
  42. // 各位相加
  43. for (index <= length-) {
  44. byte_a := a[length--index] - '' // 数字对应的字符 减去 '0' 字符,就是该数字的值;uint8 类型
  45. byte_b := b[length--index] - ''
  46.  
  47. sum := int(byte_a) + int(byte_b) + carry
  48.  
  49. if sum >= {
  50. carry =
  51. } else {
  52. carry =
  53. }
  54.  
  55. byte_new := (sum % ) + ''
  56. str_plus = fmt.Sprintf("%c%s",byte_new,str_plus)
  57. index++
  58. }
  59. if carry == {
  60. str_plus = fmt.Sprintf("1%s",str_plus)
  61. }
  62. return str_plus
  63. }
  64.  
  65. func main(){
  66. var a, b string
  67. fmt.Scanf("%s %s\n",&a, &b)
  68.  
  69. res_plus := plus(a,b)
  70. fmt.Println(res_plus)
  71. }

golang(3):strings和strconv使用 & 时间和日期类型 & 指针类型 & 流程控制 & 函数的更多相关文章

  1. golang中值类型/指针类型的变量区别总结

    转自:https://segmentfault.com/a/1190000012329213 值类型的变量和指针类型的变量 先声明一个结构体: type T struct { Name string ...

  2. 1、Golang基础--Go简介、环境搭建、变量、常量与iota、函数与函数高级

    1 Go语言介绍 1 golang-->Go--->谷歌公司 2009年 golang:指go语言,指的go的sdk goland:软件,ide:集成开发环境 Java写的 2 Go是静态 ...

  3. Python 日期和时间_python 当前日期时间_python日期格式化

    Python 日期和时间_python 当前日期时间_python日期格式化 Python程序能用很多方式处理日期和时间,转换日期格式是一个常见的功能. Python 提供了一个 time 和 cal ...

  4. golang基础之三-字符串,时间,流程控制,函数

    strings和strconv的使用 strings strings.HasPrefix(s string,preffix string) bool:判断字符串s是否以prefix开头 stirngs ...

  5. 19-03【golang】strings包

    golang的strings包提供了字符串操作的一系列函数.下面做个简单介绍 函数 用法 备注 Compare(a,b sring) 比较两个字符串   Contains(s, substr stri ...

  6. golang学习笔记15 golang用strings.Split切割字符串

    golang用strings.Split切割字符串 kv := strings.Split(authString, " ") if len(kv) != 2 || kv[0] != ...

  7. golang之strings

    针对golang中的字符串的介绍,提供了一些常用的函数和方法 package main import ( "fmt" "strings" ) func main ...

  8. golang结构体json格式化的时间格式

    golang结构体json格式化的时间格式 在我们开发中,经常会解析time.Time 往往前台传过来的时候,是个string 但是我们希望在结构体转成time.Time type Param str ...

  9. Go 从入门到精通(三)字符串,时间,流程控制,函数

    一.strings和strconv的使用 strings strings.HasPrefix(s string,preffix string) bool:判断字符串s是否以prefix开头 stirn ...

随机推荐

  1. 阿里云maven镜像

    <mirror> <id>nexus-aliyun</id> <mirrorOf>*</mirrorOf> <name>Nexu ...

  2. LVS分析

    概述 LVS是章文嵩博士十几年前的开源项目,已经被何如linux kernel 目录十几年了,可以说是国内最成功的kernle 开源项目, 在10多年后的今天,因为互联网的高速发展LVS得到了极大的应 ...

  3. selenium 入门(Java)

    官网:https://www.seleniumhq.org/ 下载地址:https://sites.google.com/a/chromium.org/chromedriver/downloads 华 ...

  4. 带事务管理的spring数据库动态切换

    动态切换数据源理论知识 项目中我们经常会遇到多数据源的问题,尤其是数据同步或定时任务等项目更是如此:又例如:读写分离数据库配置的系统. 1.相信很多人都知道JDK代理,分静态代理和动态代理两种,同样的 ...

  5. 阿里JAVA诊断工具Arthas的初步使用

    Arthas 是Alibaba开源的Java诊断工具,主要解决以下问题: 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? 我改的代码为什么没有执行到?难道是我没 comm ...

  6. 动态加载、移除css文件

    修改样式有通过修改class属性来更改,也可以通过动态引入外部的css文件来改变对应的样式展示. 这里就介绍动态引入.移除css文件 ///添加平板样式文件 function loadStyles() ...

  7. 安德鲁1.2Ku全下125C波(CCTV4K除外)

    闲来无事.没事挑战下难度. 前面高楼挡住了,一直没有试过125, 没想到1.2的锅能全下 机器:恐龙机dinobot4K+ 天线:安德鲁1.2ku 接送结果:除4K外所有高清 图片如下

  8. Jenkins笔录

    1.Linux下安装jdk8的方法 ,只需要一条命令就可以安装jdk: yum install java-1.8.0-openjdk* -y 执行过这条命令无需配置,直接可以使用. 2.JDK12版本 ...

  9. CnPack 开源软件项目

    Cnpack公共窗体库 ------------------------------ CnPack 2009-09-14 SVN 包,包括以下内容: 1. CnPack 组件包所有源代码.2. CnP ...

  10. ES5与ES6常用语法教程之 ③模板字符串、判断字符串是否包含其它字符串

    这部分教程我们主要讲解以下几个常用语法 模板字符串 带标签的模板字符串 判断字符串中是否包含其他字符串 给函数设置默认值 模板字符串 老式的拼接字符串方法 let dessert = '