go build 通过文件名后缀实现不同平台的条件编译操作

 更新时间:2020年12月15日 10:09:15   作者:liuliuzi_hz  
这篇文章主要介绍了go build 通过文件名后缀实现不同平台的条件编译操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

go build 可以通过标签或者文件名的后缀来提供条件编译,这里说下通过文件名的后缀来提供条件编译

文件命名约定可以在go build 包里找到详细的说明,简单来说,就是源文件包含后缀:_$GOOS.go,那么这个源文件只会在这个平台下编译,_$GOARCH.go也是如此。

这两个后缀可以结合在一起使用,但是要注意顺序:_$GOOS_$GOARCH.go,不能反过来用:_$GOARCH_$GOOS.go

例如下面截图,这些文件定义了对应不同平台下是否需要编译。

补充:Golang: 条件和循环

条件、循环要点

1、for, if后面的条件没有括号

2、if条件里也可以定义变量

3、没有while

4、switch不需要break,也可以直接switch多个条件

1. branch.go:

package main
import (
 "io/ioutil"
 "fmt"
)
// switch会自动break,除非使用fallthrough;可以swich多条件;panic()报错让程序终止
func grade(score int) string {
 g := ""
 switch {
 case score < 0 || score > 100:
  panic(fmt.Sprintf("Wrong score: %d", score))
 case score < 60:
  g = "F"
 case score < 80:
  g = "C"
 case score < 90:
  g = "B"
 case score <= 100:
  g = "A"
 //default:
 // panic(fmt.Sprintf("Wrong score: %d", score))
 }
 return g
}
func readFile(filename string) {
 contents, err := ioutil.ReadFile(filename)
 if err != nil {
  fmt.Println(err)
 } else {
  fmt.Printf("%s\n", contents)
 }
 // if的条件里可以赋值,其赋值的变量作用域就在if的block中
 if contents, err := ioutil.ReadFile(filename); err != nil {
  fmt.Println(err)
 } else {
  fmt.Printf("%s\n", contents)
 }
}
func main() {
 const filename = "abc.txt"
 readFile(filename)
 fmt.Println()
 fmt.Println(
  grade(0),
  grade(56),
  grade(82),
  grade(100),
  //grade(101), // 中断报错
  )
}

输出:

abcde
12345
hello
world
abcde
12345
hello
world
F F B A

2. loop.go:

package main
import (
 "fmt"
 "strconv"
 "os"
 "bufio"
)
// 十进制转二进制,for中省略初始条件
func convertToBin(n int) string {
 result := ""
 for ; n>0; n /= 2 {
  lsb := n % 2
  result = strconv.Itoa(lsb) + result
 }
 return result
}
// 一行行读文件,for中省略初始条件,相当于while
func printFile(filename string) {
 file, err := os.Open(filename)
 if err != nil {
  panic(err)
 }
 scanner := bufio.NewScanner(file)
 for scanner.Scan() {
  fmt.Println(scanner.Text())
 }
}
// 死循环,不要while了
func forever() {
 for {
  fmt.Println("abc")
 }
}
func main() {
 fmt.Println(
  convertToBin(5), // 101
  convertToBin(13), // 1101
  convertToBin(72387885),
  convertToBin(0),
  )
 printFile("abc.txt")
 //forever()
}

输出:

101 1101 100010100001000110100101101 
abcde
12345
hello
world

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

相关文章

  • Golang中的sync.WaitGroup用法实例

    Golang中的sync.WaitGroup用法实例

    这篇文章主要介绍了Golang中的sync.WaitGroup用法实例,WaitGroup的用途,它能够一直等到所有的goroutine执行完成,并且阻塞主线程的执行,直到所有的goroutine执行完成,需要的朋友可以参考下
    2015-07-07
  • Golang实现将中文转化为拼音

    Golang实现将中文转化为拼音

    这篇文章主要为大家详细介绍了如何通过Golang实现将中文转化为拼音功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-02-02
  • Windows下使用go语言写程序安装配置实例

    Windows下使用go语言写程序安装配置实例

    这篇文章主要介绍了Windows下使用go语言写程序安装配置实例,本文讲解了安装go语言、写go代码、生成可执行文件、批量生成可执行文件等内容,需要的朋友可以参考下
    2015-03-03
  • Go语言使用GORM操作数据库使用指南

    Go语言使用GORM操作数据库使用指南

    GORM(全称为Go Object Relational Mapping)是一个在Go语言中使用的轻量级的对象关系映射(ORM)库,本文主要为大家介绍了GORM操作数据库具体方法,需要的可以参考一下
    2023-05-05
  • 详解如何在Go中循环中使用Defer关键字示例详解

    详解如何在Go中循环中使用Defer关键字示例详解

    这篇文章主要为大家介绍了详解如何在Go中循环中使用Defer关键字示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • Go语言kube-scheduler深度剖析与开发之pod调度

    Go语言kube-scheduler深度剖析与开发之pod调度

    这篇文章主要为大家介绍了Go语言kube-scheduler深度剖析与开发,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • 几个小技巧帮你实现Golang永久阻塞

    几个小技巧帮你实现Golang永久阻塞

    Go 的运行时的当前设计,假定程序员自己负责检测何时终止一个 goroutine 以及何时终止该程序。有时候我们需要的是使程序阻塞在这一行,本文就来详细的介绍一下,感兴趣的可以了解一下
    2021-12-12
  • Go语言线程安全之互斥锁与读写锁

    Go语言线程安全之互斥锁与读写锁

    这篇文章主要介绍了Go语言线程安全之互斥锁与读写锁,互斥锁是为了并发的安全,在多个goroutine共同工作的时候,对于共享的数据十分不安全,而读写锁效率革命,使用锁的时候,安全与效率往往需要互相转换,下文详细内容,需要的小伙伴可以参考一下
    2022-02-02
  • golang如何让string转int64

    golang如何让string转int64

    这篇文章主要介绍了golang如何让string转int64问题,
    2024-02-02
  • 使用golang-unsafe包的注意事项及说明

    使用golang-unsafe包的注意事项及说明

    这篇文章主要介绍了使用golang-unsafe包的注意事项及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02

最新评论