go怎么优雅的写do while?

怎么用go写:

do something;
while(condition)

我现在是这么写的:

doSomething()
for condition() {
    doSomething()
}

感觉好难看

共 11 个回复


stevewang

for {
    DoSomething()
    if done {
        break
    }
}
# 0

fieliedie

@stevewang 谢谢,感觉这样也有点麻烦,嵌套好几层。

# 1

stevewang

LOOP:
    DoSomething()
    if !done {
        goto LOOP
    }

其实还是用for最好。

# 2

PeterRK

从条件入手,相信编译器:

    var _tk = true
    for _tk || condition() {
        _tk = false;
        dosomething();
    }

以下以GCC及一小段C为例分析:

    #include <stdbool.h>
    bool condition(void);
    void dosomething(void);
    void loop(void) {
        bool _tk = true;
        while(_tk || condition()) {
            _tk = false;
            dosomething();
        }
    }

O2优化后核心循环的指令为:

.L3:
    call    dosomething
    call    condition
    testb    %al, %al
    jne    .L3

和do-while的效果完全一样。

# 3

stevewang

不赞同另外加一个变量,因为会减弱代码可读性。

# 5

PeterRK

当然,也可以写成这样:

    for _tk := true; _tk || condition(); _tk = false {
        dosomething()
    }

这样变量作用域更小,但我个人觉得没有前一种优雅,原来的写法中新增变量在紧邻的三行中完全对齐,可读性好些。

# 6

David

@fieliedie, 其实 @stevewang 建议的 for+break 方法已经很好了,codition 所需要的额外变量都会被限定在 for block 之内可见,我用 C++ 的时候,也经常用 while(true) + break 的写法,除非 do-while 不会增加变量的可见范围(visibility)。

PS: Goto还是不要用得好,呵呵

# 8

eszerfrm

@fieliedie
這是我幫你想到的最漂亮的作法
假定你dosomething真的能包成一個函式
那就直接在for的初始階段執行一次dosomething就好

i=0
condition := true
for dosomething(); condition; {
    dosomething()

    }

func dosomething(){
}

有沒有很簡潔漂亮?

我自己實際測過的程式碼如下:

package main
import "fmt"

func main() {
	i := 0
	name:=0
	for name=dosomething(name) ; i<100 ;{
	name = dosomething(name)
	i=i+1
	}
	fmt.Println(name)
}

func dosomething(name int) int{
    name++
	return name
}

系統回報name值為101

# 10